Я бы пошел с
HANDLE drive = CreateFile(_T("\\.\PhysicalDrive0"), GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
// error handling
DWORD br = 0;
DISK_GEOMETRY dg;
DeviceIOControl(drive, IOCTL_DISK_GET_DRIVE_GEOMETRY, 0, 0, &dg, sizeof(dg), &br, 0);
//
LARGE_INTEGER pos;
pos.QuadPart = static_cast<LONGLONG>(sectorToRead) * dg.BytesPerSector;
SetFilePointerEx(drive, pos, 0, FILE_BEGIN);
const bool success = ReadFile(drive, sectorData, dg.BytesPerSector, &br) && br == dg.BytesPerSector;
//
CloseHandle(drive);
Обратите внимание, что для того, чтобы убедиться, что вы успешно прочитали сектор, вы должны убедиться, что число прочитанных байтов соответствует количеству байтов, которые вы хотите прочитать, т.е., по моему опыту, ReadFile () на физическом диске может вернуть ИСТИНА, даже если байты не читаются (или, может быть, у меня просто драйвер с ошибкой).
Проблема, которая остается, заключается в том, чтобы определить номер вашего диска (0, как используется в моем примере, относится к C: что, вероятно, не то, что вы хотите). Я не знаю, как это сделать, но если у вас подключен только один диск, который не отформатирован, это можно сделать, вызвав открытие каждого PhysicalDrive по порядку и вызвав DeviceIOControl () с IOCTL_DISK_GET_DRIVE_LAYOUT_EX
в качестве команды:
DRIVE_LAYOUT_INFORMATION_EX dl;
DeviceIOControl(drive, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, 0, 0, &dl, sizeof(dl), &br, 0);
if(dl.PartitionStyle == PARTITION_STYLE_RAW)
{
// found correct disk
}
Но это только предположение.