1

我正在尝试使用功能确定驱动器是否是系统保留驱动器(PhysicalDrive0C-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
        );  
  • bResultis始终返回0,表示函数成功。
  • 甚至pdg->PartitionType有垃圾信息也不回true
4

1 回答 1

0

bResult 始终返回 0,表示函数成功。

完全错误,文档状态如果操作成功完成,则返回值非零。许多事情可能是错误的,至少您的参数不正确并且GetLastError会返回ERROR_INSUFFICIENT_BUFFER


你给出DeviceIoControl了一个未初始化的指针,但它期望pdg指向一个缓冲区,在这种情况下,指针大小指向PARTITION_INFORMATION_MBR. 取消引用野指针会调用未定义的行为。另外,根据具有等待结构的文档,因此 DeviceIoControlOCTL_DISK_GET_PARTITION_INFOPARTITION_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
    );  
于 2016-07-25T08:13:13.660 回答