使用C ++中的DeviceIoControl函数识别系统保留的驱动器

时间:2012-09-19 03:58:52

标签: c++ deviceiocontrol

我正在尝试使用PhysicalDrive0功能识别驱动器是否为系统保留驱动器(C-DriveDeviceIoControl)。但是我的代码总是对所有驱动器都返回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

1 个答案:

答案 0 :(得分:0)

  

bResult总是返回0,表示该功能成功。

普通错误,the documentation states如果操作成功完成,则返回值为非零。很多事情可能都是错的,至少你的参数不对,GetLastError会返回ERROR_INSUFFICIENT_BUFFER

您给DeviceIoControl一个未初始化的指针,但它希望pdg指向缓冲区,在这种情况下,指向PARTITION_INFORMATION_MBR的指针大小。取消引用野生指针会调用未定义的行为。此外,根据the documentation DeviceIoControlOCTL_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
    );