posted at 2023.10.18 14:53 by Administrator
一、简述
用户通常使用移动U盘来复制办公文件,如果一些文件含有病毒木马,会乘机植入用户计算机,盗取用户的数据甚至操控计算机。所以,通过对U盘的实时监控,第一时间扫描清除病毒,是我们安全管理计算机操作的必经之路。
一般用户认为,利用编程实现监控U盘或者其他移动设备的插入和拔出是一个靠近系统底层且很难完成的事情,其实,完全不用担心这些,Windows已经为我们设计好了开发接口。
Wimdows应用程序都是由消息(事件)驱动的,任何一个窗口都能够接收消息,并对该消息做出相应的处理。同样,U盘的插入和拔出也会有相应的消息相对应,这个消息便是WM_DEVICECHANGE。
顾名思义,这个消息就是设备更改时产生的。程序实现监控U盘的插入或拔出,只需要捕获这个消息并做出处理就可以了。
二、实现原理
当计算机的硬件设备或硬件配置发生变化时,系统会向窗口过程广播一条WM_DEVICECHANGE消息。
消息函数声明:
INT_PTR CALLBACK DialogProc(
HWND hwndDlg,UINTuMsg,WPARAMwParam,LPARAMlParam)
wParam参数表示发生的事件类型。
lParam参数是一个指向与具体事件相关的数据结构的指针。
处理完消息后,返回TRUE表示接受请求,返回BROADCAST_QUERY_DENY表示拒绝请求。
要实现对U盘设备的插入和拔出进行监控,也就是对wParam的具体内容(DBT_DEVICEARRIVAL 或 DBT_DEVICEREMOVECOMPLETE事件)进行判断。然后再重点分析相应事件对应的lParam参数里存储的信息数据,从而产生操作设备的盘符信息。
有了以上信息,就可以针对性地实施安全防范手段。
三、实现代码(C++,vs2019)
#include<windows.h>#include<Dbt.h>#include"resource.h" // 函数声明INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DialogProc, NULL); return 0;} INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ PDEV_BROADCAST_HDR pDevBroadcastHdr = NULL; PDEV_BROADCAST_VOLUME pDevBroadcastVolume = NULL; DWORD dwDriverMask, dwIndex; switch (uMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: EndDialog(hwndDlg, 0); break; } return TRUE; case WM_DEVICECHANGE: switch (wParam) { case DBT_DEVICEARRIVAL: pDevBroadcastHdr = (PDEV_BROADCAST_HDR)lParam; if (pDevBroadcastHdr->dbch_devicetype == DBT_DEVTYP_VOLUME) { pDevBroadcastVolume = (PDEV_BROADCAST_VOLUME)lParam; dwDriverMask = pDevBroadcastVolume->dbcv_unitmask; dwIndex = 0x00000001; TCHAR szDriverName[] = TEXT("A:\\"); for (szDriverName[0] = TEXT('A'); szDriverName[0] <= TEXT('Z'); szDriverName[0]++) { if ((dwDriverMask & dwIndex) > 0) MessageBox(hwndDlg, szDriverName, TEXT("设备已插入"), MB_OK); // 检测下一个辑驱动器位掩码 dwIndex = dwIndex << 1; } } break; case DBT_DEVICEREMOVECOMPLETE: pDevBroadcastHdr = (PDEV_BROADCAST_HDR)lParam; if (pDevBroadcastHdr->dbch_devicetype == DBT_DEVTYP_VOLUME) { pDevBroadcastVolume = (PDEV_BROADCAST_VOLUME)lParam; dwDriverMask = pDevBroadcastVolume->dbcv_unitmask; dwIndex = 0x00000001; TCHAR szDriverName[] = TEXT("A:\\"); for (szDriverName[0] = TEXT('A'); szDriverName[0] <= TEXT('Z'); szDriverName[0]++) { if ((dwDriverMask & dwIndex) > 0) MessageBox(hwndDlg, szDriverName, TEXT("设备已拔出"), MB_OK); // 检测下一个辑驱动器位掩码 dwIndex = dwIndex << 1; } } break; } return TRUE; } return FALSE;}
四、效果图
3296daeb-90d7-4147-8244-5f01e7fa90a8|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags: 程序, 代码, 接口, 类, 数据, 数据结构
IT技术 | 防控BUG