如何从 Windows 内核驱动程序获取设备实例路径?

Posted

技术标签:

【中文标题】如何从 Windows 内核驱动程序获取设备实例路径?【英文标题】:How to get Device Instance Path from Windows kernel driver? 【发布时间】:2017-06-27 09:09:40 【问题描述】:

看一下这个例子:Windows 7中的USB设备被报告有Device instance path(DevinstPath) USB\VID_1EAB&PID_0501\7&25C389C1&0&1 我知道它对应的就是所谓的注册表中的硬件密钥(hwkey)。

现在我的问题是:当我的 KMDF 驱动程序代码具有该 USB 设备的 WDFDEVICE 句柄时,我如何知道它的 DevinstPath?

我知道我可以

发送一个BusQueryDeviceID来实现所谓的device-id USB\VID_1EAB&PID_0501; 发送一个BusQueryInstanceID,实现所谓的instance-id 1

但我不知道如何获得所谓的“实例路径”。可以请一些内核专家告诉我如何获得它吗?

MSDN 文档在这方面似乎真的很模糊!

顺便说一句:我也意识到用户层函数 SetupDiGetDeviceInstanceId 实际上返回了 DevinstPath——尽管它被命名为“InstanceId”。

【问题讨论】:

【参考方案1】:

可以使用DEVPKEY_Device_InstanceId查询设备实例路径,使用WdfDeviceAllocAndQueryPropertyExIoGetDevicePropertyData(传递WDM物理设备对象)

【讨论】:

非常感谢。在 Win81 上验证,IoGetDevicePropertyDataPropertyKey=&DEVPKEY_Device_InstanceId 确实有效。可惜这个需要Vista+。 WdfDeviceAllocAndQueryPropertyEx 需要 KMDF 1.13,因此即使对于 Windows 7,它也不是股票期权。【参考方案2】:

设备实例 id 是自增序列。 您可以在注册表中找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum; 规则:NextPareneID.XXXXXXXX.N XXXXXX使用UUID计算crc32值(测试ok) N为1~9 Device Instance id 格式为 N&PareneID&random's number&index

enter image description here

【讨论】:

以上是关于如何从 Windows 内核驱动程序获取设备实例路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何探索windows内核中未知的数据结构

如何从 Windows 内核获取电池电量通知?

如何获取嵌入式设备的内核版本信息

如何从 Win32 API 中的总线关系中获取设备实例路径

如何从 DEV_BROADCAST_DEVICEINTERFACE 和设备实例 ID 中获取友好的设备名称

如何从 Windows 驱动程序(又名内核空间)确定 CPU 和内存消耗