2

我正在尝试打开作为复合设备一部分的 WinUSB 设备。我已经使用 cfgmgr32 找到了正确的子设备,并且有它的 DEVINST 编号。为了用 WinUSB 打开它,我需要首先调用 CreateFile,为此我需要设备路径。

设备路径如下所示:

\\\\?\\usb#vid_9999&pid_0102#3555303335351909000b0#{a5dcbf10-6530-11d2-901f-00c04fb951ed}

如何获取设备路径?

4

2 回答 2

1

这个函数返回一个以 NULL 结尾的设备路径列表(这就是我们从中得到的CM_Get_Device_Interface_List

您需要将其传递DEVINST给所需的接口GUID

由于指定了 DEVINST 和接口 GUID,因此很可能CM_Get_Device_Interface_List会为该接口返回单个设备路径,但从技术上讲,您应该准备好获得多个结果。

我在生产代码中成功地使用了这个函数来获取 USB HUB 的设备接口(GUID_CLASS_USBHUB):我使用 CreateFile 生成的设备路径并成功打开它。

delete[]如果函数成功返回(返回代码 0),则由调用者对返回列表负责

int GetDevInstInterfaces(DEVINST dev, LPGUID interfaceGUID, wchar_t**outIfaces, ULONG* outIfacesLen)
{
    CONFIGRET cres;
    if (!outIfaces)
        return -1;
    if (!outIfacesLen)
        return -2;

    // Get System Device ID
    WCHAR sysDeviceID[256];
    cres = CM_Get_Device_ID(dev, sysDeviceID, sizeof(sysDeviceID) / sizeof(sysDeviceID[0]), 0);
    if (cres != CR_SUCCESS)
        return -11;

    // Get list size
    ULONG ifaceListSize = 0;
    cres = CM_Get_Device_Interface_List_Size(&ifaceListSize, interfaceGUID, sysDeviceID, CM_GET_DEVICE_INTERFACE_LIST_PRESENT);
    if (cres != CR_SUCCESS)
        return -12;

    // Allocate memory for the list
    wchar_t* ifaceList = new wchar_t[ifaceListSize];

    // Populate the list
    cres = CM_Get_Device_Interface_List(interfaceGUID, sysDeviceID, ifaceList, ifaceListSize, CM_GET_DEVICE_INTERFACE_LIST_PRESENT);
    if (cres != CR_SUCCESS) {
        delete[] ifaceList;
        return -13;
    }

    // Return list
    *outIfaces = ifaceList;
    *outIfacesLen = ifaceListSize;

    return 0;
}
于 2019-07-02T13:09:31.113 回答
0

我建议查看get_filename_from_devinst_and_guid函数,它是libusbp的一部分。

基本大纲是:

  1. 确保您知道要查找的设备接口 GUID。那就是您提供的文件名末尾括号中的内容。这通常来自设置 WinUSB 的 INF 文件,但也可能来自设备上的 MS OS 描述符。您可以在注册表中找到它。您必须将其打包到 Win32 APIGUID结构中。
  2. 调用SetupDiGetClassDevs(guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);以获取支持该设备接口 GUID 的所有现有(已连接)设备的列表。
  3. 用于SetupDiEnumDeviceInfo遍历列表,直到找到与已找到的 DEVINST 匹配的项目。
  4. 用于SetupDiEnumDeviceInterfaces获取该项目的接口列表。应该只有一个条目,因为您已经指定了您感兴趣的设备接口 GUID。
  5. 用于SetupDiGetDeviceInterfaceDetail获取SP_DEVICE_INTERFACE_DETAIL_DATA_A数据结构。
  6. 您要查找的文件名位于DevicePath该结构的成员中。
于 2018-05-31T15:44:17.637 回答