我很好奇Windows设备管理器如何获取设备的硬件ID,即使设备尚未加载任何设备驱动程序。有人知道Windows如何对此进行处理吗?
在相关的说明中,我感兴趣的是支持我们正在编写的软件的语言本地化;设备和/或驱动程序是否有可能以本地化的方式报告其友好名称和描述?这已经有了常见的做法吗?
感谢您的时间。
答案 0 :(得分:5)
首先,要了解加载驱动程序的顺序,建议您将设备管理器切换到 View |设备按连接模式。
正如您所注意到的,这些设备位于其总线驱动程序下方。对于PCI设备,它将是“PCI总线”。对于USB设备,它将是他们的USB集线器。每个总线驱动程序都有自己的想法如何格式化标识符字符串:
它会返回它们以回复IRP_MN_QUERY_ID
(BusQueryInstanceID
,BusQueryHardwareIDs
,BusQueryCompatibleIDs
)和IRP_MN_QUERY_DEVICE_TEXT
(DeviceTextDescription
,{{1}等等。)
当然,由于总线驱动程序首先枚举了设备(即创建了您正在看到的子设备)(通过适用于总线的任何标准接口;例如USB上的“获取设备/字符串描述符”),它知道他们的供应商ID,产品ID等。
此时无需加载设备的驱动程序。实际上,它无法加载。设备ID正是PnP系统指示哪个驱动程序与设备匹配的原因。
关于本地化:
与提供用于设备匹配的不透明字符串的DeviceTextLocationInformation
不同,IRP_MN_QUERY_ID
信息确实是为了本地化。为此,您在输入数据(IRP_MN_QUERY_DEVICE_TEXT
)中收到请求的区域设置ID(LCID)。
[正如Alphaneo所说,USB集线器驱动程序可能会将此LCID向前传递到USB设备(在Get String Descriptor请求中),希望USB设备本身具有本地化字符串。]
答案 1 :(得分:1)
顶级进程称为枚举。大多数现代设备总线都支持一种机制,允许操作系统查询总线并确定哪些设备连接到总线。
PCI系列总线都支持枚举。 PCI总线只有一个特殊的enumeration space。这就是“即插即用”ID的来源。
设备ID唯一标识总线上的设备,并使操作系统能够找到该设备的正确驱动程序。
其他总线,包括USB和FireWire都有枚举策略
答案 2 :(得分:1)
设备ID,是设备提供的信息的组合。例如,对于USB设备,该字符串基于VID和PID(供应商ID和产品ID)。现在,如果没有加载驱动程序,则不会发生这种情况。至少有一些驱动程序,必须为操作系统加载总线驱动程序以获取设备ID。
现在,对于语言支持,我想对于WDM驱动程序,有一个QUERY_LANG或其他东西,我不记得正确,或者像USB这样的设备有语言ID支持。此语言ID确定产品描述符字符串的语言。
答案 3 :(得分:1)
请注意,硬件标识符/序列号与真正唯一的硬件ID之间存在差异。也许这会更好地解释它: http://www.soft.tahionic.com/download-hdd_id/hardware%20ID%20programmer%27s%20DLL.html