如何从Windows中的USB HID设备获取原始描述符数据?

时间:2014-10-04 10:01:28

标签: c# c++ windows usb hid

如何从Windows中的HID设备获取原始描述符数据?

背景:

我需要从Windows中的HID设备获取制造商,产品名称和序列号。我正在使用hid.dll使用functions seen here访问设备。我的问题非常相似to this one。我能够从SOME HID设备获取制造商字符串和产品字符串,但大多数都无法返回此数据,HidD_GetManufacturerString返回false。但是,我知道这些设备在描述符中确实有字符串信息,因为我能够看到它using USBTreeView

有趣的是,即使对于返回制造商和产品名称的设备,我通过hid.dll获得的值与我使用上述工具获取的值非常不同,该工具从USB获取原始数据设备

例如,Xbox 360控制器:

Via USB Tree View:
Device Description       : Xbox 360 Controller for Windows
Language 0x0409          : "©Microsoft Corporation"
iProduct                 : 0x02
Language 0x0409          : "Controller"
iSerialNumber            : 0x03
Language 0x0409          : "0843806"

Via hid.dll using HidD_GetManufacturerString, HidD_GetProductString, and HidD_GetSerialNumberString:
Description              : HID-compliant game controller
Product                  : Controller (XBOX 360 Controller for Windows)
Manufacturer             : FAILS
Serial Number            : FAILS

WinUSB无法打开这些设备来检索此数据,因为它们不使用winusb.sys驱动程序。

1)我不明白为什么HidD函数返回的值与USB描述符中的值不匹配。 2)我找不到任何方法来访问HID设备的原始USB描述符数据,因为我无法使用WinUSB访问它们。


编辑1:

好的,所以我对HID有了更多的了解。我通过hid.dll获取的数据似乎是驱动程序指定的数据,而不是来自USB设备的数据。 HID也可以应用于USB以外的传输设备。所以没关系。最后,我真正想知道的是,当我拥有HID设备时,如何获得USB设备以及我将使用哪种API。除了WinUSB不起作用,我唯一能找到的是内核级函数IOCTL。我不知道这是否适合普通的非管理员应用程序。

1 个答案:

答案 0 :(得分:2)

我终于找到了解决方案。主要问题是将HID设备与其父USB设备相关联。这是基本过程:

假设您已经拥有HID设备和SP_DEVINFO_DATA:

  1. 枚举所有USB设备as seen here
  2. 使用CM_GetChild和CM_GetSibling查找USB设备的所有子设备。
  3. 将已知HID设备的实例句柄(SP_DEVINFO_DATA-> DevInst)与CM函数返回的每个子设备实例句柄进行比较,以确定哪个USB设备是父设备。
  4. 从那里,您可以获得所需的任何USB信息,包括描述符。