www.138139.cn

返回总目录 上一页 目录页 下一页

扩展int13h调用详解(修正)


    &nbsp扩展int13h调用详解(修正)
&nbsp&nbsp&nbsp&nbsp第一部分&nbsp&nbsp简&nbsp&nbsp介

一.&nbsp硬盘结构简介

&nbsp&nbsp1.&nbsp硬盘参数释疑

&nbsp&nbsp&nbsp&nbsp到目前为止,&nbsp人们常说的硬盘参数还是古老的&nbspCHS&nbsp(Cylinder/
Head/Sector)参数.&nbsp那么为什么要使用这些参数,&nbsp它们的意义是什么? 联系QQ:3149886
它们的取值范围是什么? 联系QQ:3149886
&nbsp&nbsp&nbsp&nbsp很久以前,&nbsp硬盘的容量还非常小的时候,&nbsp人们采用与软盘类似的结
构生产硬盘.&nbsp也就是硬盘盘片的每一条磁道都具有相同的扇区数.&nbsp由此
产生了所谓的3D参数&nbsp(Disk&nbspGeometry).&nbsp既磁头数(Heads),&nbsp柱面数
(Cylinders),&nbsp扇区数(Sectors),以及相应的寻址方式.

&nbsp&nbsp&nbsp&nbsp其中:

&nbsp&nbsp&nbsp&nbsp磁头数(Heads)&nbsp表示硬盘总共有几个磁头,也就是有几面盘片,&nbsp最大
为&nbsp255&nbsp(用&nbsp8&nbsp个二进制位存储);
&nbsp&nbsp&nbsp&nbsp柱面数(Cylinders)&nbsp表示硬盘每一面盘片上有几条磁道,&nbsp最大为&nbsp1023
(用&nbsp10&nbsp个二进制位存储);
&nbsp&nbsp&nbsp&nbsp扇区数(Sectors)&nbsp表示每一条磁道上有几个扇区,&nbsp最大为&nbsp63&nbsp(用&nbsp6
个二进制位存储).
&nbsp&nbsp&nbsp&nbsp每个扇区一般是&nbsp512个字节,&nbsp理论上讲这不是必须的,&nbsp但好象没有取
别的值的.

&nbsp&nbsp&nbsp&nbsp所以磁盘最大容量为:

&nbsp&nbsp&nbsp&nbsp255&nbsp*&nbsp1023&nbsp*&nbsp63&nbsp*&nbsp512&nbsp/&nbsp1048576&nbsp=&nbsp8024&nbspMB&nbsp(&nbsp1M&nbsp=&nbsp1048576&nbspBytes&nbsp)
或硬盘厂商常用的单位:
&nbsp&nbsp&nbsp&nbsp255&nbsp*&nbsp1023&nbsp*&nbsp63&nbsp*&nbsp512&nbsp/&nbsp1000000&nbsp=&nbsp8414&nbspMB&nbsp(&nbsp1M&nbsp=&nbsp1000000&nbspBytes&nbsp)

&nbsp&nbsp&nbsp&nbsp在&nbspCHS&nbsp寻址方式中,&nbsp磁头,&nbsp柱面,&nbsp扇区的取值范围分别为&nbsp0&nbsp到&nbspHeads&nbsp-&nbsp1,
&nbsp0&nbsp到&nbspCylinders&nbsp-&nbsp1,&nbsp1&nbsp到&nbspSectors&nbsp(注意是从&nbsp1&nbsp开始).

&nbsp&nbsp2.&nbsp基本&nbspInt&nbsp13H&nbsp调用简介

&nbsp&nbsp&nbsp&nbspBIOS&nbspInt&nbsp13H&nbsp调用是&nbspBIOS&nbsp提供的磁盘基本输入输出中断调用,&nbsp它可以
完成磁盘(包括硬盘和软盘)的复位,&nbsp读写,&nbsp校验,&nbsp定位,&nbsp诊断,&nbsp格式化等功能.
它使用的就是&nbspCHS&nbsp寻址方式,&nbsp因此最大识能访问&nbsp8&nbspGB&nbsp左右的硬盘&nbsp(&nbsp本文中
如不作特殊说明,&nbsp均以&nbsp1M&nbsp=&nbsp1048576&nbsp字节为单位).

&nbsp&nbsp3.&nbsp现代硬盘结构简介

&nbsp&nbsp&nbsp&nbsp在老式硬盘中,&nbsp由于每个磁道的扇区数相等,&nbsp所以外道的记录密度要远低
于内道,&nbsp因此会浪费很多磁盘空间&nbsp(与软盘一样).&nbsp为了解决这一问题,&nbsp进一
步提高硬盘容量,&nbsp人们改用等密度结构生产硬盘.&nbsp也就是说,&nbsp外圈磁道的扇区
比内圈磁道多.&nbsp采用这种结构后,&nbsp硬盘不再具有实际的3D参数,&nbsp寻址方式也改
为线性寻址,&nbsp即以扇区为单位进行寻址.
&nbsp&nbsp&nbsp&nbsp为了与使用3D寻址的老软件兼容&nbsp(如使用BIOS&nbspInt13H接口的软件),&nbsp在硬
盘控制器内部安装了一个地址翻译器,&nbsp由它负责将老式3D参数翻译成新的线性
参数.&nbsp这也是为什么现在硬盘的3D参数可以有多种选择的原因&nbsp(不同的工作模
式,&nbsp对应不同的3D参数,&nbsp如&nbspLBA,&nbspLARGE,&nbspNORMAL).

&nbsp&nbsp4.&nbsp扩展&nbspInt&nbsp13H&nbsp简介

&nbsp&nbsp&nbsp&nbsp虽然现代硬盘都已经采用了线性寻址,&nbsp但是由于基本&nbspInt&nbsp13H&nbsp的制约,&nbsp使
用&nbspBIOS&nbspInt&nbsp13H&nbsp接口的程序,&nbsp如&nbspDOS&nbsp等还只能访问&nbsp8&nbspG&nbsp以内的硬盘空间.
为了打破这一限制,&nbspMicrosoft&nbsp等几家公司制定了扩展&nbspInt&nbsp13H&nbsp标准
(Extended&nbspInt13H),&nbsp采用线性寻址方式存取硬盘,&nbsp所以突破了&nbsp8&nbspG&nbsp的限制,
而且还加入了对可拆卸介质&nbsp(如活动硬盘)&nbsp的支持.

二.&nbspBoot&nbspSector&nbsp结构简介

&nbsp&nbsp1.&nbspBoot&nbspSector&nbsp的组成

&nbsp&nbsp&nbsp&nbspBoot&nbspSector&nbsp也就是硬盘的第一个扇区,&nbsp它由&nbspMBR&nbsp(Master&nbspBoot&nbspRecord),
DPT&nbsp(Disk&nbspPartition&nbspTable)&nbsp和&nbspBoot&nbspRecord&nbspID&nbsp&nbsp三部分组成.

&nbsp&nbsp&nbsp&nbspMBR&nbsp又称作主引导记录占用&nbspBoot&nbspSector&nbsp的前&nbsp446&nbsp个字节&nbsp(&nbsp0&nbspto&nbsp0x1BD&nbsp),
存放系统主引导程序&nbsp(它负责从活动分区中装载并运行系统引导程序).
&nbsp&nbsp&nbsp&nbspDPT&nbsp即主分区表占用&nbsp64&nbsp个字节&nbsp(0x1BE&nbspto&nbsp0x1FD),&nbsp记录了磁盘的基本分区
信息.&nbsp主分区表分为四个分区项,&nbsp每项&nbsp16&nbsp字节,&nbsp分别记录了每个主分区的信息
(因此最多可以有四个主分区).
&nbsp&nbsp&nbsp&nbspBoot&nbspRecord&nbspID&nbsp即引导区标记占用两个字节&nbsp(0x1FE&nbspand&nbsp0x1FF),&nbsp对于合法
引导区,&nbsp它等于&nbsp0xAA55,&nbsp这是判别引导区是否合法的标志.
&nbsp&nbsp&nbsp&nbspBoot&nbspSector&nbsp的具体结构如下图所示&nbsp(参见&nbspNightOwl&nbsp大侠的文章):
&nbsp
  520) this.width=520;" src=/upload/article/a2005012811202113.jpg>
           

&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp2.&nbsp分区表结构简介
&nbsp&nbsp&nbsp&nbsp分区表由四个分区项构成,&nbsp每一项的结构如下:
&nbsp&nbsp&nbsp&nbspBYTE&nbspState&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp:&nbsp分区状态,&nbsp0&nbsp=&nbsp未激活,&nbsp0x80&nbsp=&nbsp激活&nbsp(注意此项)
&nbsp&nbsp&nbsp&nbspBYTE&nbspStartHead&nbsp&nbsp&nbsp:&nbsp分区起始磁头号
&nbsp&nbsp&nbsp&nbspWORD&nbspStartSC&nbsp&nbsp&nbsp&nbsp&nbsp:&nbsp分区起始扇区和柱面号,&nbsp底字节的低6位为扇区号,
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp高2位为柱面号的第&nbsp9,10&nbsp位,&nbsp高字节为柱面号的低&nbsp8&nbsp位
&nbsp&nbsp&nbsp&nbspBYTE&nbspType&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp:&nbsp分区类型,&nbsp如&nbsp0x0B&nbsp=&nbspFAT32,&nbsp0x83&nbsp=&nbspLinux&nbsp等,
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp00&nbsp表示此项未用
&nbsp&nbsp&nbsp&nbspBYTE&nbspEndHead&nbsp&nbsp&nbsp&nbsp&nbsp:&nbsp分区结束磁头号
&nbsp&nbsp&nbsp&nbspWORD&nbspEndSC&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp:&nbsp分区结束扇区和柱面号,&nbsp定义同前
&nbsp&nbsp&nbsp&nbspDWORD&nbspRelative&nbsp&nbsp&nbsp:&nbsp在线性寻址方式下的分区相对扇区地址
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(对于基本分区即为绝对地址)
&nbsp&nbsp&nbsp&nbspDWORD&nbspSectors&nbsp&nbsp&nbsp&nbsp:&nbsp分区大小&nbsp(总扇区数)

&nbsp&nbsp&nbsp&nbsp注意:&nbsp在&nbspDOS&nbsp/&nbspWindows&nbsp系统下,&nbsp基本分区必须以柱面为单位划分
(&nbspSectors&nbsp*&nbspHeads&nbsp个扇区),&nbsp如对于&nbspCHS&nbsp为&nbsp764/255/63&nbsp的硬盘,&nbsp分区的
最小尺寸为&nbsp&nbsp255&nbsp*&nbsp63&nbsp*&nbsp512&nbsp/&nbsp1048576&nbsp=&nbsp7.844&nbspMB.

&nbsp&nbsp3.&nbsp扩展分区简介

&nbsp&nbsp&nbsp&nbsp由于主分区表中只能分四个分区,&nbsp无法满足需求,&nbsp因此设计了一种扩展
分区格式.&nbsp基本上说,&nbsp扩展分区的信息是以链表形式存放的,&nbsp但也有一些特
别的地方.
&nbsp&nbsp&nbsp&nbsp首先,&nbsp主分区表中要有一个基本扩展分区项,&nbsp所有扩展分区都隶属于它,
也就是说其他所有扩展分区的空间都必须包括在这个基本扩展分区中.&nbsp对于
DOS&nbsp/&nbspWindows&nbsp来说,&nbsp扩展分区的类型为&nbsp0x05或0x0F(>8GB).
&nbsp&nbsp&nbsp&nbsp除基本扩展分区以外的其他所有扩展分区则以链表的形式级联存放,&nbsp后
一个扩展分区的数据项记录在前一个扩展分区的分区表中,&nbsp但两个扩展分区
的空间并不重叠.
&nbsp&nbsp&nbsp&nbsp扩展分区类似于一个完整的硬盘,&nbsp必须进一步分区才能使用.&nbsp但每个扩
展分区中只能存在一个其他分区.&nbsp此分区在&nbspDOS/Windows&nbsp环境中即为逻辑盘.
因此每一个扩展分区的分区表&nbsp(同样存储在扩展分区的第一个扇区中)中最多
只能有两个分区数据项(包括下一个扩展分区的数据项).
&nbsp&nbsp&nbsp&nbsp扩展分区和逻辑盘的示意图如下:
&nbsp
     520) this.width=520;" src=/upload/article/a2005012811230177.jpg>


&nbsp&nbsp
三.&nbsp系统启动过程简介

&nbsp&nbsp&nbsp&nbsp系统启动过程主要由一下几步组成(以硬盘启动为例):

&nbsp&nbsp&nbsp&nbsp1.&nbsp开机&nbsp:-)
&nbsp&nbsp&nbsp&nbsp2.&nbspBIOS&nbsp加电自检&nbsp(&nbspPower&nbspOn&nbspSelf&nbspTest&nbsp--&nbspPOST&nbsp)
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp内存地址为&nbsp0ffff:0000
&nbsp&nbsp&nbsp&nbsp3.&nbsp将硬盘第一个扇区&nbsp(0头0道1扇区,&nbsp也就是Boot&nbspSector)
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp读入内存地址&nbsp0000:7c00&nbsp处.
&nbsp&nbsp&nbsp&nbsp4.&nbsp检查&nbsp(WORD)&nbsp0000:7dfe&nbsp是否等于&nbsp0xaa55,&nbsp若不等于
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp则转去尝试其他启动介质,&nbsp如果没有其他启动介质则显示
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp"No&nbspROM&nbspBASIC"&nbsp然后死机.
&nbsp&nbsp&nbsp&nbsp5.&nbsp跳转到&nbsp0000:7c00&nbsp处执行&nbspMBR&nbsp中的程序.
&nbsp&nbsp&nbsp&nbsp6.&nbspMBR&nbsp首先将自己复制到&nbsp0000:0600&nbsp处,&nbsp然后继续执行.
&nbsp&nbsp&nbsp&nbsp7.&nbsp在主分区表中搜索标志为活动的分区.&nbsp如果发现没有活动
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp分区或有不止一个活动分区,&nbsp则转停止.
&nbsp&nbsp&nbsp&nbsp8.&nbsp将活动分区的第一个扇区读入内存地址&nbsp0000:7c00&nbsp处.
&nbsp&nbsp&nbsp&nbsp9.&nbsp检查&nbsp(WORD)&nbsp0000:7dfe&nbsp是否等于&nbsp0xaa55,&nbsp若不等于则

&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp显示&nbsp"Missing&nbspOperating&nbspSystem"&nbsp然后停止,&nbsp或尝试
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp软盘启动.
&nbsp&nbsp&nbsp&nbsp10.&nbsp跳转到&nbsp0000:7c00&nbsp处继续执行特定系统的启动程序.
&nbsp&nbsp&nbsp&nbsp11.&nbsp启动系统&nbsp...

&nbsp&nbsp&nbsp&nbsp以上步骤中&nbsp2,3,4,5&nbsp步是由&nbspBIOS&nbsp的引导程序完成.&nbsp6,7,8,9,10
步由MBR中的引导程序完成.

&nbsp&nbsp&nbsp&nbsp一般多系统引导程序&nbsp(如&nbspSmartFDISK,&nbspBootStar,&nbspPQBoot&nbsp等)
都是将标准主引导记录替换成自己的引导程序,&nbsp在运行系统启动程序
之前让用户选择要启动的分区.
&nbsp&nbsp&nbsp&nbsp而某些系统自带的多系统引导程序&nbsp(如&nbsplilo,&nbspNT&nbspLoader&nbsp等)
则可以将自己的引导程序放在系统所处分区的第一个扇区中,&nbsp在&nbspLinux
中即为&nbspSuperBlock&nbsp(其实&nbspSuperBlock&nbsp是两个扇区).

&nbsp&nbsp&nbsp&nbsp注:&nbsp以上各步骤中使用的是标准&nbspMBR,&nbsp其他多系统引导程序的引导
过程与此不同.


&nbsp&nbsp&nbsp&nbsp第二部分&nbsp技术资料

第一章&nbsp扩展&nbspInt13H&nbsp技术资料

一.&nbsp简介
&nbsp&nbsp&nbsp&nbsp设计扩展&nbspInt13H&nbsp接口的目的是为了扩展&nbspBIOS&nbsp的功能,&nbsp使其支持
多于1024柱面的硬盘,&nbsp以及可移动介质的琐定,&nbsp解锁及弹出等功能.

二.&nbsp数据结构

1.&nbsp数据类型约定
&nbsp&nbsp&nbsp&nbspBYTE&nbsp&nbsp&nbsp&nbsp1&nbsp字节整型&nbsp(&nbsp&nbsp8&nbsp位&nbsp)
&nbsp&nbsp&nbsp&nbspWORD&nbsp&nbsp&nbsp&nbsp2&nbsp字节整型&nbsp(&nbsp16&nbsp位&nbsp)
&nbsp&nbsp&nbsp&nbspDWORD&nbsp&nbsp&nbsp4&nbsp字节整型&nbsp(&nbsp32&nbsp位&nbsp)
&nbsp&nbsp&nbsp&nbspQWORD&nbsp&nbsp&nbsp8&nbsp字节整型&nbsp(&nbsp64&nbsp位&nbsp)

2.&nbsp磁盘地址数据包&nbspDisk&nbspAddress&nbspPacket&nbsp(DAP)
&nbsp&nbsp&nbsp&nbspDAP&nbsp是基于绝对扇区地址的,&nbsp因此利用&nbspDAP,&nbspInt13H&nbsp可以轻松地逾
越&nbsp1024&nbsp柱面的限制,&nbsp因为它根本就不需要&nbspCHS&nbsp的概念.
&nbsp&nbsp&nbsp&nbspDAP&nbsp的结构如下:

&nbsp&nbsp&nbsp&nbspstruct&nbspDiskAddressPacket
&nbsp&nbsp&nbsp&nbsp{
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspBYTE&nbspPacketSize;&nbsp&nbsp&nbsp&nbsp&nbsp//&nbsp数据包尺寸:
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp//(固定值,恒等于16,即10H,指本结构所占用的存储空间)&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspBYTE&nbspReserved;&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp//&nbsp==0
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspWORD&nbspBlockCount;&nbsp&nbsp&nbsp&nbsp&nbsp//&nbsp要传输的数据块个数(以扇区为单位)
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspDWORD&nbspBufferAddr;&nbsp&nbsp&nbsp&nbsp//&nbsp传输缓冲地址(segment:offset)
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspQWORD&nbspBlockNum;&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp//&nbsp磁盘起始绝对块地址
&nbsp&nbsp&nbsp&nbsp};

&nbsp&nbsp&nbsp&nbspPacketSize&nbsp保存了&nbspDAP&nbsp结构的尺寸,&nbsp以便将来对其进行扩充.&nbsp在
目前使用的扩展&nbspInt13H&nbsp版本中&nbspPacketSize&nbsp恒等于&nbsp16.&nbsp如果它小于
16,&nbsp扩展&nbspInt13H&nbsp将返回错误码(&nbspAH=01,&nbspCF=1&nbsp).
&nbsp&nbsp&nbsp&nbspBlockCount&nbsp对于输入来说是需要传输的数据块总数,&nbsp对于输出来说
是实际传输的数据块个数.&nbspBlockCount&nbsp=&nbsp0&nbsp表示不传输任何数据块.
&nbsp&nbsp&nbsp&nbspBufferAddr&nbsp是传输数据缓冲区的&nbsp32&nbsp位地址&nbsp(段地址:偏移量).&nbsp数据
缓冲区必须位于常规内存以内(1M).
&nbsp&nbsp&nbsp&nbspBlockNum&nbsp表示的是从磁盘开始算起的绝对块地址(以扇区为单位),
与分区无关.&nbsp第一个块地址为&nbsp0.&nbsp一般来说,&nbspBlockNum&nbsp与&nbspCHS&nbsp地址的关系
是:
&nbsp&nbsp&nbsp&nbspBlockNum&nbsp=&nbsp
(cylinder&nbsp*&nbspNumberOfHeads&nbsp+&nbsphead)&nbsp*&nbspSectorsPerTrack&nbsp+&nbspsector&nbsp-&nbsp1;

&nbsp&nbsp&nbsp&nbsp其中&nbspcylinder,&nbsphead,&nbspsector&nbsp是&nbspCHS&nbsp地址,&nbspNumberOfHeads&nbsp是磁盘
的磁头数,&nbspSectorsPerTrack&nbsp是磁盘每磁道的扇区数.
&nbsp&nbsp&nbsp&nbsp也就是说&nbspBlockNum&nbsp是沿着&nbsp扇区->磁道->柱面&nbsp的顺序记数的.&nbsp这一顺
序是由磁盘控制器虚拟的,&nbsp磁盘表面数据块的实际排列顺序可能与此不同
(如为了提高磁盘速度而设置的间隔因子将会打乱扇区的排列顺序).

3.&nbsp驱动器参数数据包&nbspDrive&nbspParameters&nbspPacket
&nbsp&nbsp&nbsp驱动器参数数据包是在扩展&nbspInt13H&nbsp的取得驱动器参数子功能调用中
使用的数据包.&nbsp格式如下:
&nbsp

&nbsp&nbsp&nbsp&nbspstruct&nbspDriveParametersPacket
&nbsp&nbsp&nbsp&nbsp{
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspWORD&nbspInfoSize;&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp//&nbsp数据包尺寸:
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp//(固定值,等于26,即1AH,指本结构所占用的存储空间)
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspWORD&nbspFlags;&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp//&nbsp信息标志
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspDWORD&nbspCylinders;&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp//&nbsp磁盘柱面数
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspDWORD&nbspHeads;&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp//&nbsp磁盘磁头数
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspDWORD&nbspSectorsPerTrack;&nbsp&nbsp//&nbsp每磁道扇区数
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspQWORD&nbspSectors;&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp//&nbsp磁盘总扇区数
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspWORD&nbspSectorSize;&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp//&nbsp扇区尺寸&nbsp(以字节为单位)
&nbsp&nbsp&nbsp&nbsp};
&nbsp&nbsp&nbsp&nbsp信息标志用于返回磁盘的附加信息,&nbsp每一位的定义如下:

&nbsp&nbsp&nbsp&nbsp0&nbsp位:
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp0&nbsp=&nbsp可能发生&nbspDMA&nbsp边界错误
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp1&nbsp=&nbspDMA&nbsp边界错误将被透明处理
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp如果这位置&nbsp1,&nbsp表示&nbspBIOS&nbsp将自动处理&nbspDMA&nbsp边界错误,&nbsp也就是说
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp错误代码&nbsp09H&nbsp永远也不会出现.

&nbsp&nbsp&nbsp&nbsp1&nbsp位:
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp0&nbsp=&nbsp未提供&nbspCHS&nbsp信息
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp1&nbsp=&nbspCHS&nbsp信息合法
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp如果块设备的传统&nbspCHS&nbsp几何信息不适当的话,&nbsp该位将置&nbsp0.

&nbsp&nbsp&nbsp&nbsp2&nbsp位:
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp0&nbsp=&nbsp驱动器不可移动
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp1&nbsp=&nbsp驱动器可移动

&nbsp&nbsp&nbsp&nbsp3&nbsp位:&nbsp表示该驱动器是否支持写入时校验.

&nbsp&nbsp&nbsp&nbsp4&nbsp位:
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp0&nbsp=&nbsp驱动器不具备介质更换检测线
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp1&nbsp=&nbsp驱动器具备介质更换检测线


&nbsp&nbsp&nbsp&nbsp5&nbsp位:
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp0&nbsp=&nbsp驱动器不可锁定
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp1&nbsp=&nbsp驱动器可以锁定
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp要存取驱动器号大于&nbsp0x80&nbsp的可移动驱动器,&nbsp该位必须置&nbsp1
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(某些驱动器号为&nbsp0&nbsp到&nbsp0x7F&nbsp的设备也需要置位)

&nbsp&nbsp&nbsp&nbsp6&nbsp位:
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp0&nbsp=&nbspCHS&nbsp值是当前存储介质的值&nbsp(仅对于可移动介质),&nbsp如果
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp驱动器中有存储介质,&nbspCHS&nbsp值将被返回.
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp1&nbsp=&nbspCHS&nbsp值是驱动器支持的最大值&nbsp(此时驱动器中没有介质).

&nbsp&nbsp&nbsp&nbsp7&nbsp-&nbsp15&nbsp位:&nbsp保留,&nbsp必须置&nbsp0.

三.&nbsp接口规范

1.&nbsp寄存器约定
&nbsp&nbsp&nbsp&nbsp在扩展&nbspInt13H&nbsp调用中一般使用如下寄存器约定:

&nbsp&nbsp&nbsp&nbspds:si&nbsp==>&nbsp磁盘地址数据包(&nbspdisk&nbspaddress&nbsppacket&nbsp)
&nbsp&nbsp&nbsp&nbspdl&nbsp&nbsp&nbsp&nbsp==>&nbsp驱动器号
&nbsp&nbsp&nbsp&nbspah&nbsp&nbsp&nbsp&nbsp==>&nbsp功能代码&nbsp/&nbsp返回码

&nbsp&nbsp&nbsp&nbsp在基本&nbspInt13H&nbsp调用中,&nbsp0&nbsp-&nbsp0x7F&nbsp之间的驱动器号代表可移动驱动器
0x80&nbsp-&nbsp0xFF&nbsp之间的驱动器号代表固定驱动器.&nbsp但在扩展&nbspInt13H&nbsp调用中
0x80&nbsp-&nbsp0xFF&nbsp之间还包括一些新出现的可移动驱动器,&nbsp比如活动硬盘等.
这些驱动器支持先进的锁定,解锁等功能.
&nbsp&nbsp&nbsp&nbspah&nbsp返回的错误码除了标准&nbspInt13H&nbsp调用规定的基本错误码以外,又增加
了以下错误码:

&nbsp&nbsp&nbspB0h&nbsp&nbsp&nbsp驱动器中的介质未被锁定

&nbsp&nbsp&nbspB1h&nbsp&nbsp&nbsp驱动器中的介质已经锁定

&nbsp&nbsp&nbspB2h&nbsp&nbsp&nbsp介质是可移动的

&nbsp&nbsp&nbspB3h&nbsp&nbsp&nbsp介质正在被使用

&nbsp&nbsp&nbspB4h&nbsp&nbsp&nbsp锁定记数溢出

&nbsp&nbsp&nbspB5h&nbsp&nbsp&nbsp合法的弹出请求失败

2.&nbspAPI&nbsp子集介绍
&nbsp&nbsp&nbsp1.x&nbsp版的扩展&nbspInt13H&nbsp调用中规定了两个主要的&nbspAPI&nbsp子集.

&nbsp&nbsp&nbsp第一个子集提供了访问大硬盘所必须的功能,&nbsp包括&nbsp检查扩展&nbspIn13H
是否存在(&nbsp41h&nbsp),&nbsp扩展读(&nbsp42h&nbsp),&nbsp扩展写(&nbsp43h&nbsp),&nbsp校验扇区(&nbsp44h&nbsp),
扩展定位(&nbsp47h&nbsp)&nbsp和&nbsp取得驱动器参数(&nbsp48h&nbsp).
&nbsp&nbsp&nbsp第二个子集提供了对软件控制驱动器锁定和弹出的支持,&nbsp包括&nbsp检查扩展
Int13H&nbsp是否存在(&nbsp41h&nbsp),&nbsp锁定/解锁驱动器(&nbsp45h&nbsp),&nbsp弹出驱动器(&nbsp46h&nbsp),
取得驱动器参数(&nbsp48h&nbsp),&nbsp取得扩展驱动器改变状态(&nbsp49h&nbsp),&nbspint&nbsp15h.
&nbsp&nbsp&nbsp如果使用了调用规范中不支持的功能,&nbspBIOS&nbsp将返回错误码&nbspah&nbsp=&nbsp01h,
CF&nbsp=&nbsp1.

3.&nbspAPI&nbsp详解

1)&nbsp检验扩展功能是否存在
入口:
&nbsp&nbsp&nbsp&nbspAH&nbsp=&nbsp41h
&nbsp&nbsp&nbsp&nbspBX&nbsp=&nbsp55AAh
&nbsp&nbsp&nbsp&nbspDL&nbsp=&nbsp驱动器号

返回:
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp0
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspAH&nbsp=&nbsp扩展功能的主版本号
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspAL&nbsp=&nbsp内部使用
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspBX&nbsp=&nbspAA55h
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspCX&nbsp=&nbspAPI&nbsp子集支持位图
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp1
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspAH&nbsp=&nbsp错误码&nbsp01h,&nbsp无效命令

&nbsp&nbsp&nbsp&nbsp这个调用检验对特定的驱动器是否存在扩展功能.&nbsp如果进位标志置&nbsp1
则此驱动器不支持扩展功能.&nbsp如果进位标志为&nbsp0,&nbsp同时&nbspBX&nbsp=&nbspAA55h,&nbsp则
存在扩展功能.&nbsp此时&nbspCX&nbsp的&nbsp0&nbsp位表示是否支持第一个子集,&nbsp1位表示是否
支持第二个子集.
&nbsp&nbsp&nbsp&nbsp对于&nbsp1.x&nbsp版的扩展&nbspInt13H&nbsp来说,&nbsp主版本号&nbspAH&nbsp=&nbsp1.&nbspAL&nbsp是副版本号,
但这仅限于&nbspBIOS&nbsp内部使用,&nbsp任何软件不得检查&nbspAL&nbsp的值.

2)&nbsp扩展读
入口:
&nbsp&nbsp&nbsp&nbspAH&nbsp=&nbsp42h
&nbsp&nbsp&nbsp&nbspDL&nbsp=&nbsp驱动器号
&nbsp&nbsp&nbsp&nbspDS:DI&nbsp=&nbsp磁盘地址数据包(Disk&nbspAddress&nbspPacket)

返回:
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp0,&nbspAH&nbsp=&nbsp0&nbsp成功
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp1,&nbspAH&nbsp=&nbsp错误码

&nbsp&nbsp&nbsp&nbsp这个调用将磁盘上的数据读入内存.&nbsp如果出现错误,&nbspDAP&nbsp的&nbspBlockCount
项中则记录了出错前实际读取的数据块个数.

3)&nbsp扩展写
入口:
&nbsp&nbsp&nbsp&nbspAH&nbsp=&nbsp43h
&nbsp&nbsp&nbsp&nbspAL
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp0&nbsp位&nbsp=&nbsp0&nbsp关闭写校验
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp1&nbsp打开写校验
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp1&nbsp-&nbsp7&nbsp位保留,&nbsp置&nbsp0
&nbsp&nbsp&nbsp&nbspDL&nbsp=&nbsp驱动器号
&nbsp&nbsp&nbsp&nbspDS:DI&nbsp=&nbsp磁盘地址数据包(DAP)
返回:
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp0,&nbspAH&nbsp=&nbsp0&nbsp成功
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp1,&nbspAH&nbsp=&nbsp错误码

&nbsp&nbsp&nbsp&nbsp这个调用将内存中的数据写入磁盘.&nbsp如果打开了写校验选项,&nbsp但&nbspBIOS
不支持,&nbsp则会返回错误码&nbspAH&nbsp=&nbsp01h,&nbspCF&nbsp=&nbsp1.&nbsp功能&nbsp48h&nbsp可以检测BIOS是否
支持写校验.
&nbsp&nbsp&nbsp&nbsp如果出现错误,&nbspDAP&nbsp的&nbspBlockCount&nbsp项中则记录了出错前实际写入的数
据块个数.

4)&nbsp校验扇区
入口:
&nbsp&nbsp&nbsp&nbspAH&nbsp=&nbsp44h
&nbsp&nbsp&nbsp&nbspDL&nbsp=&nbsp驱动器号
&nbsp&nbsp&nbsp&nbspDS:DI&nbsp=&nbsp磁盘地址数据包(Disk&nbspAddress&nbspPacket)

返回:
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp0,&nbspAH&nbsp=&nbsp0&nbsp成功
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp1,&nbspAH&nbsp=&nbsp错误码


&nbsp&nbsp&nbsp&nbsp这个调用校验磁盘数据,&nbsp但并不将数据读入内存.如果出现错误,&nbspDAP&nbsp的
BlockCount&nbsp项中则记录了出错前实际校验的数据块个数.

5)&nbsp锁定/解锁驱动器
入口:
&nbsp&nbsp&nbsp&nbspAH&nbsp=&nbsp45h
&nbsp&nbsp&nbsp&nbspAL
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp=&nbsp0&nbsp锁定驱动器
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp=&nbsp1&nbsp驱动器解锁
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp=&nbsp02&nbsp返回锁定/解锁状态
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp=&nbsp03h-FFh&nbsp-&nbsp保留
&nbsp&nbsp&nbsp&nbspDL&nbsp=&nbsp驱动器号

返回:
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp0,&nbspAH&nbsp=&nbsp0&nbsp成功
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp1,&nbspAH&nbsp=&nbsp错误码

&nbsp&nbsp&nbsp&nbsp这个调用用来缩定指定驱动器中的介质.
&nbsp&nbsp&nbsp&nbsp所有标号大于等于&nbsp0x80&nbsp的可移动驱动器必须支持这个功能.&nbsp如果
在支持可移动驱动器控制功能子集的固定驱动器上使用这个功能调用,&nbsp将
会成功返回.
&nbsp&nbsp&nbsp&nbsp驱动器必须支持最大255次锁定,&nbsp在所有锁定被解锁之前,&nbsp不能在物理上
将驱动器解锁.&nbsp解锁一个未锁定的驱动器,将返回错误码&nbspAH=&nbspB0h.&nbsp如果锁定一
个已锁定了255次的驱动器,&nbsp将返回错误码&nbspAH&nbsp=&nbspB4h.
&nbsp&nbsp&nbsp&nbsp锁定一个没有介质的驱动器是合法的.

6)&nbsp弹出可移动驱动器中的介质
入口:
&nbsp&nbsp&nbsp&nbspAH&nbsp=&nbsp46h
&nbsp&nbsp&nbsp&nbspAL&nbsp=&nbsp0&nbsp保留
&nbsp&nbsp&nbsp&nbspDL&nbsp=&nbsp驱动器号

返回:
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp0,&nbspAH&nbsp=&nbsp0&nbsp成功
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp1,&nbspAH&nbsp=&nbsp错误码

&nbsp&nbsp&nbsp&nbsp这个调用用来弹出指定的可移动驱动器中的介质.
&nbsp&nbsp&nbsp&nbsp所有标号大于等于&nbsp0x80&nbsp的可移动驱动器必须支持这个功能.&nbsp如果
在支持可移动驱动器控制功能子集的固定驱动器上使用这个功能调用,&nbsp将
会返回错误码&nbspAH&nbsp=&nbspB2h&nbsp(介质不可移动).&nbsp如果试图弹出一个被锁定的介质
将返回错误码&nbspAH&nbsp=&nbspB1h&nbsp(介质被锁定).
&nbsp&nbsp&nbsp&nbsp如果试图弹出一个没有介质的驱动器,&nbsp则返回错误码&nbspAh&nbsp=&nbsp31h&nbsp(驱动器
中没有介质).
&nbsp&nbsp&nbsp&nbsp如果试图弹出一个未锁定的可移动驱动器中的介质,&nbspInt13h会调用&nbspInt15h
(AH&nbsp=&nbsp52h)&nbsp来检查弹出请求能否执行.&nbsp如果弹出请求被拒绝则返回错误码(同
Int15h).&nbsp如果弹出请求被接受,但出现了其他错误,&nbsp则返回错误码&nbspAH&nbsp=&nbspB5h.

7)&nbsp扩展定位
入口:
&nbsp&nbsp&nbsp&nbspAH&nbsp=&nbsp47h
&nbsp&nbsp&nbsp&nbspDL&nbsp=&nbsp驱动器号
&nbsp&nbsp&nbsp&nbspDS:DI&nbsp=&nbsp磁盘地址数据包(Disk&nbspAddress&nbspPacket)

返回:
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp0,&nbspAH&nbsp=&nbsp0&nbsp成功
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp1,&nbspAH&nbsp=&nbsp错误码

&nbsp&nbsp&nbsp&nbsp这个调用将磁头定位到指定扇区.

8)&nbsp取得驱动器参数
入口:
&nbsp&nbsp&nbsp&nbspAH&nbsp=&nbsp48h
&nbsp&nbsp&nbsp&nbspDL&nbsp=&nbsp驱动器号
&nbsp&nbsp&nbsp&nbspDS:DI&nbsp=&nbsp返回数据缓冲区地址

返回:
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp0,&nbspAH&nbsp=&nbsp0&nbsp成功
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspDS:DI&nbsp驱动器参数数据包地址,&nbsp(参见前面的文章)
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp1,&nbspAH&nbsp=&nbsp错误码

&nbsp&nbsp&nbsp&nbsp这个调用返回指定驱动器的参数.

9)&nbsp取得扩展驱动器介质更换检测线状态
入口:
&nbsp&nbsp&nbsp&nbspAH&nbsp=&nbsp49h
&nbsp&nbsp&nbsp&nbspDL&nbsp=&nbsp驱动器号

返回:
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp0,&nbspAH&nbsp=&nbsp0&nbsp&nbsp介质未更换
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp1,&nbspAH&nbsp=&nbsp06h&nbsp介质可能已更换

&nbsp&nbsp&nbsp&nbsp这个调用返回指定驱动器的介质更换状态.
&nbsp&nbsp&nbsp&nbsp这个调用与&nbspInt13h&nbspAH&nbsp=&nbsp16h&nbsp子功能调用相同,&nbsp只是允许任何驱动器
标号.&nbsp如果对一台支持可移动介质功能子集的固定驱动器使用此功能,则永远
返回&nbspCF&nbsp=&nbsp0,&nbspAH&nbsp=&nbsp0.
&nbsp&nbsp&nbsp&nbsp简单地将可移动介质锁定再解锁就可以激活检测线,&nbsp而无须真正更换介质.


10)&nbspInt&nbsp15h&nbsp可移动介质弹出支持
入口:
&nbsp&nbsp&nbsp&nbspAH&nbsp=&nbsp52h
&nbsp&nbsp&nbsp&nbspDL&nbsp=&nbsp驱动器号
返回:
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp0,&nbspAH&nbsp=&nbsp0&nbsp弹出请求可能可以执行
&nbsp&nbsp&nbsp&nbspCF&nbsp=&nbsp1,&nbspAH&nbsp=&nbsp错误码&nbspB1h&nbsp或&nbspB3h&nbsp&nbsp弹出请求不能执行

&nbsp&nbsp&nbsp&nbsp这个调用是由&nbspInt13h&nbspAH=46h&nbsp弹出介质功能调用内部使用的.

址163164.cn 微信1631640 QQ3149886

返回总目录 上一页 目录页 下一页