程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VxD編程入門教程(2)

VxD編程入門教程(2)

編輯:vc教程
三、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_FLAG_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_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);
  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函數請查閱相關手冊或者幫助。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved