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