Необходимо получить смещение разделов жёсткого диска. Я делаю это следующим образом:
PDRIVE_LAYOUT_INFORMATION_EX partitions;
DWORD partitionsSize = sizeof(DRIVE_LAYOUT_INFORMATION_EX)
+ 127 * sizeof(PARTITION_INFORMATION_EX);
partitions = (PDRIVE_LAYOUT_INFORMATION_EX)malloc(partitionsSize);
HANDLE h = CreateFile(L"\\\\.\\PhysicalDrive0", FILE_ANY_ACCESS ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, 0);
if (h == INVALID_HANDLE_VALUE)
{
// handle error and exit
}
if (DeviceIoControl(h, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, NULL, 0, partitions,
partitionsSize, 0, NULL) != 0)
{
// do stuff with partitions here
}
Данный код корректно отрабатывает на Windows 10, однако мне необходима совместимость с Windows 7. Приложение падает на вызове DeviceIoControl со следующим выводом отладчика: Unhandled exception at 0x76B5D2EA (KernelBase.dll) in myapp.exe: 0xC0000005: Access violation writing location 0x00000000.
Для сборки использовал компилятор Microsoft Visual Studio 14.0
Для решения испробовал следующее: менял параметры доступа в вызове CreateFile, запускал от имени администратора
При вызове DeviceIoControl c флагом IOCTL_DISK_GET_DRIVE_LAYOUT_EX без использования асинхронного чтения параметр lpBytesReturned должен быть ненулевым указателем, согласно документации:
If lpOverlapped is NULL, lpBytesReturned cannot be NULL. Even when an operation returns no output data and lpOutBuffer is NULL, DeviceIoControl makes use of lpBytesReturned. After such an operation, the value of lpBytesReturned is meaningless.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей