扩展int13h调用详解(修正)
ds:si ==> 磁盘地址数据包( disk address packet ) dl ==> 驱动器号 ah ==> 功能代码 / 返回码
在基本 Int13H 调用中, 0 - 0x7F 之间的驱动器号代表可移动驱动器0x80 - 0xFF 之间的驱动器号代表固定驱动器. 但在扩展 Int13H 调用中 0x80 - 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:DI = 磁盘地址数据包(Disk Address Packet)
返回: CF = 0, AH = 0 成功 CF = 1, AH = 错误码
这个调用将磁盘上的数据读入内存. 如果出现错误, DAP 的 BlockCount项中则记录了出错前实际读取的数据块个数.
3) 扩展写 入口: AH = 43h AL 0 位 = 0 关闭写校验 1 打开写校验 1 - 7 位保留, 置 0 DL = 驱动器号 DS:DI = 磁盘地址数据包(DAP) 返回: CF = 0, AH = 0 成功 CF = 1, AH = 错误码
这个调用将内存中的数据写入磁盘. 如果打开了写校验选项, 但 BIOS不支持, 则会返回错误码 AH = 01h, CF = 1. 功能 48h 可以检测BIOS是否 |