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

时间:2012-11-26 10:41:44

标签: c++ windows winapi device-driver

我得到了一个像

这样的设备实例路径
L"\\\\?\\USB#VID_0403&PID_6001#6&2cc2d230&0&2#{219d0508-57a8-4ff5-97a1-bd86587c6c7e}"

来自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);

和其他一些SetupDi ...伏都教没有成功。任何帮助都受到高度赞赏,因为 - 如上所述 - 我现在无法绕过这种疯狂几个小时,虽然有相反的几十个例子(devid->实例路径)但我还没有找到任何帮助例如path-> DEVINST。

2 个答案:

答案 0 :(得分:0)

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

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

  1. 完全移除\\\\?\\的开始部分,直到USB
  2. 完全删除最后{...}部分
  3. #替换为\

开始
"\\\\?\\USB#VID_0403&PID_6001#6&2cc2d230&0&2#{219d0508-57a8-4ff5-97a1-bd86587c6c7e}"

您现在应该拥有

"USB\VID_0403&PID_6001\6&2cc2d230&0&2\"

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

然后,您可以将其输入CM_Locate_DevNode()并获取所需的DEVINST。

答案 1 :(得分:0)

虽然修改路径可能会起作用,但Windows文档明确指出您不应解析设备路径。

不过,您可以使用CfgMgr32 API来做到这一点,方法是使用CM_Get_Device_Interface_PropertyW()和DEVPKEY_Device_InstanceId:

#include <cfgmgr32.h>
#include <initguid.h> // needed for devpkey.h to parse properly
#include <devpkey.h>

#include <cassert>
#include <string>
#include <vector>

std::wstring map_path(LPCWSTR device_path) {
    ULONG buf_size = 0;
    DEVPROPTYPE type;
    CM_Get_Device_Interface_PropertyW(
        name, &DEVPKEY_Device_InstanceId, &type,
        nullptr, &buf_size, 0);

    std::vector<BYTE> buffer(buf_size);
    auto result = CM_Get_Device_Interface_PropertyW(
        name, &DEVPKEY_Device_InstanceId, &type,
        buffer.data(), &buf_size, 0);
    assert(result == CR_SUCCESS);
    assert(type == DEVPROP_TYPE_STRING);

    // buffer will be null-terminated
    return reinterpret_cast<wchar_t*>(buffer.data());
}