Вот мой кусок работающего кода, анализирующий MBR
/*
* определение наличия отладочного раздела
* Return:
* false если найден диск с отладочным разделом
* true если такой диск не найден (то есть требуется удалить данный элемент из вектора)
*/
bool DiskRecord::LogPartitionNotFound(LogDiskRecord &r)
{
bool rc = true;
HANDLE hDisk = CreateFileA(r.diskname.data(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDisk != INVALID_HANDLE_VALUE) {
#pragma pack (1)
union {
uint8_t buff[512];
struct {
uint8_t bootstrap[446];
struct {
uint8_t status;
struct {
uint8_t h;
uint16_t s:6;
uint16_t c:10;
} chs_start;
uint8_t type;
struct {
uint8_t h;
uint16_t s:6;
uint16_t c:10;
} chs_end;
uint32_t lba_start;
uint32_t lba_size;
} part[4];
uint8_t b_55;
uint8_t b_aa;
} mbr;
} mbr;
#pragma pack ()
DWORD dwRead;
ReadFile(hDisk, mbr.buff, 512, &dwRead, 0);
CloseHandle(hDisk);
if (dwRead == 512 && mbr.mbr.b_55 == 0x55 && mbr.mbr.b_aa == 0xAA) { /* сейчас требуется анализ MBR */
int i;
for (i = 0; i < 4; i++) if (mbr.mbr.part[i].type == 0xF8) break;
if (i < 4) {
r.lba_begin = mbr.mbr.part[i].lba_start;
r.lba_end = mbr.mbr.part[i].lba_start + mbr.mbr.part[i].lba_size;
rc = false;
}
}
}
return rc;
}