我正在尝试打开作为复合设备一部分的WinUSB设备。我使用cfgmgr32找到了正确的子设备,并且有DEVINST编号。为了用WinUSB打开它,我需要先调用CreateFile,我需要设备路径。
设备路径如下所示:
\\\\?\\usb#vid_9999&pid_0102#3555303335351909000b0#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
如何获取设备路径?
答案 0 :(得分:1)
此函数返回以NULL结尾的设备路径的列表(这是我们从CM_Get_Device_Interface_List
获得的信息)
您需要将其传递给DEVINST
和所需的接口GUID
。
由于同时指定了DEVINST和接口GUID,CM_Get_Device_Interface_List
很可能会为该接口返回一个设备路径,但是从技术上讲,您应该准备得到多个结果。
我在生产代码中成功使用此功能来获取USB HUB(GUID_CLASS_USBHUB
)的设备接口:我将生成的设备路径与CreateFile一起使用并成功打开了它。
如果函数成功返回(返回码0),则调用方有责任delete[]
返回列表
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;
}
答案 1 :(得分:0)
我建议查看属于get_filename_from_devinst_and_guid的libusbp函数。
基本概要是:
GUID
结构中。SetupDiGetClassDevs(guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
以获取支持该设备接口GUID的所有现有(已连接)设备的列表。SetupDiEnumDeviceInfo
遍历列表,直到找到与您已找到的DEVINST相匹配的项目。SetupDiEnumDeviceInterfaces
获取该项目的接口列表。应该只有一个条目,因为您已经指定了您感兴趣的设备接口GUID。SetupDiGetDeviceInterfaceDetail
获取SP_DEVICE_INTERFACE_DETAIL_DATA_A
数据结构。DevicePath
成员中。