Windows 设备管理器和硬件 ID
Posted
技术标签:
【中文标题】Windows 设备管理器和硬件 ID【英文标题】:Windows device manager and hardware IDs 【发布时间】:2009-05-09 15:34:01 【问题描述】:我很好奇 Windows 设备管理器如何获取设备的硬件 ID,即使尚未为该设备加载任何设备驱动程序。有人知道 Windows 是如何处理这个问题的吗?
在相关说明中,我有兴趣支持我们正在编写的软件的语言本地化;设备和/或驱动程序是否可以以本地化方式报告其友好名称和描述?是否已经有这方面的普遍做法?
感谢您的宝贵时间。
【问题讨论】:
【参考方案1】:首先,要了解加载驱动程序的顺序,建议您将设备管理器切换到查看|设备按连接方式。
如您所见,这些设备位于其总线驱动程序下方。对于 PCI 设备,它将是“PCI 总线”。对于 USB 设备,它将是它们的 USB 集线器。每个总线驱动程序对于如何格式化标识符字符串都有自己的想法:
设备实例 ID 硬件 ID 兼容的 ID 位置等它返回它们以响应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
信息确实旨在本地化。为此,您会在输入数据 (Parameters.QueryDeviceText.LocaleId
) 中收到请求的区域设置 ID (LCID)。
[正如 Alphaneo 所指出的,USB 集线器驱动程序可能会将此 LCID 向前传递给 USB 设备(在 Get String Descriptor 请求中),希望 USB 设备本身具有本地化字符串。]
【讨论】:
【参考方案2】:顶层过程称为枚举。大多数现代设备总线都支持一种机制,让操作系统可以查询总线并确定哪些设备连接到总线。
PCI 系列总线都支持枚举。 PCI 总线有一个特殊的enumeration space 就是为了这个。这就是“即插即用”ID 的来源。
设备 ID 唯一标识总线上的设备,并使操作系统能够为该设备找到正确的驱动程序。
其他总线,包括 USB 和 FireWire 都有枚举策略
【讨论】:
【参考方案3】:设备 ID,是设备提供的信息的组合。例如,对于 USB 设备,字符串基于 VID 和 PID(供应商 ID 和产品 ID)。现在,如果没有加载驱动程序,这将不会发生。至少需要为操作系统加载一些驱动程序、总线驱动程序才能获取设备 ID。
现在,对于语言支持,我想对于 WDM 驱动程序,有一个 QUERY_LANG 之类的东西,我记不太清了,或者像 USB 之类的一些设备有语言 ID 支持。此语言 ID 确定产品描述符字符串的语言。
【讨论】:
【参考方案4】:请注意,硬件标识符/序列号与真正的唯一硬件 ID 之间存在差异。也许这会更好地解释它: http://www.soft.tahionic.com/download-hdd_id/hardware%20ID%20programmer%27s%20DLL.html
【讨论】:
该链接中的有趣库。以上是关于Windows 设备管理器和硬件 ID的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Tizen Studio 安装设备管理器和模拟器管理器?