在 Windows 中识别连接的驱动器

pro*_*gAK 2 c++ registry winapi windows-8

我搜索了一堆,要么没有使用正确的关键词,要么有一个独特的问题,因为我没有找到任何特定于我所看到的东西。

我在工作中继承了一个项目,用 C++ 编写并使用 WindowsAPI,它应该识别当前连接到机器的 USB 驱动器,显示这些驱动器的制造商、型号和序列号。这都存储在注册表中。目前,该程序通过以下方式访问所需的注册表:

 RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Control\\DeviceClasses\\{53f56307-b6bf-11d0-94f2-00a0c91efb8b}"), 0, KEY_READ, &hKey)
Run Code Online (Sandbox Code Playgroud)

然后使用对每个条目的调用RegQueryInfoKeyRegEnumKeyEx评估键 的组合/#/Control/Linked,如果 Linked 等于 1,则驱动器已连接。

这在 Windows 7 中运行良好,我遇到的问题是将程序移植到 Windows 8.1 即使它们在文件资源管理器中可见,它也不会返回任何 USB 驱动器。

运行 regedit 并比较 Windows 7 和 8.1 我注意到的是,在 win8.1 中,当我展开注册表时,当我展开注册表时,我在任何地方都看不到 Control 键,我得到的只是没有设置值的 #。

所以问题是,在迁移到 Win8.1 时,我是否遗漏了什么或微软在这方面做了一些改变。如果事实证明我不能再为此目的使用此注册表,是否有人建议我如何去做?

感谢您的帮助。

Jon*_*ter 5

我怀疑从该注册表项中读取是否曾经得到正式支持,因此它已更改的事实并不令人惊讶。

你可以做到这一点的方法之一是使用GetLogicalDriveStrings让您的系统驱动器的列表,然后测试,如果每个设备是使用USB驱动器DeviceIoControlIOCTL_STORAGE_QUERY_PROPERTY命令。这将填写一个STORAGE_DEVICE_DESCRIPTOR结构,BusType成员将BusTypeUsb用于 USB 设备。