Во-первых, чтобы понять порядок загрузки драйверов, рекомендуется переключить диспетчер устройств на Просмотр | Устройства в режиме подключения .
Как вы могли заметить, устройства расположены под драйвером шины. Для устройств 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 имеет локализованные строки.]