|
|
中断功能 限制及使用情况
INT13 不可以读写硬盘,仅支持软盘
INT25/INT26 不可以读/写FAT32硬盘,支持FAT12、FAT16
INT21(440DH-41H/61H) 不可用(文档资料中说支持FAT12、FAT16、FAT32,实际上没有实现)
INT21(7305H) 可以读写软盘、硬盘,支持FAT12、FAT16、FAT32,但要求WIN95OSR2及以后版本
值得一提的是上表中的INT21--7305H功能是专门提供用来支持FAT32的,并且用来替换INT25/INT26,对应的控制命令字是6(即VWIN32_DIOC_DOS_DRIVEINFO),它和INT13、INT25、INT26等中断功能的一个显著区别是:它不使用寄存器来传递参数(INT21--440DH-41H/61H类同),而是使用一个称为DISKIO的结构,寄存器EBX用来保存指向该结构的地址。DISKIO的定义如下:
typedef struct _DISKIO {
DWORD dwStartSector; // 要读写的起始扇区号
WORD wSectors; // 要读写的扇区数
DWORD dwBuffer; // 用来保存读/写数据的缓冲区
}DISKIO, * PDISKIO;
另外,在使用该功能时还需要特别设置一些寄存器,如ECX必须为-1,用ESI来表示读写。下面的例子是使用该功能来实现上面的例子功能,即读软盘A的一个扇区。首先定义一个新的寄存器结构供本例使用:
typedef struct _DIOC_REGISTERS{
DWORD EBX;
DWORD EDX;
DWORD ECX;
DWORD EAX;
DWORD EDI;
DWORD ESI;
DWORD Flags;
}DIOC_REGISTERS;
其实该结构和上面的INT13_REGISTERS是一样的,只不过INT13_REGISTERS将寄存器细分开了,可读性更强些。本例从步骤上说和上面的例子相同,只有寄存器设置一步在内容上有差异。
第一步:打开VWIN32服务。
第二步:设置寄存器。
DIOC_REGISTERS reg = {0};
DISKIO dio;
unsigned char Buffer[512];
//设置参数结构
dio.dwStartSector = 0;//注意:和上例不同,不是1,从0开始编号
dio.wSectors = 1;
dio.dwBuffer = (DWORD)Buffer;
//设置寄存器
reg.EAX = 0x7305; //功能上类似于INT25,绝对读
reg.EBX = (DWORD)&dio;//参数结构的地址
reg.ECX = -1;//必须是-1
reg.EDX = 1; //注意:和上例不同,驱动器编号变了,0--缺省 1--A、2--B、3--C
reg.ESI = 0; //ESI的bit0表示读写,0--读、1--写
在写状态时SI的bit1--bit12,bit15必须是0,bit13、bit14、bit15共同来表示所写数据的类型,具体见下表:
15 14 13 类型描述
0 0 0 其它或不知道.
0 0 1 FAT数据
0 1 0 目录数
网友评论:(评论内容只代表网友观点,与本站立场无关!) |
阅读排行
|