Диспетчер устройств Windows и идентификаторы оборудования

StackOverflow https://stackoverflow.com/questions/843504

Вопрос

Мне любопытно, как диспетчер устройств 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top