Взаимодействие с периферийными устройствами через WIN API
возникла необходимость получить информацию о USB-устройствах подключенных к ПК.
подскажите, как можно узнать: имя устройства, тип, версию драйверов, дату подключения или где можно найти подобную информацию?
Ответы (1 шт):
В общем случае, в Windows лично мне известны всего 4 способа получения информации об USB-девайсах. Если кто-то подскажет ещё - буду благодарен:
Читать из ветки реестра [HKLM\SYSTEM\CurrentControlSet\Enum\USB]. Для этого есть advapi32.dll и её функции типа
RegOpenKey() + RegQueryValue(). Это ручной разбор древа реестра, поэтому с кроссплатформенностью могут возникнуть проблемы.Более предпочтительный вариант - библиотека setupapi.dll с триадой её функций. Первая
SetupDiGetClassDevs(), которой нужно передать аргумент GUID_DEVCLASS_USB. ВтораяSetupDiEnumDeviceInfo()будет перечислять все USB, включая контролёры, хабы и их устройства. При помощи третьейSetupDiGetDeviceRegistryProperty()можно будет вытягивать уже порядка 64 различных свойств найденных девайсов.Прямое обращение к контролёру самого USB-устройства, с запросом на чтение его "дескрипторов". Производитель зашивает в них базовые сведения о своём продукте, вплоть до кол-ва конечных точек "Endpoint", их свойств, требуемой пропускной способности шины, мощности питания в мА, и многое другое (этой инфы нет в системном реестре). Для этого нужно будет найти хаб, к которому подключено устройство, открыть его через
CreateFile(), и посредствомDeviceIoControl()с кодом IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION отправить ему соответствующий "пакет-запроса".Функции из специальной либы WinUsb.dll. На сайте MSDN сказано, что данная библиотека была введена для устройств, у которых нет класс-драйвера (типа Storage, HID, etc), т.е. они не расспознаются в системе. В этом случае ОС подгружает драйвер WinUsb.sys и появляется возможность хоть как-то общаться с устройством. К примеру на моей Win-7 этот драйвер не загружается при включении машины (хотя в наличии имеется), поэтому я не могу вызывать напрямую функции из библиотеки WinUsb.dll, пока не подгружу привязанный к ней дров.