许多USB设备包含唯一的序列号(实际上是一个Unicode字符串),主机可以将其与16位供应商和产品ID号一起使用,以唯一地标识设备。
我正在试图弄清楚如何编写一个能够显示连接到系统的所有USB人机接口设备列表的Windows应用程序。该列表对于每个HID都有一行,包括系统键盘。列表中将列出供应商ID,产品ID和序列号。
我可以通过使用SetupDiGetClassDevs
返回的GUID调用HidD_GetHidGuid
并通过重复调用SetupDiEnumDeviceInterfaces
来循环遍历结果来获取USB HID列表。然后,我可以调用SetupDiGetDeviceInterfaceDetail
来获取每个设备的路径,我可以使用CreateFile
打开它,只要我小心不要求读取或写入权限,系统键盘将拒绝该权限。从那里,我可以通过调用HidD_GetAttributes
来获取供应商和产品ID号。
我弄清楚的是如何检索序列号字符串。当我搜索这个问题的解决方案时,我发现了很多关于如何获取USB大容量存储设备的序列号的信息,但看起来没有什么看起来可能适用于任何其他类型的USB设备。我很乐意发现检索序列号字符串的泛型方法或特定于HID的方法。
我感觉libusb
的Win32端口可以毫不费力地管理它,但不幸的是我需要一个仅依赖于Windows附带的库的解决方案,例如setupapi
和hid
包含上述功能的DLL。
非常感谢任何建议!
答案 0 :(得分:5)
事实证明,HID.dll
定义了一个名为HidD_GetSerialNumberString
的函数,它完全符合我的要求,给定了我从CreateFile
得到的句柄,如上所述。刚试了一下,效果很好。还有HidD_GetManufacturerString
和HidD_GetProductString
函数来检索设备描述符中引用的其他字符串描述符,甚至还有HidD_GetIndexedString
来获取给定索引的任意字符串描述符(可能是因为HID)允许描述符包含字符串描述符索引)。我觉得现在很傻 - 这个答案就在我的鼻子底下。
感谢大家花时间阅读并回答我的问题!我将继续接受Alphaneo的回答,因为它听起来很有希望,事实上当我偶然发现这个答案时,我正在等待DDK下载。
答案 1 :(得分:3)
您是否尝试过DDK附带的USBVIew源代码。 USBView工具显示任何USB设备的序列号,源代码随DDK一起提供。
答案 2 :(得分:0)
您是否尝试过搜索Hid键盘的输入记录,输出记录和功能记录的HID定义文档。这应该显示你可以通过HID键盘输出的“东西”列表。
另外,我知道可以通过软件枚举HID记录定义。大约一年前我做了类似的事情,但我记不起头顶的细节了。这样做可以让您看到键盘USB类作为标准接口发布的内容。
我希望它可以为您提供一些指示,以找出您要找的内容。对不起,我无法准确!
答案 3 :(得分:0)
我推荐这本书USB Complete。第4章枚举:主持人如何了解设备有您需要的信息。
This page有许多信息链接,您可以链接到可以使用的库和实用程序。
答案 4 :(得分:0)
您可以使用GetVolumeInformation
获取所有附加硬件的序列号。