使用C++中的设备IO控制功能识别系统保留驱动器
Identifying system reserved drive using DeviceIoControl function in C++
我正在尝试使用DeviceIoControl
功能确定驱动器是否是系统保留驱动器(PhysicalDrive0
或C-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
。取消引用通配指标会调用未定义的行为。此外,根据文档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
);
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 提升 ASIO 无法识别计时器对象
- 从udp接收帧对于人脸识别来说太慢
- 带内存和隔离功能的SQLite
- 模板类无法识别友元运算符
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 无法识别模板功能
- 为什么Visual Studio无法识别is_open()功能
- 为什么C 模板功能无法在同一标头文件中识别功能
- PEG规则以识别功能原型
- 如何求解与GCC/Clang不同的C 功能模板的MSVC处理(无法识别的模板定义)
- 为什么主函数不识别其他功能是否返回float类型编号
- 使用C++中的设备IO控制功能识别系统保留驱动器
- NSIS插件功能无法识别
- 模板功能,用于从其他容器中识别smart_pointer
- opencv/ c++:将保存的图像放置在具有面部识别功能的网络摄像头流上
- 调试断言失败!在人脸识别打开Cv的检测和显示功能中
- 使用Mat,并识别imread功能
- Eclipse C.D.T. 无法识别标准功能或"NULL"