Идентификатор USB-экземпляра в Windows уникален для устройства?
Я пытаюсь однозначно идентифицировать USB-устройство в системе Windows. Так как серийный номер является необязательным (и пустым на большинстве устройств), я смотрю на идентификатор экземпляра. Поле, которое похоже USB\VID_03F0&PID_094A\6&24b73976&0&2
,
Я уже знаю, что этот идентификатор меняется, если я подключаю одно и то же устройство к разным портам, но это нормально для меня. Вопрос в следующем: если я возьму идентичное устройство (мышь в моем примере) и подключу его, получит ли оно тот же или другой идентификатор экземпляра?
Я провел некоторое исследование, и никто, кажется, не совсем знает, какие части стоят за VID и PID. Кажется, они идентифицируют порт и / или концентратор, но если я подключу другое устройство к одному и тому же слоту, я вижу не только разные VID и PID, но и различный мусор после этого. Например, вот клавиатура, подключенная к тому же порту: USB\VID_046D&PID_C328&MI_00\7&3f9ff46&0&0000
Ни документация Microsoft, ни соответствующие вопросы здесь не отвечают на этот вопрос.
Если бы у меня было две одинаковые мыши (или клавиатуры, или что-то еще), то есть один и тот же производитель и модель, получат ли они одинаковые или разные идентификаторы экземпляра, если я подключу их к одному и тому же порту?
Есть ли у меня возможность однозначно идентифицировать конкретное устройство (а не только модель)?
2 ответа
По поводу вашего первого вопроса (в заголовке):
уникальный ли идентификатор экземпляра USB в Windows для устройства?
Выдержка со страницы идентификатора экземпляра устройства Microsoft:
Идентификатор экземпляра устройства - это строка идентификации устройства, предоставляемая системой, которая однозначно идентифицирует устройство в системе.
а также
Идентификатор экземпляра устройства сохраняется при перезапусках системы.
Итак, чтобы ответить на ваш вопрос:
Системный идентификатор устройства однозначно определяет устройство в конкретной системе Windows.
Остерегайтесь этого: его задача - идентифицировать устройство в этой машине. Как только вы удалите устройство из машины, оно больше не будет частью этой машины.
Итак, прямо сейчас вы не можете быть уверены, что идентификатор экземпляра устройства будет таким же, если вы удалите устройство из системы и снова подключите его, НО:
вы можете быть уверены, что идентификатор экземпляра устройства будет таким же, если вы перезапустите систему.
Давайте продолжим, исследуя ваши следующие вопросы.
По поводу вашего второго вопроса:
Если я возьму идентичное устройство (в моем примере мышь) и подключу его, он получит тот же или другой идентификатор экземпляра?
Давайте снова посмотрим на страницу идентификатора экземпляра устройства Microsoft:
Формат этой строки состоит из идентификатора экземпляра, соединенного с идентификатором устройства, как показано ниже:
<device-ID>\<instance-specific-ID>
а также
Ниже приведен пример идентификатора экземпляра ("1&08"), объединенного с идентификатором устройства для устройства PCI:
PCI\VEN_1000&DEV_0001&SUBSYS_00000000&REV_02\1&08
Итак, после USB\VID_xxx&PID_xxx\
часть, то, что вы видите, это Instance ID
(небольшая разница в названии vs System Device ID
)
Давайте посмотрим на страницу идентификатора экземпляра Microsoft:
Идентификатор экземпляра - это строка идентификации устройства, которая отличает устройство от других устройств того же типа на компьютере. Идентификатор экземпляра содержит информацию о серийном номере, если она поддерживается базовой шиной, или какую-либо информацию о местоположении.
а также
Член UniqueID в структуре DEVICE_CAPABILITIES для устройства указывает, является ли идентификатор экземпляра, предоставленный шиной, уникальным в системе, как показано ниже:
- Если для UniqueID установлено значение FALSE, идентификатор экземпляра, предоставленный шиной для устройства, уникален только для шины устройства. Диспетчер Plug and Play (PnP) изменяет идентификатор экземпляра, передаваемый по шине, и объединяет его с соответствующим идентификатором устройства, чтобы создать идентификатор экземпляра устройства, уникальный в системе.
- Если UniqueID имеет значение TRUE, идентификатор экземпляра устройства, сформированный из идентификатора устройства, передаваемого по шине, и идентификатора экземпляра, однозначно идентифицирует устройство в системе.
Итак, чтобы ответить на ваш вопрос:
- Если
UniqueID
являетсяTRUE
, идентификатор экземпляра устройства будет таким же, даже если вы переместите устройство на другой USB-порт (и я добавляю: это то, что происходит, когда USB-устройство предоставляет серийный номер) - Если
UniqueID
являетсяFALSE
, вы не можете быть уверены, что предоставленный шиной идентификатор экземпляра будет таким же, и поэтому вы не можете быть уверены, что весь идентификатор экземпляра устройства будет таким же. (Однако идентификатор экземпляра должен быть одинаковым при перезапуске системы, поэтому, если у вас есть устройства device1 и device2, которые идентичны, и меняйте их местами во время перезапуска системы, я предполагаю, что идентификатор экземпляра будет таким же, поэтому экземпляр устройства Идентификатор тоже будет таким же! Расширяя это, если устройство1 и устройство2 являются одним и тем же устройством, вы можете просто удалить устройство1 и повторно подключить его во время перезапуска системы, и идентификатор экземпляра устройства должен быть таким же!)
Это связано с тем, что задача System Device ID - идентифицировать устройства в системе, а не во всем мире (и, следовательно, устройства, отсоединенные от системы).
Это тоже ответ на ваш третий вопрос:
Если бы у меня были две похожие мыши (или клавиатуры, или что-то еще), то есть один и тот же производитель и модель, получили бы они одинаковые или разные идентификаторы экземпляра, если я подключу их к одному порту?
По поводу вашего последнего вопроса:
Есть ли у меня шанс однозначно идентифицировать конкретное устройство (а не только модель)?
Да, и (снова говоря о USB) вы можете однозначно идентифицировать конкретное устройство даже во всем мире, ЕСЛИ производитель предоставляет серийный номер на шине USB, И это гарантирует вам, что серийный номер уникален для этого конкретного (VID,PID) пара. Это очень жесткое ограничение, но, например, рассмотрим карту USB WiFi (у меня здесь есть карта Netgear):
- Он предоставляет серийный номер USB
- Серийный номер USB - это именно его MAC-адрес
Поскольку MAC-адреса по определению уникальны, вы можете быть уверены, что сможете однозначно идентифицировать это устройство, даже если оно подключено к другому компьютеру.
Однако вы не можете однозначно идентифицировать все устройства или конкретное устройство по вашему выбору. Он должен удовлетворять этим требованиям.
Дополнительные тесты
Я протестировал вышеупомянутую USB-карту WiFi Netgear, и она имеет тот же идентификатор экземпляра устройства, даже когда он подключен к разным портам и даже когда подключен к разным машинам.
Я протестировал общий USB-ключ, который предоставляет серийный номер USB, и его поведение было таким же, как и USB-карта WiFi.
В этих случаях идентификатор экземпляра устройства будет примерно таким:
USB\VID_1221&PID_3234\00004700356
Я протестировал две одинаковые стандартные USB-клавиатуры и подключил их (по одной) к одному и тому же USB-порту концентратора. Идентификатор экземпляра устройства остался прежним (и, кроме того, Windows не показывала всплывающее окно "Установка оборудования", когда я подключал вторую клавиатуру). Идентификатор экземпляра устройства был:
USB\VID_1C4F&PID_0002\7&15cdfaa&0&3
Затем я подключил одну из клавиатур к другому USB-порту, и идентификатор экземпляра устройства изменился на:
USB\VID_1C4F&PID_0002\5&2eab04ab&0&1
Больше ссылок
Если вы посмотрите на то, что делает Windows, когда вы подключаете USB-устройство с помощью анализатора протокола USB, вы можете увидеть, что оно начинается с чтения USB-дескрипторов. Это двоичные фрагменты данных, такие как дескриптор устройства (который имеет идентификатор производителя, идентификатор продукта и ревизию), дескриптор конфигурации (который говорит, какие интерфейсы поддерживает устройство и какие конечные точки оно использует), строковые дескрипторы (например, имя производителя, название продукта и серийный номер) и другие дескрипторы USB, которые были добавлены в различные расширения протокола USB.
Я не знаю точно, как Windows выбирает идентификатор экземпляра устройства, но вполне вероятно, что идентификатор является функцией байтов в этих дескрипторах, порта, к которому вы подключили устройство, и ничего больше. Маловероятно, что Windows использует какие-либо передовые методы снятия отпечатков пальцев, чтобы попытаться выявить незначительные различия между различными USB-устройствами, потому что это кажется напрасной тратой усилий. Я предполагаю, что основной смысл идентификатора экземпляра устройства заключается в том, что Windows может найти раздел реестра (внутри HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB), который указывает, какие драйверы он решил использовать в последний раз, когда устройство было подключено, и какие настройки он использовал для этих драйверов.
Универсальной корреляции между моделью устройства и его USB-дескрипторами не существует. У вас может быть две одинаково выглядящие клавиатуры с совершенно разными прошивками и дескрипторами USB, просто потому, что производитель решил обновить прошивку. У вас может быть две клавиатуры разных цветов, которые используют одну и ту же прошивку и, таким образом, выглядят идентично компьютеру, поскольку они будут одинаково реагировать на все возможные сообщения USB (это не просто фантазия от Star Trek).
Если я возьму идентичное устройство (мышь в моем примере) и подключу его, получит ли оно тот же или другой идентификатор экземпляра?
Он получит тот же идентификатор, если исходное устройство все еще не подключено. Для ОС просто невозможно определить разницу без уникальной строки серийного номера.