繁体   English   中英

如何在给定设备路径的情况下获取USB_DEVICE_DESCRIPTOR

[英]How do I obtain USB_DEVICE_DESCRIPTOR given a device path

我已经能够使用SetupAPI枚举USB设备,我已经从WDK查看了usbview应用程序,但我仍然无法弄清楚如何获取USB_DEVICE_DESCRIPTOR

  • 我宁愿避免使用WMI。
  • DeviceIoControl是示例应用程序usbview使用的,但这实际上只有在枚举Hub上的设备时才有效。 我想如果我可以在给定设备路径(或Id)的情况下到达父集线器(和端口),则此方法可能有效但我无法确定如何执行此操作。
  • 我有一个混合的设备,我想获得描述符。 其中一些是HID,有些可能是WinUsb.sys设备。 如果它们是WinUsb设备,我可以使用WinUsb_GetDescriptor ,但这对HID不起作用(我不知道如何从Id或Path ...接口类中区分它们我猜?)。
  • 我可以使用SetupDiGetDeviceRegistryProperty,但在可用属性列表中,我可以看到制造商字符串,但不能看到供应商ID。
  • 我可以从设备路径或设备ID解析这个值,但这看起来有点...... hack-ish。 这只是人们做的事情吗? 如果我想要其他领域,如制造商,它仍然让我去其他方法,如果我可以得到整个USB_DEVICE_DESCRIPTOR我认为我有我需要的一切。
  • LibUsb.Net显然只支持WinUsb设备。 这就是它如何获得描述符。
  • 显然WinRT有一些新的API,因此Windows应用商店应用程序有一个很好的方式来获取描述符。 但这绝对不是Windows应用商店应用,我不知道还有另一种方法可以使用更新的API。

谁能指出我正确的方向? 如果没有从Hub开始,是不是可以以一种很好的方式从WinAPI获取这些信息?

您最好的选择是从设备路径中提取信息,并使用SetupDi函数来获取其他的碎片。 据我所知,设备路径始终遵循相同的约定。 即:

“\\\\?\\ usb#vid_ 0000 &pid_ 1111SERIAL #{ GUID }”其中0000是VID,1111是PID作为十六进制字符串。 SERIAL是硬件提供的串行或OS分配的串行值。

我个人发现了一个实例,我绝对想要获取设备描述符以便以这种方式拉出串口。 在某些情况下,操作系统无法识别我的硬件提供的序列号。 我在硬件方面修复了这个问题,但我仍然希望在PC端容纳旧硬件。 以下是我的方法。 可能有更好的东西,但这是我迄今为止提出的最好的。 你可能仍然认为它是“hack-ish”。

  1. 调用SetupDiGetClassDevs()来设置所需的DeviceInfoSet
  2. 使用SetupDiEnumDeviceInfo()获取设备信息数据
  3. 使用SPDRP_LOCATION_INFORMATION调用SetupDiGetDeviceRegistryProperty()以获取位置信息。 此字符串应类似于“Port_#0001.Hub_#0001”。 解析此字符串以获取设备所在的端口号。 (我假设这个值是10的基数,但我还没有验证这个)
  4. 调用CM_Get_Parent()以获取父(hub)的设备节点指针值
  5. 使用GUID {0xf18a0e88,0xc30c,0x11d0,{0x88,0x15,0x00,0xa0,0xc9,0x06,0xbe,0xd8}}调用SetupDiGetClassDevs()以获取系统上的所有集线器。 该GUID应在usbiodef.h中定义为GUID_DEVINTERFACE_USB_HUB。
  6. 使用SetupDiEnumDeviceInfo()遍历设备列表。 一旦DevInst等于步骤4中获得的值,就停止。
  7. 在步骤6中找到的索引上调用SetupDiGetDeviceInterfaceDetail()。
  8. 在步骤7中获取的DevicePath上调用CreateFile()。
  9. 使用在步骤8中创建的文件和在步骤3中获取的端口号作为连接索引调用DeviceIoControl()。

-编辑-

正如Ben在评论中指出的那样,您可以通过在步骤4中获取的父节点dev节点上使用CM_Get_Device_ID来跳过步骤5,6和7.将此字符串中的斜杠(\\)更改为磅(#)。 在前面加上“\\\\?\\”,然后附加“#{f18a0e88-c30c-11d0-8815-00a0c906bed8}”。 在步骤8中将其用作设备路径。这可以避免迭代系统上的所有集线器设备:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM