Обнаружение, когда удаленное NDIS-совместимое устройство подключено или отключено - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь определить, когда RNDIS-совместимое устройство подключено или отключено к моему компьютеру (через USB).

Я полагал, что следующая установка вызовет событие, когда устройство RNDIS будет подключено или отключено:

private System.ComponentModel.BackgroundWorker bgwDriveDetector;  

public SomeConstructor()  
{
   this.bgwDriveDetector = new System.ComponentModel.BackgroundWorker();  
   this.bgwDriveDetector.DoWork += bgwDriveDetector_DoWork;  
   this.bgwDriveDetector.RunWorkerAsync();  
}

void bgwDriveDetector_DoWork(object sender, DoWorkEventArgs e)  
{  
  var detectQuery = new WqlEventQuery("SELECT * FROM  _InstanceModificationEvent WITHIN 2 WHERE  TargetInstance ISA 'Win32_NetworkAdapter'");  
  var detectWatcher = new ManagementEventWatcher(detectQuery);  
  detectWatcher.EventArrived += DeviceDetectedtedEvent;  
  detectWatcher.Start();  
}

// Will run when device detected 
private void DeviceDetectedtedEvent(object sender, EventArrivedEventArgs e)  
{  
  ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];  

  var status = (ushort)instance.GetPropertyValue("NetConnectionStatus");  
  switch (status)  
  {  
    case 2:  
        Console.WriteLine("Connected");  
        break;  
    case 7:  
        Console.WriteLine("Disconnected");  
        break;  
   }  
  …   
}  

Теперь у меня возникают следующие проблемы:

  • Я не могу отличить устройство, получающее «Подключено» от «Отключено» (т. Е. Событие срабатывает в обеих ситуациях, но «NetConnectionStatus» возвращает ноль при отключении).
  • Обнаружение является ошибочным в том смысле, что оно срабатывает несколько раз при подключении или отключении устройства.
  • У меня нет проблем при попытке обнаружить обычные USB-устройства, которые используют драйвер контроллера USB ('Win32_USBHub') (Хорошую диаграмму, подчеркивающую разницу между универсальными USB-устройствами и RNDIS, можно найти здесь - https://docs.microsoft.com/en-us/windows-hardware/drivers/network/overview-of-remote-ndis--rndis-). Использование «RNDIS», по-видимому, делает вещи менее надежными для автоопределения.
  • Кроме того, общие устройства USB можно выбирать по имени с помощью «property.Name», что упрощает изоляцию конкретного оборудования., но любое полезное свойство, кажется, исчезает при отключении устройства RNDIS (так как я могу узнать, какое устройство было подключено / отключено?)

Потенциальная работа вокруг

Возможно яследует использовать «Win32_USBController» вместо «Win32_NetworkAdapter».
Кажется, что события запускаются должным образом и являются менее непредсказуемыми. Хотя не уверен, почему, хотя!не скажет мне, какой экземпляр устройства подключен или отключен.

...