Я хочу получить дескриптор устройства USB-устройств в моей системе.Я создаю приложение пользовательского пространства в Windows (неуправляемый, родной C ++).Из этих дескрипторов я хочу идентифицировать рекламные щиты и проанализировать дескриптор возможностей рекламного щита (синтаксический анализ bos descriptor).
Вот мой подход.
- Получить устройства USB в системе с помощью
SetupDiGetClassDevs(&GUID_CLASS_USB_DEVICE,...)
- Получить путь к устройству каждого устройства, используя
SetupDiGetDeviceInterfaceDetail()
- Используйте
CreateFile()
в пути к устройству, чтобы получить дескриптор устройства. - Выпуск
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION
IOCTL с использованием DeviceIoControl()
и дескриптор, чтобы получить дескриптор устройства.
Я застрял на 4-м шаге (getLastError () - Invalid Function
).
Другие проекты (, как этоПример кода от Intel ), перечислите все USB-контроллеры в системе, корневые концентраторы, порты и интерфейсы и выполните IOCTL на дескрипторе корневого концентратора, указав номер порта, к которому подключено устройство.
Iне хочу интересоваться иерархией USB системы.Это меньше подвержено ошибкам, и легче получить USB-устройства в системе с помощью API настройки.Однако нигде не видно, как IOCTL выдается им напрямую.
Update1
From docs.microsoft.com :
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION
Запрос управления вводом / выводом извлекает один или несколько дескрипторов для устройства, связанного с указанным индексом порта.Этот запрос предназначен для USB-концентратора (GUID_DEVINTERFACE_USB_HUB).Таким образом, этот ioctl, который может дать мне дескриптор устройства USB-устройства, должен обрабатываться USB-концентратором, а NOT - USB-устройством.
Поэтому другие решения передают дескриптор концентратора наDeviceIoControl (), как видно из строки 68 исходного кода от Intel ( Linked here ).
Вместо этого я хочу использовать дескриптор, полученный на шаге3 (дескриптор устройства) выше, чтобы получить дескриптор устройства.Итак, IOCTL может быть другим, или, возможно, есть способ получить дескриптор концентратора и индекс порта, к которому подключено устройство, с помощью дескриптора устройства USB.
То, как я это вижудескриптор устройства является внутренним свойством устройства USB, и поэтому должен быть способ получить его непосредственно с устройства USB.