从设备实例路径字符串获取设备实例 DWORD

che*_*ral 5 c++ windows winapi device-driver device-instance-id

我得到一个设备实例路径,例如

L"\\\\?\\USB#VID_0403&PID_6001#6&2cc2d230&0&2#{219d0508-57a8-4ff5-97a1-bd86587c6c7e}"
Run Code Online (Sandbox Code Playgroud)

来自IWDFRemoteInterfaceInitialize::RetrieveSymbolicLink
但对于CM_Get_Parent我需要设备的 DEVINST/DWORD 这让我发疯。
我试过例如

instancePath = L"\\\\?\\USB#VID_0403&PID_6001#6&2cc2d230&0&2#{219d0508-57a8-4ff5-97a1-bd86587c6c7e}";
HDEVINFO hinfo = SetupDiGetClassDevs(NULL, instancePath, NULL, DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES);
Run Code Online (Sandbox Code Playgroud)

和其他一些SetupDi...巫毒没有成功。非常感谢任何帮助,因为 - 正如所提到的 - 我现在几个小时都无法解决这种疯狂问题,尽管有数十个相反的示例(devid->实例路径),但我还没有找到任何实例路径->DEVINST。

gog*_*gog 1

正如你所说,没有直接的方法。

但是,您应该能够通过一些字符串编辑从设备路径/设备接口 ID 中获取设备实例 ID,具体步骤如下:

  1. 完全删除起始\\\\?\\部分,直到USB.
  2. 完全删除最后{...}一部分
  3. #用。。。来代替\

从...开始

"\\\\?\\USB#VID_0403&PID_6001#6&2cc2d230&0&2#{219d0508-57a8-4ff5-97a1-bd86587c6c7e}"
Run Code Online (Sandbox Code Playgroud)

你现在应该有

"USB\VID_0403&PID_6001\6&2cc2d230&0&2\"
Run Code Online (Sandbox Code Playgroud)

这应该是有效的设备实例 ID。如果不是,请尝试也删除最后一个“\”。

然后,您可以将其提供给CM_Locate_DevNode()并获取所需的 DEVINST。