Диспетчер устройств Windows и идентификаторы оборудования
-
20-08-2019 - |
Вопрос
Мне любопытно, как диспетчер устройств Windows получает идентификаторы оборудования для устройства, даже если для этого устройства еще не загружен драйвер устройства.Кто-нибудь знает, как Windows об этом думает?
Кстати, я заинтересован в поддержке языковой локализации программного обеспечения, которое мы пишем;Возможно ли, чтобы устройство и/или драйвер возвращали свое понятное имя и описание в локализованной форме?Существует ли уже общепринятая практика для этого?
Спасибо за ваше время.
Решение
Во-первых, чтобы понять порядок загрузки драйверов, рекомендуется переключить Диспетчер устройств в режим Посмотреть | Устройства по соединению режим.
Как вы могли заметить, устройства расположены под драйвером шины.Для устройств PCI это будет «шина PCI».Для USB-устройств это будет USB-концентратор.У каждого драйвера шины есть собственное представление о том, как следует форматировать строки идентификаторов:
- Идентификатор экземпляра устройства
- Идентификаторы оборудования
- Совместимые идентификаторы
- Местоположение и т. д.
Он возвращает их в ответ на IRP_MN_QUERY_ID
(BusQueryInstanceID
, BusQueryHardwareIDs
, BusQueryCompatibleIDs
) и IRP_MN_QUERY_DEVICE_TEXT
(DeviceTextDescription
, DeviceTextLocationInformation
и т. д.)
Конечно, поскольку драйвер шины перечислил устройства (т.создал дочерние устройства, которые вы видите) в первую очередь (через любой стандартный интерфейс, подходящий для шины;например«Получить дескриптор устройства/строки» на USB), он знает идентификатор поставщика, идентификатор продукта и т. д.
Драйвер устройства на этом этапе загружать не требуется.Фактически его невозможно загрузить.Идентификаторы устройств — это именно то, что указывает системе PnP, какой драйвер соответствует устройству.
Что касается локализации:
В отличие от IRP_MN_QUERY_ID
, который предоставляет непрозрачные строки, предназначенные для сопоставления устройств, IRP_MN_QUERY_DEVICE_TEXT
информация действительно предназначалась для локализации.Для этого вы получаете запрошенный идентификатор локали (LCID) во входных данных (Parameters.QueryDeviceText.LocaleId
).
[Как отметил Alphaneo, драйвер USB-концентратора может передать этот LCID на USB-устройство (в рамках запроса Get String Descriptor), надеясь, что само USB-устройство имеет локализованные строки.]
Другие советы
Процесс верхнего уровня называется перечислением.Большинство современных шин устройств поддерживают механизм, который позволяет ОС опрашивать шину и определять, какие устройства к ней подключены.
Все шины семейства PCI поддерживают перечисление.Шина PCI имеет специальный пространство перечисления только для этого.Вот откуда берутся идентификаторы Plug-n-Play.
Идентификатор устройства однозначно идентифицирует устройство на шине и позволяет ОС найти правильный драйвер для этого устройства.
Другие шины, включая USB и FireWire, имеют стратегии нумерации.
Идентификатор устройства — это комбинация информации, предоставленной устройством.Например, для USB-устройства строка основана на VID и PID (идентификатор поставщика и идентификатор продукта).Теперь этого не может произойти, если драйвер не загружен.По крайней мере, какой-нибудь драйвер, драйвер шины должен быть загружен, чтобы ОС получила идентификатор устройства.
Теперь, что касается языковой поддержки, я думаю, для драйвера WDM есть QUERY_LANG или что-то в этом роде, я точно не помню, в качестве альтернативы некоторые устройства, такие как USB, имеют поддержку идентификатора языка.Этот идентификатор языка определяет язык строки дескриптора продукта.
Обратите внимание, что существует разница между идентификатором/серийным номером оборудования и настоящим уникальным идентификатором оборудования.Возможно, это объяснит это лучше:http://www.soft.tahionic.com/download-hdd_id/hardware%20ID%20programmer%27s%20DLL.html