在Windows下检索USB键盘的序列号

时间:2009-04-06 22:10:47

标签: windows hardware usb

许多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附带的库的解决方案,例如setupapihid包含上述功能的DLL。

非常感谢任何建议!

5 个答案:

答案 0 :(得分:5)

事实证明,HID.dll定义了一个名为HidD_GetSerialNumberString的函数,它完全符合我的要求,给定了我从CreateFile得到的句柄,如上所述。刚试了一下,效果很好。还有HidD_GetManufacturerStringHidD_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获取所有附加硬件的序列号。