gpt4 book ai didi

c# - 在 Windows 中如何从 USB HID 设备获取原始描述符数据?

转载 作者:可可西里 更新时间:2023-11-01 13:27:04 31 4
gpt4 key购买 nike

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

背景:

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

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

例如,Xbox 360 Controller :

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。我不知道这是否适合普通的非管理应用程序。

最佳答案

我终于找到了解决方案。主要问题只是将 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 信息,包括描述符。

关于c# - 在 Windows 中如何从 USB HID 设备获取原始描述符数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26191684/

31 4 0