First, to understand the order of drivers being loaded, you're recommended to switch the Device Manager into View | Devices by Connection mode.
As you would notice, the devices are located below their bus driver. For PCI devices, it'll be "PCI bus". For USB devices, it would be their USB hub. Each bus driver has its own idea about how the identifier strings should be formatted:
- Device Instance Id
- Hardware Ids
- Compatible Ids
- Location, etc.
It returns them in response to IRP_MN_QUERY_ID
(BusQueryInstanceID
, BusQueryHardwareIDs
, BusQueryCompatibleIDs
) and IRP_MN_QUERY_DEVICE_TEXT
(DeviceTextDescription
, DeviceTextLocationInformation
etc.)
Of course, since the bus driver enumerated the devices (i.e. created the child devices you're seeing) in the first place (through whatever standard interface appropriate for the bus; e.g. 'Get Device/String Descriptor' on USB), it knows their vendor ID, product ID etc.
The device's driver does not have to be loaded at this time. In fact, it can't be loaded. The device IDs are precisely what instructs the PnP system as to which driver matches the device.
As to localization:
Unlike IRP_MN_QUERY_ID
, which provides opaque strings intended for device matching, the IRP_MN_QUERY_DEVICE_TEXT
information was indeed intended to be localized. For that purpose, you receive the requested Locale ID (LCID) in the input data (Parameters.QueryDeviceText.LocaleId
).
[As Alphaneo noted, a USB hub driver might pass this LCID onwards to the USB device (within a Get String Descriptor request), hoping that the USB device itself has localized strings.]