Я хочу получить дескриптор устройства USB-устройств в моей системе. Я создаю приложение пользовательского пространства в Windows (неуправляемый, собственный С++). Из этих дескрипторов я хочу идентифицировать рекламные щиты и проанализировать дескриптор возможностей рекламного щита (анализ дескриптора bos).
Вот мой подход.
- Получите USB-устройства в системе с помощью
SetupDiGetClassDevs(&GUID_CLASS_USB_DEVICE,...)
- Получите путь к каждому устройству, используя
SetupDiGetDeviceInterfaceDetail()
- Используйте
CreateFile()
в пути к устройству, чтобы получить дескриптор устройства. - Выполните
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION
IOCTL, используяDeviceIoControl()
и дескриптор, чтобы получить дескриптор устройства.
Я застрял на 4-м шаге (getLastError() - Invalid Function
).
Другие проекты (подобно этому примеру кода от Intel), перечислите все USB-контроллеры в системе, корневые концентраторы, порты и интерфейсы и выдайте IOCTL на дескриптор корневого концентратора, указывающий номер порта, к которому подключено устройство.
Я не хочу беспокоиться об иерархии USB в системе. Это менее подвержено ошибкам и проще получить USB-устройства в системе с помощью API установки. Однако нигде я не вижу, чтобы IOCTL выдавался им напрямую.
Обновление1
Из docs.microsoft.com:IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION
Запрос управления вводом-выводом извлекает один или несколько дескрипторов для устройства, связанного с указанным индексом порта. Этот запрос нацелен на USB-концентратор (GUID_DEVINTERFACE_USB_HUB). Таким образом, этот ioctl, который может дать мне дескриптор USB-устройства, предназначен для обработки USB-концентратором, а НЕ USB-устройством.
Поэтому другие решения передают дескриптор концентратора в DeviceIoControl(), как видно на Строка 68 исходного кода от Intel (Linked здесь).
Вместо этого я хочу использовать дескриптор, полученный на шаге 3 (дескриптор устройства) выше, чтобы получить дескриптор устройства. Таким образом, IOCTL может быть другим, или, возможно, есть способ получить дескриптор концентратора и индекс порта, к которому подключено устройство, используя дескриптор USB-устройства.
На мой взгляд, дескриптор устройства является неотъемлемым свойством USB-устройства, и поэтому должен быть способ получить его непосредственно с USB-устройства.
pacman -S mingw-w64-x86_64-usbview
в MSYS2). - person David Grayson   schedule 05.06.2018IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION
, и убедиться, что вы делаете то же самое. - person David Grayson   schedule 05.06.2018