Определение системного зарезервированного диска с помощью функции DeviceIoControl в переполнении стека

Я пытаюсь определить, является ли диск системным зарезервированным диском (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,

0

Решение

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
);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]