【问题标题】:retrieving the serial number of a USB keyboard under WindowsWindows下获取USB键盘的序列号
【发布时间】:2009-04-06 22:10:46
【问题描述】:

许多 USB 设备都包含一个唯一的序列号(实际上是一个 Unicode 字符串),主机可以将其与 16 位供应商和产品 ID 号结合使用来唯一标识设备。

我试图弄清楚如何编写一个 Windows 应用程序,该应用程序能够显示连接到系统的所有 USB 人机接口设备的列表。该列表将为每个 HID 保留一行,包括系统键盘。列表中会有供应商 ID、产品 ID 和序列号列。

我可以通过使用HidD_GetHidGuid 返回的 GUID 调用 SetupDiGetClassDevs 并通过重复调用 SetupDiEnumDeviceInterfaces 循环结果来获取 USB HID 列表。然后我可以调用SetupDiGetDeviceInterfaceDetail 来获取每个设备的路径,我可以使用CreateFile 打开它,只要我小心地请求既不读取也不请求写入权限,这对于系统键盘将被拒绝。从那里我可以通过调用 HidD_GetAttributes 来获取供应商和产品 ID 号。

我无法弄清楚如何检索序列号字符串。当我搜索此问题的解决方案时,我发现了很多关于如何获取 USB 大容量存储设备的序列号的信息,但似乎没有任何信息适用于任何其他类型的 USB 设备。我很高兴发现检索序列号字符串的通用方法或 HID 特定方法。

我感觉 libusb 的 Win32 端口可以轻松解决这个问题,但不幸的是,我需要一个仅依赖于 Windows 附带的库的解决方案,例如 setupapihid DLL包含上述功能。

非常感谢任何建议!

【问题讨论】:

    标签: windows hardware usb


    【解决方案1】:

    事实证明,HID.dll 定义了一个名为 HidD_GetSerialNumberString 的函数,这正是我想要的,给定我从 CreateFile 获得的句柄,如上所述。刚刚试了一下,效果很好。还有 HidD_GetManufacturerStringHidD_GetProductString 函数来检索设备描述符中引用的其他字符串描述符,甚至还有一个 HidD_GetIndexedString 来获取给定其索引的任意字符串描述符(可能是因为 HID 描述符允许包含字符串描述符索引)。我现在觉得很傻——答案一直就在我的眼皮底下。

    感谢大家抽出宝贵时间阅读并回答我的问题!我将继续接受 Alphaneo 的答案,因为这听起来很有希望,事实上,当我偶然发现这个答案时,我正在等待 DDK 下载。

    【讨论】:

      【解决方案2】:

      您是否尝试过 DDK 附带的 USBVIew 源代码。 USBView 工具显示任何 USB 设备的序列号,并且源随 DDK 一起提供。

      【讨论】:

        【解决方案3】:

        您是否尝试过搜索有关 Hid 键盘的输入记录、输出记录和功能记录的 HID 定义的文档。这应该会显示您可以通过 HID 从键盘取出/输入的“事物”列表。

        另外,我知道可以通过软件枚举 HID 记录定义。大约 1 年前我做过类似的事情,但我不记得头顶的细节了。这样做可以让您看到键盘 USB 类作为标准接口发布的内容。

        我希望它可以为您提供一些指示,以找出您正在寻找的内容。抱歉,我不能更准确!

        【讨论】:

        • 不幸的是,USB 字符串描述符既不是 HID 输入报告,也不是输出报告,也不是功能报告。不过谢谢!
        【解决方案4】:

        我推荐这本书USB Complete。第 4 章枚举:主机如何了解设备具有您需要的信息。

        This page 有许多指向信息的链接以及指向您可以使用的库和实用程序的链接。

        【讨论】:

        • 这是一本很棒的书——我拥有第三版的副本,如果我没有读过它,我敢肯定我什至不会问这个问题。有问题的章节确实提到了我试图检索的信息,尽管它似乎没有解释如何从 Windows 应用程序中获取它。
        【解决方案5】:

        您可以使用GetVolumeInformation 获取连接的任何硬件的序列号。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-04
          • 2022-09-30
          • 2016-05-26
          • 2011-07-19
          • 1970-01-01
          相关资源
          最近更新 更多