Разрешение иерархии Win32_PnPEntities в WMI - PullRequest
0 голосов
/ 06 января 2012

Я использую запрос WMI для получения событий, когда USB-устройства подключены или отключены.

SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_USBControllerDevice'

Из полученных событий я беру объект Dependent, чтобы получить Win32_PnPEntity.

Проблема в том, что для практически любого физического устройства существует как минимум два логических устройства. Поэтому я получаю такие данные, как:

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";
};

Очевидно, что LPK25 - это реальное устройство, а USB Composite Device - это некая псевдо-сущность. За мышь я получаю четыре объекта. Для игрового контроллера три и т. Д. Итак, как мне определить, какой из них является «реальным»?

1 Ответ

0 голосов
/ 06 января 2012

В моем понимании вы путаете, для меня это нормально, вы получаете два события.Это потому, что появляются два новых объекта.

  1. Низкоуровневый объект для вас usbccgp - это низкоуровневый драйвер для USB-аудио.
  2. Высокоуровневый объект, поддерживающий ваше аудиооборудование.

Я думаю, что вы должны фильтровать по сервису, например, я тестирую с помощью USB-ключа, и у меня есть два события, одно для USBSTOR (низкий уровень) и второе для disk (высокий уровень).

...