I’m using a WMI query to receive events when USB devices are plugged or unplugged.
SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_USBControllerDevice'
From the received events I’m taking the Dependent object to get a Win32_PnPEntity.
The problem is, for pretty much any physical device, there are at least two logical devices.
So I’m receiving data such as:
Device unplugged: LPK25
Device unplugged: USB Composite Device
Device plugged: LPK25
instance of Win32_PnPEntity
{
Caption = "LPK25";
ClassGuid = "{4d36e96c-e325-11ce-bfc1-08002be10318}";
CompatibleID = {"USB\\Class_01&SubClass_01&Prot_00", "USB\\Class_01&SubClass_01", "USB\\Class_01"};
ConfigManagerErrorCode = 0;
ConfigManagerUserConfig = FALSE;
CreationClassName = "Win32_PnPEntity";
Description = "USB Audio Device";
DeviceID = "USB\\VID_09E8&PID_0076&MI_00\\6&383464A1&0&0000";
HardwareID = {"USB\\VID_09E8&PID_0076&REV_0100&MI_00", "USB\\VID_09E8&PID_0076&MI_00"};
Manufacturer = "(Generic USB Audio)";
Name = "LPK25";
PNPDeviceID = "USB\\VID_09E8&PID_0076&MI_00\\6&383464A1&0&0000";
Service = "usbaudio";
Status = "OK";
SystemCreationClassName = "Win32_ComputerSystem";
SystemName = "COMPUTER";
};
Device plugged: USB Composite Device
instance of Win32_PnPEntity
{
Caption = "USB Composite Device";
ClassGuid = "{36fc9e60-c465-11cf-8056-444553540000}";
CompatibleID = {"USB\\DevClass_00&SubClass_00&Prot_00", "USB\\DevClass_00&SubClass_00", "USB\\DevClass_00", "USB\\COMPOSITE"};
ConfigManagerErrorCode = 0;
ConfigManagerUserConfig = FALSE;
CreationClassName = "Win32_PnPEntity";
Description = "USB Composite Device";
DeviceID = "USB\\VID_09E8&PID_0076\\5&385A3465&0&2";
HardwareID = {"USB\\VID_09E8&PID_0076&REV_0100", "USB\\VID_09E8&PID_0076"};
Manufacturer = "(Standard USB Host Controller)";
Name = "USB Composite Device";
PNPDeviceID = "USB\\VID_09E8&PID_0076\\5&385A3465&0&2";
Service = "usbccgp";
Status = "OK";
SystemCreationClassName = "Win32_ComputerSystem";
SystemName = "COMPUTER";
};
Obviously, the LPK25 of these is the real device, while the USB Composite Device is some pseudo-entity.
For a mouse, I get four entities. For a game controller three, etc.
So how do I figure out which one of them is the “real thing?”
In my understanding you are making a confusion, for me it’s normal you receive two events. It’s because two new objects appears.
usbccgpis the low level driver for usb audio.I think that you have to filter by service, for example I test with a USB key and I’ve got two events, one for
USBSTOR(low level) and a second fordisk(high level).