получение серийного номера USB-клавиатуры под Windows - PullRequest
3 голосов
/ 07 апреля 2009

Многие USB-устройства содержат уникальный серийный номер (который на самом деле является строкой Unicode), который хост может использовать вместе с 16-разрядным поставщиком и номерами идентификаторов продуктов для уникальной идентификации устройства.

Я пытаюсь выяснить, как написать приложение для Windows, которое могло бы отображать список всех устройств с интерфейсом USB, подключенных к системе. В списке будет по одной строке для каждого HID, включая системные клавиатуры. В списке будут столбцы для идентификатора поставщика, идентификатора продукта и серийного номера.

Я могу получить список USB HID, вызвав SetupDiGetClassDevs с GUID, возвращаемым HidD_GetHidGuid, и просматривая результат, повторно вызывая SetupDiEnumDeviceInterfaces. Затем я могу позвонить SetupDiGetDeviceInterfaceDetail, чтобы получить путь к каждому устройству, которое я могу открыть с помощью CreateFile, при условии, что я не буду запрашивать ни разрешения на чтение, ни запись, что было бы запрещено для системной клавиатуры. Оттуда я могу получить номера поставщиков и идентификаторы продуктов, набрав HidD_GetAttributes.

Мне трудно понять, как извлечь строку с серийным номером. Когда я ищу решения этой проблемы, я нахожу много информации о том, как получить серийные номера для запоминающих устройств USB, но ничего похожего на то, что не может быть применимо к любому другому типу USB-устройства. Я был бы счастлив обнаружить или универсальный метод или HID-специфический метод получения строки серийного номера.

У меня такое ощущение, что порт Win32 libusb может справиться с этим без особых проблем, но, к сожалению, мне нужно решение, которое зависит только от библиотек, поставляемых с Windows, таких как библиотеки setupapi и hid. которые содержат функции, упомянутые выше.

Любые предложения будут очень признательны!

Ответы [ 5 ]

5 голосов
/ 23 апреля 2009

Оказывается, HID.dll определяет функцию с именем HidD_GetSerialNumberString, которая делает именно то, что я хочу, учитывая дескриптор, который я получил от CreateFile, как описано выше. Только что попробовал, и это прекрасно работает. Есть также функции HidD_GetManufacturerString и HidD_GetProductString для извлечения других строковых дескрипторов, упомянутых в дескрипторе устройства, и даже HidD_GetIndexedString для получения произвольного строкового дескриптора с учетом его индекса (предположительно, потому что дескриптору HID разрешено содержать строку индексы дескриптора). Теперь я чувствую себя довольно глупо - ответ был прямо у меня под носом все это время.

Спасибо всем, что нашли время, чтобы прочитать и ответить на мой вопрос! Я собираюсь принять ответ Альфанео, поскольку он звучит довольно многообещающе, и на самом деле я ждал загрузки DDK, когда наткнулся на этот ответ.

3 голосов
/ 22 апреля 2009

Вы пробовали исходный код USBVIew, который поставляется вместе с DDK. Инструмент USBView отображает серийный номер для любого устройства USB, а источник поставляется с DDK.

0 голосов
/ 08 марта 2010

вы можете использовать GetVolumeInformation для получения серийного номера любого подключенного оборудования.

0 голосов
/ 13 апреля 2009

Я рекомендую эту книгу USB Complete . Глава 4 Перечисление: откуда ведущий узнает об устройствах и получает необходимую информацию.

Эта страница содержит множество ссылок на информацию, а для вас - ссылки на библиотеки и утилиты, которые вы можете использовать.

0 голосов
/ 09 апреля 2009

Вы пытались найти документацию по HID-определению входных записей, выходных записей и записей функций для клавиатур Hid. Это должно показать вам список «вещей», которые вы можете получить / ввести с клавиатуры через HID.

Кроме того, я знаю, что можно перечислить определение записи HID с помощью программного обеспечения. Я сделал нечто подобное около 1 года назад, но я не могу вспомнить детали в верхней части моей головы. Это позволит вам увидеть, что класс USB клавиатуры публикует как стандартный интерфейс.

Я надеюсь, что это поможет вам найти несколько указателей, чтобы узнать, что вы ищете. Извините, я не могу быть более точным!

...