Как получить дескриптор устройства USB, выполнив DeviceIoControl () непосредственно на устройстве? - PullRequest
0 голосов
/ 05 июня 2018

Я хочу получить дескриптор устройства USB-устройств в моей системе.Я создаю приложение пользовательского пространства в Windows (неуправляемый, родной C ++).Из этих дескрипторов я хочу идентифицировать рекламные щиты и проанализировать дескриптор возможностей рекламного щита (синтаксический анализ bos descriptor).

Вот мой подход.

  1. Получить устройства USB в системе с помощью SetupDiGetClassDevs(&GUID_CLASS_USB_DEVICE,...)
  2. Получить путь к устройству каждого устройства, используя SetupDiGetDeviceInterfaceDetail()
  3. Используйте CreateFile() в пути к устройству, чтобы получить дескриптор устройства.
  4. Выпуск 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.

...