最近做了UKey加密中设计到USB设备. 因UKEy是用来加密和执行PC与项目间通信加密的介质.从作用范围来讲不是传统意义上U盘作为存储介质来使用.其实熟悉网银驱动DR应该了解.在网银系统安全上一个最基本需求就是动态即时监控通信PC驱动以及设备列表通信变化.当然包括我们加密存储介质在PC上USB插拔.
思路一.在WinFrom中通过拦截Windows 消息机制来实现. 类似定义MEssageForm窗体. 假如用鼠标左击一下窗体, 系统会收到一条 WM_LBUTTONDOWN 消息;当鼠标抬起, 系统又会收到 WM_LBUTTONUP 消息.系统收到消息后, 会告诉窗体发生的事情, 然后窗体再做出反应; 当然窗体能否做出反应要看窗体是否有相应的响应代码. 同样也可以把USB设备插拔事件通过重写窗体WndProc(Ref Message m)方法拦截并处理.
首先引入命名空间:
1:using System.Management;
2:using System.Threading;
3:using System.Security.Permissions;
定义Device Management Event的枚举:
1: public enum DeviceEvent : int
2: {
3: DBT_CONFIGCHANGECANCELED = 0x0019,
4: DBT_CONFIGCHANGED=0x0018,
5: DBT_CUSTOMEVENT=0x8006,
6: DBT_DEVICEARRIVAL=0x8000,//USB Insert DEvice Statu
7: DBT_DEVICEQUERYREMOVE=0x8001,
8: DBT_DEVICEQUERYREMOVEFAILED=0x8002,
9: DBT_DEVICEREMOVEPENDING=0x8003,//USB Revoing.
10: DBT_DEVICEREMOVECOMPLETE=0x8004,//USB Remove Completed
11: DBT_DEVICETYPESPECIFIC=0x8005,
12: DBT_DEVNODES_CHANGED=0x0007,//Device List _Changed
13: DBT_QUERYCHANGECONFIG=0x0017,
14: DBT_USERDEFINED=0xFFFF
15: }
其中涉及到USB设备插拔的是DEVICEREMOVEPENDING/DEVICEREMOVECOMPLETE[删除] DEVICEARRIVAL[插入设备] 重写WinFProc实现窗体上对Windows MEssage进行拦截并重新处理:
1: [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
2: protected override void WndProc(ref Message m)
3: {
4: base.WndProc(ref m);
5: DeviceEvent lEvent;
6:
7: lEvent = (DeviceEvent)m.WParam.ToInt32();
8: switch (lEvent)
9: {
10: case DeviceEvent.DBT_DEVICEARR