三. 接口规范

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

  DS:SI ==> 磁盘地址数据包( disk address packet)
  dl  ==> 驱动器号
  ah  ==> 功能代码 / 返回码

  在基本 Int13H 调用中, 0 – 0×7F之间的驱动器号代表可移动驱动器
0×80 – 0xFF 之间的驱动器号代表固定驱动器. 但在扩展 Int13H调用中
0×80 – 0xFF 之间还包括一些新出现的可移动驱动器, 比如活动硬盘等.
这些驱动器支持先进的锁定,解锁等功能.
  ah 返回的错误码除了标准 Int13H调用规定的基本错误码以外,又增加了以下错误码:

 B0h 驱动器中的介质未被锁定

 B1h 驱动器中的介质已经锁定

 B2h 介质是可移动的

 B3h 介质正在被使用

 B4h 锁定记数溢出

 B5h 合法的弹出请求失败

2. API 子集介绍
 1.x 版的扩展 Int13H 调用中规定了两个主要的 API 子集.

 第一个子集提供了访问大硬盘所必须的功能, 包括 检查扩展In13H
是否存在( 41h ), 扩展读( 42h ), 扩展写( 43h ), 校验扇区( 44h ),
扩展定位( 47h ) 和 取得驱动器参数( 48h ).
 第二个子集提供了对软件控制驱动器锁定和弹出的支持, 包括检查扩展Int13H 是否存在( 41h ), 锁定/解锁驱动器( 45h ), 弹出驱动器( 46h),
取得驱动器参数( 48h ), 取得扩展驱动器改变状态( 49h ), int 15h. 如果使用了调用规范中不支持的功能, BIOS 将返回错误码 ah =01h, CF = 1.

3. API 详解

1) 检验扩展功能是否存在
入口:
  AH = 41h
  BX = 55AAh
  DL = 驱动器号

返回:
  CF = 0
   AH = 扩展功能的主版本号
   AL = 内部使用
   BX = AA55h
   CX = API 子集支持位图
  CF = 1
   AH = 错误码 01h, 无效命令

  这个调用检验对特定的驱动器是否存在扩展功能.如果进位标志置 1则此驱动器不支持扩展功能. 如果进位标志为 0, 同时 BX = AA55h, 则存在扩展功能. 此时 CX 的 0 位表示是否支持第一个子集,1位表示是否支持第二个子集.
  对于 1.x 版的扩展 Int13H 来说, 主版本号 AH = 1. AL是副版本号, 但这仅限于 BIOS 内部使用, 任何软件不得检查 AL 的值.

2) 扩展读
入口:
  AH = 42h
  DL = 驱动器号
  DS:SI = 磁盘地址数据包(Disk Address Packet)

返回:
  CF = 0, AH = 0 成功
  CF = 1, AH = 错误码

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

3) 扩展写
入口:
  AH = 43h
  AL
   0 位 = 0 关闭写校验
       1 打开写校验
   1 – 7 位保留, 置 0
  DL = 驱动器号
  DS:SI = 磁盘地址数据包(DAP)
返回:
  CF = 0, AH = 0 成功
  CF = 1, AH = 错误码

  这个调用将内存中的数据写入磁盘. 如果打开了写校验选项,但 BIOS不支持, 则会返回错误码 AH = 01h, CF = 1. 功能 48h可以检测BIOS是否支持写校验.
  如果出现错误, DAP 的 BlockCount项中则记录了出错前实际写入的数据块个数.

4) 校验扇区
入口:
  AH = 44h
  DL = 驱动器号
  DS:SI = 磁盘地址数据包(Disk Address Packet)

返回:
  CF = 0, AH = 0 成功
  CF = 1, AH = 错误码

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


评论

该日志第一篇评论

发表评论

评论也有版权!