Эта функция возвращает список путей к устройствам с нулевым символом в конце (это то, что мы получаем из CM_Get_Device_Interface_List
)
Вам необходимо передать ему DEVINST
и требуемый интерфейс GUID
.
Поскольку указаны и DEVINST, и GUID интерфейса, весьма вероятно, что CM_Get_Device_Interface_List
вернет один путь к устройству для этого интерфейса, но технически вы должны быть готовы получить более одного результата.
Я успешно использовал эту функцию в производственном коде для получения интерфейса устройства USB-концентратора (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;
}