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_IDBusQueryInstanceIDBusQueryHardwareIDsBusQueryCompatibleIDs)和IRP_MN_QUERY_DEVICE_TEXTDeviceTextDescriptionDeviceTextLocationInformation 等)

当然,由于总线驱动程序首先枚举了设备(即创建了您所看到的子设备)(通过适用于总线的任何标准接口;例如 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的主要内容,如果未能解决你的问题,请参考以下文章

windows任务管理器和任务列表中显示不同的内存使用情况

进程资源管理器和任务管理器之间的区别[关闭]

如何为 Tizen Studio 安装设备管理器和模拟器管理器?

配置管理器和命令行

Windows 11 新版 22598 发布!引入 4K 聚焦壁纸,优化全新任务管理器和媒体播放器...

Linux下怎么使用任务管理器和进程管理