ВУЗ:
Составители:
WORD dwFSInfoSec; // Номер сектора, содержащего структуру BIGFATBOOTFSINFO.
WORD dwBkUpBootSec; // номер сектора, содержащего копию загрузочного сектора
BYTE Reserved[12];
} EA_DEVICEPARAMS, FAR * LP_EA_DEVICEPARAMS;
#pragma pack()
BOOL GetDeviceParameters (int nDrive)
{
HANDLE hDev;
BOOL fResult;
DWORD cb;
DIOC_REGISTERS reg = {0};
EA_DEVICEPARAMS dp;
// получаем дескриптор виртуального драйвера
hDev = CreateFile("\\\\.\\VWIN32", 0, 0, 0, 0, FILE_FLAG_DELETE_ON_CLOSE, 0);
if (hDev != INVALID_HANDLE_VALUE)
{
reg.reg_EAX = 0x440D; // задаем номер функции чтения логического сектора
reg.reg_EBX = nDrive; // задаем номер диска 1=A, 2=B, и т.д.
reg.reg_ECX = 0x4860;
reg.reg_EDX = (DWORD)&dp
fResult = DeviceIoControl(hDev, VWIN32_DIOC_DOS_DRIVEINFO, ®, sizeof(reg), ®,
sizeof(reg), &cb, 0);
// если вызов DeviceIoControl был успешен Result будет равен 1, иначе 0.
fResult = fResult && !(reg.reg_Flags & CARRY_FLAG);
CloseHandle(hDev); // закрываем драйвер
return fResult;
}
}
Для ОС направления Windows 2000 во всех случаях можно воспользоваться
функциями CreateFile, ReadFile и WriteFile.
#include <winioctl.h>
HANDLE hDrive = CreateFile("\\\\.\\C:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ
| FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);
if(hDrive == INVALID_HANDLE_VALUE) printf("Error open volume");
else
{
BYTE sec_buf[512];
DWORD dwBytesRead;
int offset_buff;
// Читаем 1-й сектор тома...
ReadFile(hDrive, sec_buf, 512, &dwBytesRead, NULL);
// закрываем устройство
CloseHandle(hDrive);
}
Заключение