java 监控usb端口插拔_监控USB设备插拔

最近做了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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Windows上监控USB设备插拔动作,可以使用Windows API函数来实现。以下是一个使用C语言编写的示例代码: ```c #include <Windows.h> #include <Dbt.h> #include <stdio.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DEVICECHANGE: { PDEV_BROADCAST_HDR pBroadcastHdr = (PDEV_BROADCAST_HDR)lParam; if (pBroadcastHdr != NULL) { switch (wParam) { case DBT_DEVICEARRIVAL: { PDEV_BROADCAST_DEVICEINTERFACE pBroadcastDevInterface = (PDEV_BROADCAST_DEVICEINTERFACE)pBroadcastHdr; if (pBroadcastDevInterface->dbcc_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { printf("USB device inserted\n"); // 在这里处理USB设备插入后的操作 } break; } case DBT_DEVICEREMOVECOMPLETE: { PDEV_BROADCAST_DEVICEINTERFACE pBroadcastDevInterface = (PDEV_BROADCAST_DEVICEINTERFACE)pBroadcastHdr; if (pBroadcastDevInterface->dbcc_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { printf("USB device removed\n"); // 在这里处理USB设备拨出后的操作 } break; } } } break; } default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } int main() { WNDCLASS wc = {0}; wc.lpfnWndProc = WndProc; wc.hInstance = GetModuleHandle(NULL); wc.lpszClassName = "USBDeviceMonitor"; if (!RegisterClass(&wc)) { printf("Failed to register window class\n"); return 1; } HWND hWnd = CreateWindowEx(0, wc.lpszClassName, "", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL); if (hWnd == NULL) { printf("Failed to create window\n"); return 1; } DEV_BROADCAST_DEVICEINTERFACE notificationFilter = {0}; notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; notificationFilter.dbcc_classguid = GUID_DEVINTERFACE_USB; HDEVNOTIFY hDevNotify = RegisterDeviceNotification(hWnd, &notificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE); if (hDevNotify == NULL) { printf("Failed to register device notification\n"); return 1; } MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } UnregisterDeviceNotification(hDevNotify); DestroyWindow(hWnd); return 0; } ``` 在上面的代码中,我们创建了一个窗口,并在窗口的回调函数`WndProc`中处理`WM_DEVICECHANGE`消息,该消息会在设备插拔时触发。通过检查`wParam`参数和设备类型,我们可以确定是设备插入还是拨出,并在相应的分支中执行相应的操作。 请注意,该示例代码是一个简化的示例,只演示了如何监控USB设备插拔动作。在实际应用中,您可能需要根据需要进行更多的处理,例如打开和关闭设备、读取设备信息等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值