Я пытаюсь определить, является ли диск системным зарезервированным диском (PhysicalDrive0
или же C-Drive
) с помощью DeviceIoControl
функция. Однако мой код всегда возвращает истину для всех дисков.
HANDLE hDevice; // handle to the drive to be examined
BOOL bResult; // results flag
DWORD junk; // discard results
PARTITION_INFORMATION_MBR *pdg
hDevice = CreateFile(TEXT("\\\\.\\C:"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ |
FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);bResult = DeviceIoControl(
hDevice, // device to be queried
IOCTL_DISK_GET_PARTITION_INFO_EX, // operation to perform
NULL, 0, // no input buffer
pdg, sizeof(*pdg), // output buffer
&junk, // # bytes returned
(LPOVERLAPPED) NULL // synchronous I/O
);
bResult
всегда возвращает 0, указывая, что функция выполнена успешно. pdg->PartitionType
имеет нежелательную информацию и не возвращается true
,bResult всегда возвращает 0, указывая, что функция выполнена успешно.
Просто неправильно, документация гласит Если операция завершается успешно, возвращаемое значение отлично от нуля. Многие вещи могут быть неправильными, по крайней мере, ваши параметры не верны и GetLastError
вернулся бы ERROR_INSUFFICIENT_BUFFER
:
Ты даешь DeviceIoControl
неинициализированный указатель, но он ожидает, что pdg
указывает на буфер, в этом случае, с размером указателя на PARTITION_INFORMATION_MBR
, Разыменование диких указателей вызывает неопределенное поведение. Также, согласно документация DeviceIoControl
с OCTL_DISK_GET_PARTITION_INFO
ждет PARTITION_INFORMATION_EX
структура так
+ Изменить
PARTITION_INFORMATION_MBR *pdg(;)
в
PARTITION_INFORMATION_EX pdg;
Таким образом, вы получили структуру с автоматическим хранением, для которого вы можете дать DeviceIoControl
временный указатель на него, с &
оператор.
bResult = DeviceIoControl(
hDevice, // device to be queried
IOCTL_DISK_GET_PARTITION_INFO_EX, // operation to perform
NULL, 0, // no input buffer
&pdg, sizeof(pdg), // output buffer
&junk, // # bytes returned
(LPOVERLAPPED) NULL // synchronous I/O
);
Других решений пока нет …