Диспетчер устройств 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 языка. Этот идентификатор языка определяет язык строки дескриптора продукта.