AX -- 功能號7305H
DS:BX -- 讀寫扇區的信息結構
CX -- 必須爲-1
DL -- 驅動器號: 1=A:, 2=B:, 3=C:, ...
SI -- 讀寫標誌: 最低位0=讀, 1=寫
DISKIO STRUC
dwStartSector dd ? ; 起始扇區
wSector dw ? ; 扇區數
lpBuffer dd ? ; 數據緩衝區地址
DISKIO ENDS
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
// 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 dwOutBytes;
BOOL bResult;
// 打開設備,獲得VxD句柄
hDevice = CreateFile("\\\\.\\vwin32", // 設備路徑
GENERIC_READ | GENERIC_WRITE, // 讀寫方式
FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享方式
NULL, // 默認的安全描述符
OPEN_EXISTING, // 創建方式
FILE_ATTRIBUTE_NORMAL, // 文件屬性
NULL); // 不需參照模板文件
if(hDevice == INVALID_HANDLE_VALUE)
{
return FALSE;
}
// 填充DISKIO參數結構
dio.dwStartSector = dwStartSector;
dio.wSectors = wSectors;
dio.pBuffer = pBuffer;
// 填充寄存器組--中斷入口參數
memset(®s, 0, sizeof(DIOC_REGISTERS));
regs.reg_EAX = 0x7305; // AX=0x7305
regs.reg_EBX = (DWORD)&dio; // EBX=DS:BX=參數指針
regs.reg_ECX = 0xffff; // CX=-1
regs.reg_EDX = nDiskNumber; // DL=盤號
regs.reg_ESI = 0; // SI=0 -- 讀操作
// 用VWIN32_DIOC_DOS_DRIVEINFO讀磁盤
dwOutBytes = 0;
bResult = DeviceIoControl(hDevice, // 設備句柄
VWIN32_DIOC_DOS_DRIVEINFO, // INT21
®s, sizeof(regs), // 輸出數據緩衝區與長度
®s, sizeof(regs), // 輸出數據緩衝區與長度
&dwOutBytes, // 輸出數據長度
NULL); // 用同步I/O
// 確定DeviceIoControl與INT21都無錯誤
bResult = bResult && !(regs.reg_Flags & 1);
CloseHandle(hDevice);
return bResult;
}
BOOL AbsDiskWrite(
BYTE nDiskNumber, // 盤號, 1=A:, 2=B:, 3= C:, ...
DWORD dwStartSector, // 起始扇區
WORD wSectors, // 扇區數
void* pBuffer) // 數據緩衝區指針
{
HANDLE hDevice;
DIOC_REGISTERS regs;
DISKIO dio;
DWORD dwOutBytes;
BOOL bResult;
// 打開設備,獲得VxD句柄
hDevice = CreateFile("\\\\.\\vwin32", // 設備路徑
GENERIC_READ | GENERIC_WRITE, // 讀寫方式
FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享方式
NULL, // 默認的安全描述符
OPEN_EXISTING, // 創建方式
FILE_ATTRIBUTE_NORMAL, // 文件屬性
NULL); // 不需參照模板文件
if(hDevice == INVALID_HANDLE_VALUE)
{
return FALSE;
}
// 填充DISKIO參數結構
dio.dwStartSector = dwStartSector;
dio.wSectors = wSectors;
dio.pBuffer = pBuffer;
// 填充寄存器組--中斷入口參數
memset(®s, 0, sizeof(DIOC_REGISTERS));
regs.reg_EAX = 0x7305; // AX=0x7305
regs.reg_EBX = (DWORD)&dio; // EBX=DS:BX=參數指針
regs.reg_ECX = 0xffff; // CX=-1
regs.reg_EDX = nDiskNumber; // DL=盤號
regs.reg_ESI = 0x6001; // SI=0x6001 -- 普通寫操作
// 用VWIN32_DIOC_DOS_DRIVEINFO寫磁盤
dwOutBytes = 0;
bResult = DeviceIoControl(hDevice, // 設備句柄
VWIN32_DIOC_DOS_DRIVEINFO, // INT21
®s, sizeof(regs), // 輸出數據緩衝區與長度
®s, sizeof(regs), // 輸出數據緩衝區與長度
&dwOutBytes, // 輸出數據長度
NULL); // 用同步I/O
// 確定DeviceIoControl與INT21都無錯誤
bResult = bResult && !(regs.reg_Flags & 1);
CloseHandle(hDevice);
return bResult;
}
BOOL LockVolume(
BYTE nDiskNumber) // 盤號, 1=A:, 2=B:, 3=C:, ...
{
HANDLE hDevice;
DIOC_REGISTERS regs;
DWORD dwOutBytes;
BOOL bResult;
// 打開設備,獲得VxD句柄
hDevice = CreateFile("\\\\.\\vwin32", // 設備路徑
GENERIC_READ | GENERIC_WRITE, // 讀寫方式
FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享方式
NULL, // 默認的安全描述符
OPEN_EXISTING, // 創建方式
FILE_ATTRIBUTE_NORMAL, // 文件屬性
NULL); // 不需參照模板文件
if(hDevice == INVALID_HANDLE_VALUE)
{
return FALSE;
}
// 填充寄存器組--中斷入口參數
memset(®s, 0, sizeof(DIOC_REGISTERS));
regs.reg_EAX = 0x440D; // AX=0x440D
regs.reg_EBX = 0x0100 | nDiskNumber; // BH=鎖的級別,BL=盤號
regs.reg_ECX = 0x084A;
regs.reg_EDX = 0;
// 用VWIN32_DIOC_DOS_DRIVEINFO讀磁盤
dwOutBytes = 0;
bResult = DeviceIoControl(hDevice, // 設備句柄
VWIN32_DIOC_DOS_IOCTL, // INT21
®s, sizeof(regs), // 輸入數據緩衝區與長度
®s, sizeof(regs), // 輸出數據緩衝區與長度
&dwOutBytes, // 輸出數據長度
NULL); // 用同步I/O
// 確定DeviceIoControl與INT21都無錯誤
bResult = bResult && !(regs.reg_Flags & 1);
CloseHandle(hDevice);
return bResult;
}
BOOL UnlockVolume(
BYTE nDiskNumber) // 盤號, 1=A:, 2=B:, 3=C:, ...
{
HANDLE hDevice;
DIOC_REGISTERS regs;
DWORD dwOutBytes;
BOOL bResult;
// 打開設備,獲得VxD句柄
hDevice = CreateFile("\\\\.\\vwin32", // 設備路徑
GENERIC_READ | GENERIC_WRITE, // 讀寫方式
FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享方式
NULL, // 默認的安全描述符
OPEN_EXISTING, // 創建方式
FILE_ATTRIBUTE_NORMAL, // 文件屬性
NULL); // 不需參照模板文件
if(hDevice == INVALID_HANDLE_VALUE)
{
return FALSE;
}
// 填充寄存器組--中斷入口參數
memset(®s, 0, sizeof(DIOC_REGISTERS));
regs.reg_EAX = 0x440D; // AX=0x440D
regs.reg_EBX = nDiskNumber; // BL=盤號
regs.reg_ECX = 0x086A;
// 用VWIN32_DIOC_DOS_DRIVEINFO讀磁盤
dwOutBytes = 0;
bResult = DeviceIoControl(hDevice, // 設備句柄
VWIN32_DIOC_DOS_IOCTL, // INT21
®s, sizeof(regs), // 輸入數據緩衝區與長度
®s, sizeof(regs), // 輸出數據緩衝區與長度
&dwOutBytes, // 輸出數據長度
NULL); // 用同步I/O
// 確定DeviceIoControl與INT21都無錯誤
bResult = bResult && !(regs.reg_Flags & 1);
CloseHandle(hDevice);
return bResult;
}
unsigned char buf[512 * 10];
if (AbsDiskRead(1, 0, 10, buf))
{
FILE* fp = fopen("a.dat", "w+b");
fwrite(buf, 512, 10, fp);
fclose(fp);
}
unsigned char buf[512];
LockVolume(4);
if (AbsDiskRead(4, 8888, 1, buf))
{
... ...
if (AbsDiskWrite(4, 8888, 1, buf))
{
... ...
}
}
UnlockVolume(4);
Bit 15 | Bit 14 | Bit 13 | Description |
0 | 0 | 0 | Other/Unknown. |
0 | 0 | 1 | FAT data. |
0 | 1 | 0 | Directory data. |
0 | 1 | 1 | Normal file data. |
1 | 0 | 0 | Reserved. |
[相關資源]
0
收藏
推薦專欄更多
猜你喜歡
掃一掃,領取大禮包
Ctrl+Enter 發佈
發佈
取消