插入或拔出远程NDIS兼容设备时的检测

时间:2019-06-19 08:04:54

标签: c# usb detection ndis

我正在尝试检测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”返回null)。
  • 在插入或拔出设备时会多次触发,因此检测结果不稳定。
  • 尝试检测使用USB控制器驱动程序('Win32_USBHub')的普通USB设备时,我没有任何问题(可以在此处找到一个很好的图,强调通用USB设备与RNDIS之间的区别-https://docs.microsoft.com/en-us/windows-hardware/drivers/network/overview-of-remote-ndis--rndis- )。使用“ RNDIS”似乎会使自动检测的可靠性降低。
  • 还可以使用“ property.Name”按名称选择通用USB设备,这使得隔离特定硬件变得容易,但是拔出RNDIS设备时,任何有用的属性似乎都消失了(所以我怎么知道哪一个设备插入/拔下?)

可能的解决方法

也许我应该使用“ Win32_USBController”而不是“ Win32_NetworkAdapter”。
事件似乎可以正确触发,并且不那么不稳定。不知道为什么吗??
然后,我可以通过供应商ID(VID)隔离设备,但这不会告诉我哪个设备实例正在插入或拔出。

0 个答案:

没有答案