·设为首页
·收藏本站  
·错误报告
您现在的位置: 首页>>理工论文>>计算机论文>>新闻

站长欢迎各位朋友投稿6366083#163.com(#换成@),本站永久免费,请各位朋友记住本站网址:www.lwen.net,别忘记介绍新朋友过来奥^_^

会员登陆
最近更新
有广告才有收入,网站才能发展。
如何测试软硬盘驱动器参数
  发表时间:2005-9-28 15:04:46  浏览人次: 我要投稿
>在提供的测试驱动器子程序中,使用了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= 4409hBL= 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 nearpush cx ;save registerspush bxmov bl,aland bl,lfh ;bl=0,1,2..mov ax,4409h;Check workstation /serverpush bxint 21hpop bxjb What-error ;Error to exittest dh,10h ;test server?jz What-continuemov al,-1jmp short What-ExitWhat-continue:mov ax,440dhmov cx,0860h;Get device paramterspush cspop dsmov dx,offset Device-paramsint 21hjb What-error ;Error to exitmov al,[Device-Params+1];Get device typeWhat-Exit:clc ;Successfully flagWhat-error:pop bx ;recover registerspop cxretnWhat-drv endpDevice-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,扇区数=222.硬盘容量计算通过分区表的参数,还可求得硬盘的容量大小。在提供的程序中对硬盘容量的计算均按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 nearcmp al,80h ;test Fdisk IDjb Get-FdiskExitmov cx,csmov ds,cxmov es,cx ;set DS,ES segmentmov dl,al ;Fdisk IDmov bx,offset Partition-areamov cx,1mov dh,0mov ax,201h ;read partition sectorint 13hjb Get-FdiskExit ;failed to exit.mov bx,offset Partiton-area+1behmov al,[bx+8] ;Sector countermov ah,[bx+5] ;Head countermov dl,[bx+7] ;cylinder lowermov dh,[bx+6] ;cylinder highmov cx,6shr dh,clinc dx ;get cylinderpush dx ;save cylinderpush ax ;save head & sectormul ah ;compute Fdisk sizemul dxmov cx,11Loop-shift:shr dx,1rcr ax,1loop Loop-shift ;Get Fdisk sizepop dx ;sectors & headspop cx ;cylinder counterclc ;clear CF flagGet-FdiskExit:retnGet-FdiskParamendpPartition-area db 512 dup(0) ;read Partition buffer 作者:李宇
文章搜索
关键字:
Copyright ©2005 - 2006 Lwen.Net      广告合作—QQ 1573351 Email:6366083#163.com(#换成@)