ВУЗ:
Составители:
DeviceIoControl с кодом управления VWIN32_DIOC_DOS_ DRIVEINFO. Предва-
рительно необходимо посредством функции CreateFile получить дескриптор вир-
туального драйвера VWIN32. Функция чтения сектора в разделе, описанная на язы-
ке Си, может выглядеть следующим образом:
#include <windows.h>
#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;
#define CARRY_FLAG 0x1
#pragma pack(1)
typedef struct _DISKIO {
DWORD dwStartSector; //номер начального логического сектора
WORD wSectors; // количество секторов для чтения
DWORD dwBuffer; // адрес буфера для чтения
} DISKIO, * PDISKIO;
#pragma pack()
// функция чтения / записи секторов
BOOL ReadWriteSectors (HANDLE hDev, // Дескриптор виртуального драйвера
BYTE bDrive, // Номер драйвера 1 - A, 2 - B и т.д
DWORD dwStartSector, // Начальный сектор чтения
WORD wSectors, // Количество считываемых секторов
LPBYTE lpSectBuff, // Буфер под считываемые данные
BOOL flgRead) // Признак чтения
{
BOOL fResult;
DWORD cb;
DIOC_REGISTERS reg = {0};
DISKIO dio;
dio.dwStartSector = dwStartSector; // задаем начальный сектор
dio.wSectors = wSectors; // задаем количество секторов
dio.dwBuffer = (DWORD)lpSectBuff; //
задаем адрес буфера
reg.reg_EAX = 0x7305; // задаем номер функции чтения логического сектора
reg.reg_EBX = (DWORD)&dio; // задаем адрес структуры для чтения диска
reg.reg_ECX = -1;
reg.reg_EDX = bDrive; // задаем номер диска 1=A, 2=B, и т.д.
if(flgRead) reg.reg_ESI = 0x6000; // признак чтения сектора
else reg.reg_ESI = 0x6001; // признак записи сектора
fResult = DeviceIoControl(hDev, VWIN32_DIOC_DOS_DRIVEINFO,
®, sizeof(reg), ®, sizeof(reg), &cb, 0);
// если вызов DeviceIoControl был успешен Result будет равен 1, иначе 0.
fResult = fResult && !(reg.reg_Flags & CARRY_FLAG);
return fResult;
}
// функция чтения первого сектора тома