实战DeviceIoControl 之七:在Windows 9X中读写磁盘扇区

在Windows NT/2K/XP中,直接用CreateFile打开名称类似于"//./A:"的”文件”,就可以与设备驱动打交道,通过ReadFile/WriteFile以绝对地址方式访问磁盘了。但Windows 9X不支持这样的简单方法。本文介绍一种在Windows 9X中实现磁盘直接访问的方法:利用系统的vwin32.vxd,通过DeviceIoControl调用DOS INT21 7305H与440DH功能来完成。该调用支持FAT12、FAT16和FAT32,适用于Windows 95 SR2以及更高版本。

先来了解一下DOS INT21 7305H功能的入口参数:

AX -- 功能号7305H
DS:BX -- 读写扇区的信息结构
CX -- 必须为-1
DL -- 驱动器号: 1=A:, 2=B:, 3=C:, ...
SI -- 读写标志: 最低位0=读, 1=写

若调用成功,清除C标志;否则设置C标志。

DS:BX指向一个结构,此结构定义如下:

DISKIO STRUC
    dwStartSector   dd ?    ; 起始扇区
    wSector         dw ?    ; 扇区数
    lpBuffer        dd ?    ; 数据缓冲区地址
DISKIO ENDS

在写操作下,需要“锁定”驱动器。DOS INT21 440DH的4AH/6AH功能可实现逻辑驱动器的加锁/解锁。其入口参数为:

AX -- 功能号440DH
BH -- 锁的级别,0-3级,直接写扇区用1
BL -- 驱动器号: 1=A:, 2=B:, 3=C:, ...
CH -- 0x08
CL -- 0x4A
DX -- 0
AX -- 功能号440DH
BL -- 驱动器号: 1=A:, 2=B:, 3=C:, ...
CH -- 0x08
CL -- 0x6A

以上两个调用,若调用成功,清除C标志;否则设置C标志。

通过IOCTL码VWIN32_DIOC_DOS_DRIVEINFO等调用上述中断。实现绝对磁盘读写的关键代码如下:

// INT21的IOCTL码
#define VWIN32_DIOC_DOS_IOCTL        1
#define VWIN32_DIOC_DOS_DRIVEINFO    6
 
// 寄存器组
typedef struct _DIOC_REGISTERS {
    DWORD reg_EBX;
    DWORD reg_EDX;
    DWORD reg_ECX;
    DWORD reg_EAX;
    DWORD reg_EDI;
    DWORD reg_ESI;
    DWORD reg_Flags;
} DIOC_REGISTERS, *PDIOC_REGISTERS;
 
// IO参数(注意字节对齐方式)
#pragma pack(1)
typedef struct _DISKIO {
    DWORD  dwStartSector;     // 起始扇区
    WORD   wSectors;          // 扇区数
    void*  pBuffer;           // 缓冲区指针
} DISKIO, *PDISKIO;
#pragma pack()
 
BOOL AbsDiskRead(
    BYTE nDiskNumber,         // 盘号, 1=A:, 2=B:, 3= C:, ... 
    DWORD dwStartSector,      // 起始扇区
    WORD wSectors,            // 扇区数
    void* pBuffer)            // 数据缓冲区指针
{
    HANDLE hDevice;
    DIOC_REGISTERS regs;
    DISKIO dio;
    DWORD d
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值