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
.