我正在尝试使用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
。答案 0 :(得分:0)
bResult总是返回0,表示该功能成功。
普通错误,the documentation states如果操作成功完成,则返回值为非零。很多事情可能都是错的,至少你的参数不对,GetLastError
会返回ERROR_INSUFFICIENT_BUFFER
:
您给DeviceIoControl
一个未初始化的指针,但它希望pdg
指向缓冲区,在这种情况下,指向PARTITION_INFORMATION_MBR
的指针大小。取消引用野生指针会调用未定义的行为。此外,根据the documentation DeviceIoControl
并OCTL_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
);