【问题标题】:Identifying system reserved drive using DeviceIoControl function in C++使用 C++ 中的 DeviceIoControl 函数识别系统保留驱动器
【发布时间】:2012-09-19 03:58:52
【问题描述】:

我正在尝试使用DeviceIoControl 函数识别驱动器是否为系统保留驱动器(PhysicalDrive0C-Drive)。但是,我的代码始终为所有驱动器返回 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

【问题讨论】:

  • 您可能需要仔细查看: 返回值:如果操作成功完成,则返回值非零。如果操作失败或处于挂起状态,则返回值为零。要获取扩展错误信息,请调用 GetLastError。
  • DeviceIoControl 成功检索了分区信息,并且它(存储在您的 PARTITION_INFORMATION_EX 结构中)因此它返回 0(成功)。您现在需要查看您的 PARTITION_INFORMATION_EX 结构,看看您请求的信息是否存在。

标签: c++ deviceiocontrol


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2020-05-20
    • 2013-03-30
    • 1970-01-01
    相关资源
    最近更新 更多