我想在我的系统上获取 USB 设备的设备描述符。我正在 Windows 中创建一个用户空间应用程序(非托管,本机 c++)。从这些描述符中,我想识别广告牌设备并解析广告牌功能描述符(解析 bos 描述符)。
这是我的方法。
- 通过以下方式获取系统上的 USB 设备
SetupDiGetClassDevs(&GUID_CLASS_USB_DEVICE,...)
- 使用获取每个设备的设备路径
SetupDiGetDeviceInterfaceDetail()
- 在设备路径上使用
CreateFile()
以获取设备的句柄。 - 使用和句柄发出
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION
IOCTL以获取设备描述符。DeviceIoControl()
我被困在第四步(getLastError() - Invalid Function
)。
其他项目(例如来自 Intel 的示例代码),枚举系统上的所有 USB 控制器、根集线器、端口和接口,并在根集线器的句柄上发出 IOCTL,指定设备连接到的端口号。
我不想关心系统的 USB 层次结构。使用设置 API 在系统中获取 USB 设备更不容易出错且更容易。但是,我在任何地方都看不到直接向他们发出 IOCTL。
更新1
来自docs.microsoft.com:I/O
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION
控制请求检索与指定端口索引关联的设备的一个或多个描述符。此请求以 USB 集线器设备(GUID_DEVINTERFACE_USB_HUB) 为目标。因此,这个可以为我提供 USB 设备的设备描述符的 ioctl 应该由 USB 集线器处理,而不是由 USB 设备处理。
因此,其他解决方案将集线器的句柄传递给 DeviceIoControl(),如Intel 源代码的第 68 行所示(在此处链接)。
相反,我想使用上面第 3 步(设备的句柄)中获得的句柄来获取设备描述符。因此,IOCTL 可能不同,或者可能有一种方法可以获取集线器的句柄,以及使用 USB 设备的句柄连接设备的端口索引。
在我看来,设备描述符是 USB 设备的固有属性,因此必须有一种方法可以直接从 USB 设备获取它。