| 查看: 301 | 回复: 3 | |||
| 当前主题已经存档。 | |||
[交流]
VxD编程入门教程(二)
|
|||
|
VxD编程入门教程(二) 三、Windows 95/98应用程序与VxD的通信 Windows 95/98应用程序与VxD的通信一般使用DeviceIoControl函数, 这里给出一个实例源程序(FHTEST.C)如下: //拦截Windows 95/98文件操作测试程序 #include #include "tchar.h" #define INSTALL_FILE_SYSTEM_API_HOOK 1 #define UNINSTALL_FILE_SYSTEM_API_HOOK 2 static TCHAR szAppName[]=_T("FHTEST" ; static TCHAR szAppTitle[]=_T("拦截Windows 95/98文件操作测试程 序" ; static HANDLE hDevice; LRESULT CALLBACK WndProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { HWND hWnd; WNDCLASSEX wcex; MSG Msg; //本程序不能在Windows NT中运行 if(GetVersion()<0x80000000) { MessageBox(NULL,_T("本程序不能在Windows NT中运行! " ,szAppTitle,MB_ICONINFORMATION|MB_OK); return FALSE; } if(!hPrevInstance) { wcex.cbSize=sizeof(WNDCLASSEX); wcex.style=CS_HREDRAW|CS_VREDRAW; wcex.lpfnWndProc=WndProc; wcex.cbClsExtra=0; wcex.cbWndExtra=0; wcex.hInstance=hInstance; wcex.hIcon=LoadIcon(hInstance,IDI_APPLICATION); wcex.hCursor=LoadCursor(NULL,IDC_ARROW); wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName=NULL; wcex.lpszClassName=szAppName; wcex.hIconSm=LoadIcon(hInstance,IDI_APPLICATION); if(!RegisterClassEx(&wcex)) return FALSE; } hWnd=CreateWindow(szAppName,szAppTitle,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, 0,0,hInstance,NULL); if(!hWnd) return FALSE; ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); while(GetMessage(&Msg,0,0,0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam) { HDC hDC; PAINTSTRUCT ps; DWORD cb; BOOL bResult; switch(Message) { case WM_CREATE: hDevice=CreateFile("\\\\.\\FILEHOOK.VXD",0,0,NULL,0,FILE_FLA G_DELETE_ON_CLOSE,NULL); if(hDevice!=INVALID_HANDLE_VALUE) { bResult=DeviceIoControl(hDevice,INSTALL_FILE_SYSTEM_API_HOOK, NULL,0,NULL,0,&cb,0); if(bResult) MessageBox(hWnd,_T("文件系统API 钩子安装 成功!" ,szAppTitle,MB_ICONINFORMATION|MB_OK); else MessageBox(hWnd,_T("不能安装文件系统API 钩子! " ,szAppTitle,MB_ICONINFORMATION|MB_OK); } else { MessageBox(hWnd,_T("不能打开FILEHOOK.VXD! " ,szAppTitle,MB_ICONINFORMATION|MB_OK); } break; case WM_PAINT: hDC=BeginPaint(hWnd,&ps); EndPaint(hWnd,&ps); break; case WM_DESTROY: if(hDevice!=INVALID_HANDLE_VALUE) { bResult=DeviceIoControl(hDevice,UNINSTALL_FILE_SYSTEM_API_HO OK,NULL,0,NULL,0,&cb,0); if(bResult) MessageBox(hWnd,_T("文件系统API 钩子移去 成功!" ,szAppTitle,MB_ICONINFORMATION|MB_OK); else MessageBox(hWnd,_T("不能移去文件系统API 钩子! " ,szAppTitle,MB_ICONINFORMATION|MB_OK); CloseHandle(hDevice); } else { MessageBox(hWnd,_T("不能打开FILEHOOK.VXD! " ,szAppTitle,MB_ICONINFORMATION|MB_OK); } PostQuitMessage(0); break; default: return DefWindowProc(hWnd,Message,wParam,lParam); } return 0; } 本程序使用CreateFile函数动态装载VxD,然后用DeviceIoControl函数 向VxD发送设备I/O控制代码,安装和移去文件系统API钩子,最后用 CloseHandle函数动态移去VxD。 运行该程序时,如果文件系统API钩子安装成功,会显示出“文件系统API 钩子安装成功!”的消息框,然后只要进行打开文件操作,就会显示出“Open File !”的消息框。退出该程序时,如果文件API钩子移去成功,会显示 出“文件API钩子移去成功!”的消息框,以后进行打开文件操作时不再 显示消息框。 四、小结 上述实例演示了一个完整的拦截Windows 95/98文件系统API的VxD和 Windows 95/98应用程序与该VxD通信的方法。该VxD可以作为一个基本 框架,稍作修改即可用于病毒防火墙等软件。其实VxD的功能远不止这些, 充分利用VxD的功能可以编写出许多用API不能编写出的高级应用程序。 本教程只是一个简单的VxD编程例子,因为笔者水平所限,加之时间较少, 写得较为简单,还请大家见谅,同时也欢迎大家讨论。本教程中使用的VMM 功能、VxD功能和API函数请查阅相关手册或者帮助。 [ Last edited by 幻影无痕 on 2006-11-4 at 07:48 ] |
» 猜你喜欢
存款400万可以在学校里躺平吗
已经有7人回复
基金委咋了?2026年的指南还没有出来?
已经有10人回复
拟解决的关键科学问题还要不要写
已经有6人回复
基金申报
已经有6人回复
推荐一本书
已经有13人回复
国自然申请面上模板最新2026版出了吗?
已经有17人回复
纳米粒子粒径的测量
已经有8人回复
疑惑?
已经有5人回复
计算机、0854电子信息(085401-058412)调剂
已经有5人回复
Materials Today Chemistry审稿周期
已经有5人回复
2楼2006-02-28 20:55:49
1
![]() |
3楼2006-03-04 14:45:23
1
![]() ![]() ![]() |
4楼2006-03-06 12:25:39











;
回复此楼



