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

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

В связи с этим я заинтересован в поддержке языковой локализации для программного обеспечения, которое мы пишем; Возможно ли, чтобы устройство и / или драйвер сообщали свое понятное имя и описание локализованным способом? Есть ли уже распространенная практика для этого?

Спасибо за ваше время.

4 ответа

Решение

Во-первых, чтобы понять порядок загрузки драйверов, рекомендуется переключить Диспетчер устройств в View | Устройства по режиму подключения.

Как вы могли заметить, устройства расположены под драйвером шины. Для устройств PCI это будет "шина PCI". Для USB-устройств это будет их USB-концентратор. У каждого драйвера шины есть свое представление о том, как должны быть отформатированы строки идентификаторов:

  • Идентификатор экземпляра устройства
  • Аппаратные идентификаторы
  • Совместимые идентификаторы
  • Местоположение и т. Д.

Он возвращает их в ответ на IRP_MN_QUERY_ID (BusQueryInstanceID, BusQueryHardwareIDs, BusQueryCompatibleIDs) а также IRP_MN_QUERY_DEVICE_TEXT (DeviceTextDescription, DeviceTextLocationInformation так далее.)

Конечно, поскольку драйвер шины перечислял устройства (т. Е. Создавал дочерние устройства, которые вы видите) в первую очередь (через любой стандартный интерфейс, подходящий для шины, например, "Get Device/String Descriptor" на 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, имеют стратегии перечисления

Обратите внимание, что существует разница между идентификатором оборудования / серийным номером и истинным уникальным идентификатором оборудования. Может быть, это объяснит это лучше: http://www.soft.tahionic.com/download-hdd_id/hardware%20ID%20programmer%27s%20DLL.html

Идентификатор устройства, представляет собой комбинацию информации, получаемой от устройства. Например, для устройства USB строка основана на VID и PID (идентификатор поставщика и идентификатор продукта). Теперь это не может произойти, если драйвер не загружен. По крайней мере, какой-то драйвер, драйвер шины должен быть загружен для ОС, чтобы получить идентификатор устройства.

Теперь, для языковой поддержки, я думаю, что для драйвера WDM, есть QUERY_LANG или что-то, я не помню правильно, в качестве альтернативы, некоторые устройства, такие как USB, имеют поддержку ID языка. Этот идентификатор языка определяет язык строки дескриптора продукта.

Другие вопросы по тегам