计算机理论

计算机网络
计算机理论
计算机应用
电子商务

本类阅读TOP10

·Frontpage网页制作
·C#做的ASP.NET登錄篇
·C语言实现串行通信接口程序
·Foxpro DBF数据库转换成SQL Server 6.5表的几种方法
·企业信息化的新选择——Intranet
·动态哈夫曼编码的改进
·论计算机网络中服务的概念
·Visual C++中的开放数据库连接技术
·关于烟汽应用计算机信息技术加强企业管理的调查报告
·Solaris下PRO*C和OCI程序设计分析与比较

分类导航
演讲致辞党团范文
心得体会领导讲话
经验介绍事迹材料
总结汇报计划方案
常用范文写作指南
证券金融银行管理
债务市场保险租赁
金融研究证券投资
财务管理投资决策
财务分析融资决策
财务管理市场营销
会计审计会计审计
成本会计管理会计
CPA行业管理学
战略竞争旅游管理学
成本管理管理学理论
物流管理人力资源管理
财政税收财政政策
财税法规税务研讨
税收理论国债研究
财政研究经济学
中国经济经济学理论
新经济学产业经济
国际经济经济学相关
地方经济发展战略
国际贸易公共管理
公共政策行政管理
经济管理企业战略
管理理论市场营销
企业研究企业文化
文化类西方文化
传统文化社会学相关
艺术学美学
音乐影视
艺术理论社会学
伦理道德环境保护
人口问题农村研究
教育学历史学
教育学国学
理工科理科相关
统计学物理学
工业设计交通
土建水利学材料工程学
电子学通信学
化工计算机
计算机网络计算机理论
计算机应用电子商务
文学外国语
人物研究哲学
哲学相关思想哲学
科技哲学中国哲学
西方哲学逻辑学
政治政治相关
民族主义资本主义
社会主义马克思主义
法律行政法
法学理论司法制度
经济法民法
医学医学
临床医学药学
其他文秘
公务员考试最新资讯
考试资料复习指导
面试指南教育教学
如何测试软硬盘驱动器参数

作者:未知 来源:应用文写作网 加入时间:2005-12-29 月光软件站

一、如何测试驱动器类型
随着PC硬件的高速发展,各种应用软件对外设的要求亦不断提高,这使得有些软件的设计者在开发软件时需要对主机的配套设备进行检查,以便能更好地利用这些设备。如对处理器CPU及协处理器的检测、对驱动器的检测等等。对于上述的测试,除CPU及协处理器的测试方法已有不少文章论述过外,还很少有对驱动器测试的论述。本文将详细介绍如何测试驱动器,并给出相应的子程序源码,读者可根据需要将其变成一独立程序,也可将其加入到自己的应用程序中去。
在提供的测试驱动器子程序中,使用了DOS INT 21h 的设备管理功能调用 44XXh(IOCTL)的两个子功能:AX=4409h 和AX=440Dh。通过对What-Drv子程序的调用,可得到指定驱动器的类型。该测试子程序的调用方式为:
输入:AL=驱动器标号(A,B,C,...)
程序:CALL What-Drv
输出:CF= 0 成功
AL= 驱动器类型(提供之源码中有各种类型说明)
DS:DX= Device-Params读取参数缓冲区,共有32Bytes长度
CF= 1失败
AX=错误代码
1.测试指定驱动器状态
本子功能是测试所指定驱动器是否为单机或网络之共享状态输入:AX= 4409h
BL= 0,1,2,...(0=defult,1=A,2=B,3=C,...)
中断:INT 21h
输出:CF= 0成功
DX=返回状态(这里仅讨论DX寄存器的Bit12,在返回的参数中,DX还有其它许多状态值,本节将不在此讨论)
若Bit12=0,则为单机状态
Bit12=1,则为服务器共享状态
CF= 1失败
AX=错误代码
2.读取指定驱动器参数
本子功能将读出指定驱动器的各种参数,包括驱动器类型、文件分配表FAT大小,根目录ROOT大小,及其它BPB各种磁盘参数。本子程序仅读取驱动器类型参数。
输入:AX= 440Dh,
BL= 0,1,2,...(0=defult,1=A,2=B,3=C,...)
CX= 0860h 这里 CH=08h表示磁盘驱动器
CL=60h表示读取驱动器参数
DS∶DX=Device-Params指向读取参数缓冲区,共有32 Bytes长度
中断:INT 21h
输出:CF= 0成功
DS∶DX=缓冲区包含读出驱动器参数
CF= 1失败
AX=错误代码
3.磁盘参数区
表1为一130mm 1.2MB的软盘驱动器参数信息(共32字节长度)。
@@08a08600.GIF;表1@@
4.测试驱动器源码(程序1)
程序1:
;------------
; Check Drive Type
;Input: AL=Can be any drive letter(A,B,C..)
;Output: CF=0 Successfully
; AL=drive type will be returned as an
; ERRORLEVEL.
; DS∶DX=Pointer to parameter block
; CF=1 Failed
; all registers restored.
;-----------------
; ERRORLEVEL Result
; --------------
; -1Drive isn′t local
; 0320K/360K 130mm.drive
; 11.2M 130mm.drive
; 2720K 90mm.drive
; 3Single-density 203mm.drive
; 4Double-density 203mm.drive
; 5Hard disk
; 6Type drive
; 71.44M drive
; 8Something else
;------------;
What-drv proc near
push cx ;save registers
push bx
mov bl,al
and bl,lfh ;bl=0,1,2..
mov ax,4409h
;Check workstation /server
push bx
int 21h
pop bx
jb What-error ;Error to exit
test dh,10h ;test server?
jz What-continue
mov al,-1
jmp short What-Exit
What-continue:
mov ax,440dh
mov cx,0860h
;Get device paramters
push cs
pop ds
mov dx,offset Device-params
int 21h
jb What-error ;Error to exit
mov al,[Device-Params+1]
;Get device type
What-Exit:
clc ;Successfully flag
What-error:
pop bx ;recover registers
pop cx
retn
What-drv endp
Device-Params db 32 dup(0)
二、读取硬盘参数
硬盘是主机重要的存储设备,不同厂家,不同大小的硬盘参数均不相同。这里所说的硬盘参数是:磁头数、簇面数和扇区数。本节将给出一个读取硬盘参数的子程序(不含逻辑,即将一个大硬盘分成两个以上分区。当然读者也可修改本程序,以便能识别两个以上分区的硬盘)。在下面的程序中,将首先读取硬盘的主引导区 Master boot record,因为所有的硬盘参数都存放在里面。程序流程如下:
(1) 将指定的物理硬盘主引导区读入缓冲区
(2) 在引导区偏移地址1BEh处获取相应的硬盘参数
(3) 通过计算求得该硬盘的磁头数、簇面数和扇区数
(4) 由得到的硬盘参数求得其容量大小
Get-FdiskParam 子程序调用方式为:
输入:AL=硬盘物理ID号(80h 或 81h)
程序:CALL Get-FdiskParam
输出:CF=0成功
AX= 硬盘容量大小(Hex)
CX= 簇面数
DL=扇区数
DH=磁头数
CF=1 失败
1.硬盘分区表参数
在硬盘主引导区的1BEh位置即为硬盘分区表参数区,一个硬盘最多只能分成四个逻辑分区,每个分区参数表占10 h Bytes长度。本节为方便起见,仅设定硬盘为一个分区的情况,至于多分区情况,请读者通过修改本程序亦可获得。这里以162MB硬盘主引导区中的分区表参数为例。
@@08A08601.GIF;表2 硬盘分区表参数@@
由参数表可查出:磁头数=15,簇面数=1010,扇区数=22
2.硬盘容量计算
通过分区表的参数,还可求得硬盘的容量大小。在提供的程序中对硬盘容量的计算均按16进制方式:
硬盘容量(MB)=磁头数×簇面数×扇区数×512/1024为精简程序,笔者在计算时舍掉了许多余数(舍掉较多,仅保留整数),故此计算得来的容量与实际容量有些差异,请读者引用时注意。
3.读硬盘参数源码(程序2)
程序2:
;----------------
;Get Hard Cyls,Sector,Head,Size
;Input:AL= Fdisk ID(80h,81h)
;Output: CF= 0 successfully
;AX= Fdisk size(Hex)
;CX= Number of Cylinders
:DL= Number of Sectors
;DH= Number of Heads
;CF= 1 failed
;-------------
Get-Fdiskparamproc near
cmp al,80h ;test Fdisk ID
jb Get-FdiskExit
mov cx,cs
mov ds,cx
mov es,cx ;set DS,ES segment
mov dl,al ;Fdisk ID
mov bx,offset Partition-area
mov cx,1
mov dh,0
mov ax,201h ;read partition sector
int 13h
jb Get-FdiskExit ;failed to exit.
mov bx,offset Partiton-area+1beh
mov al,[bx+8] ;Sector counter
mov ah,[bx+5] ;Head counter
mov dl,[bx+7] ;cylinder lower
mov dh,[bx+6] ;cylinder high
mov cx,6
shr dh,cl
inc dx ;get cylinder
push dx ;save cylinder
push ax ;save head & sector
mul ah ;compute Fdisk size
mul dx
mov cx,11
Loop-shift:
shr dx,1
rcr ax,1
loop Loop-shift ;Get Fdisk size
pop dx ;sectors & heads
pop cx ;cylinder counter
clc ;clear CF flag
Get-FdiskExit:
retn
Get-FdiskParamendp
Partition-area db 512 dup(0) ;read Partition buffer  

作者:李宇 


相关文章

相关软件