使用C++中的设备IO控制功能识别系统保留驱动器

Identifying system reserved drive using DeviceIoControl function in C++

本文关键字:识别 功能 系统 保留 驱动器 控制 IO C++ 使用      更新时间:2023-10-16

我正在尝试使用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.

b结果始终返回 0,表示函数成功。

显然是错误的,文档指出如果操作成功完成,则返回值为非零值。很多事情可能是错误的,至少你的参数不正确,GetLastError会返回ERROR_INSUFFICIENT_BUFFER


DeviceIoControl提供未初始化的指针,但它期望pdg指向缓冲区,在本例中,指针的大小为 PARTITION_INFORMATION_MBR 。取消引用通配指标会调用未定义的行为。此外,根据文档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
    );