Я пытаюсь определить, когда 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».
Кажется, что события запускаются должным образом и являются менее непредсказуемыми. Хотя не уверен, почему, хотя!не скажет мне, какой экземпляр устройства подключен или отключен.