Идентификация системного зарезервированного диска с помощью функции DeviceIoControl в C++

Я пытаюсь определить, является ли диск системным зарезервированным диском (PhysicalDrive0 или C-Drive), используя функцию DeviceIoControl. Однако мой код всегда возвращает true для всех дисков.

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.

person pankaj pankaj    schedule 19.09.2012    source источник
comment
Возможно, вам захочется взглянуть поближе: Возвращаемое значение: если операция завершается успешно, возвращаемое значение не равно нулю. Если операция завершается с ошибкой или находится в состоянии ожидания, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.   -  person chris    schedule 19.09.2012
comment
DeviceIoControl успешно получил информацию о разделе, и она (хранится в вашей структуре PARTITION_INFORMATION_EX), поэтому она вернула 0 (успех). Теперь вам нужно взглянуть на свою структуру PARTITION_INFORMATION_EX и посмотреть, есть ли там запрошенная вами информация или нет.   -  person    schedule 24.01.2013


Ответы (1)


bResult всегда возвращает 0, что указывает на успешное выполнение функции.

Совершенно неверно, соответствует документация Если операция завершается успешно, возвращаемое значение не равно нулю. Многое может быть не так, по крайней мере, ваши параметры неверны, и GetLastError вернул бы ERROR_INSUFFICIENT_BUFFER:


Вы даете DeviceIoControl неинициализированный указатель, но он ожидает, что pdg указывает на буфер, в данном случае с размером указателя на PARTITION_INFORMATION_MBR. Разыменование диких указателей вызывает неопределенное поведение. Кроме того, согласно документации DeviceIoControl с OCTL_DISK_GET_PARTITION_INFO ожидает структуру PARTITION_INFORMATION_EX, поэтому


Изменять

PARTITION_INFORMATION_MBR *pdg(;)

to

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
    );  
person Superlokkus    schedule 25.07.2016