Does SetupDiGetClassDevs work with device instance IDs as documented? Does SetupDiGetClassDevs work with device instance IDs as documented? windows windows

Does SetupDiGetClassDevs work with device instance IDs as documented?


It seems you have to either specify the DIGCF_ALLCLASSES flag to find all classes that match the given device instance id, or else specify the ClassGuid and use the DIGCF_DEFAULT flag.

This worked for me:

void error(DWORD err){    WCHAR buf[0x200];    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, buf, 0x200, NULL);    wprintf(L"%x: %s\n", err,  buf);}int _tmain(int argc, _TCHAR* argv[]){    PCWSTR devinst = L"HID\\VID_413C&PID_2105\\6&22CE0F66&0&0000";    HDEVINFO hinfo = SetupDiGetClassDevs(NULL, devinst, NULL, DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES);    if (hinfo == INVALID_HANDLE_VALUE)    {        error(GetLastError());        return 1;    }    SP_DEVINFO_DATA dinfo;    dinfo.cbSize = sizeof(dinfo);    int ix = 0;    while (SetupDiEnumDeviceInfo(hinfo, ix++, &dinfo))    {        wprintf(L"Match\n");    }    error(GetLastError());    SetupDiDestroyDeviceInfoList(hinfo);    return 0;}

With output:

Match103: No more data is available.


It seems that you're misunderstanding DBT_DEVICEARRIVAL.

There are a few different types of DBT_DEVICEARRIVAL messages-- for a volume, for a handle, for a device interface. I'm guessing you're talking about the DBT_DEVTYP_DEVICEINTERFACE variety. In this case, the dbcc_name field of the DEV_BROADCAST_DEVICEINTERFACE structure will contain the "device interface path".

The "device interface path" is NOT the same as a "device instance ID".

If you want to know more information about this device, you should enumerate all device interfaces by this device interface GUID (through SetupDiGetClassDevs with DIGCF_DEVICEINTERFACE), and compare the dbcc_name to the strings retrieved by SetupDiEnumDeviceInterfaces.