如何从 Windows 中的 HID 设备获取原始描述符数据?
背景:
我需要从 Windows 的 HID 设备中获取制造商、产品名称和序列号。我正在使用 hid.dll 使用此处看到的函数访问设备。我的问题与此问题非常相似。我能够从一些 HID 设备中获取制造商字符串和产品字符串,但大多数设备无法返回此数据,HidD_GetManufacturerString 返回 false。然而,我知道这些设备在它们的描述符中有字符串信息,因为我能够使用 USBTreeView 查看。
有趣的是,即使对于返回制造商和产品名称的设备,我通过 hid.dll 得到的值与使用上述工具从 USB 设备获取的原始数据非常不同。
例如,Xbox 360 控制器:
背景:
我需要从 Windows 的 HID 设备中获取制造商、产品名称和序列号。我正在使用 hid.dll 使用此处看到的函数访问设备。我的问题与此问题非常相似。我能够从一些 HID 设备中获取制造商字符串和产品字符串,但大多数设备无法返回此数据,HidD_GetManufacturerString 返回 false。然而,我知道这些设备在它们的描述符中有字符串信息,因为我能够使用 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。我不知道这是否适用于普通的非管理员应用程序。