如何从 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查询设备实例路径,使用WdfDeviceAllocAndQueryPropertyEx
或IoGetDevicePropertyData
(传递WDM物理设备对象)
【讨论】:
非常感谢。在 Win81 上验证,IoGetDevicePropertyData
和 PropertyKey=&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 内核驱动程序获取设备实例路径?的主要内容,如果未能解决你的问题,请参考以下文章