EnumHook

  1. http://read.pudn.com/downloads92/sourcecode/windows/freedic/361926/Enum1.2/Enum.cpp__.htm
  2. /***********************************************************************
  3. filename:         EnumHook.cpp
  4. author:            cbntrt
  5. createdate:        2007.11.16 am
  6. modification log:  2007.11.16 am
  7. comment:           this file is converted from EnumHook.asm written by [email protected]
  8. ************************************************************************/
  9. #include <windows.h>
  10. #include <commctrl.h>
  11. #include <tlhelp32.h>
  12. #include "resource.h"
  13. #include <winioctl.h>
  14. #pragma comment(lib,"comctl32.lib")
  15. typedef struct _HOOK_INFO  
  16. {  
  17. HANDLE Handle;  
  18. DWORD  FuncOffset;  
  19. DWORD FuncBaseAddr;  
  20. DWORD iHook;  
  21. }HOOK_INFO,*LPHOOK_INFO;  
  22. BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);  
  23. BOOL OpenDevice(void);  
  24. void CloseDevice(void);  
  25. void Init(HWND hDlg);  
  26. void Refresh(void);  
  27. void InsertHookInfo(HWND,LPHOOK_INFO,DWORD);  
  28. void GetHookModuleName(DWORD,char*);  
  29. ////////////////////////////////////////////////////////second part end
  30. ////////////////////////////////////////////////////////third part 
  31. //#define  WH_MSGFILTER       -1
  32. //#define  WH_JOURNALRECORD   0
  33. //#define  WH_JOURNALPLAYBACK 1
  34. //#define  WH_KEYBOARD        2
  35. //#define  WH_GETMESSAGE      3
  36. //#define  WH_CALLWNDPROC     4
  37. //#define  WH_CBT             5
  38. //#define  WH_SYSMSGFILTER    6
  39. //#define  WH_MOUSE           7
  40. //#define  WH_HARDWARE        8
  41. //#define  WH_DEBUG           9
  42. //#define  WH_SHELL           10
  43. //#define  WH_FOREGROUNDIDLE  11
  44. #define IOCTL_GET_HOOKINFO  CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS|FILE_WRITE_ACCESS)
  45. #define MAX_HOOKS       100
  46. HINSTANCE hInst;  
  47. HWND      hList;  
  48. HANDLE    hDevice;  
  49. char szHandle[]= "钩子句柄";  
  50. char szFunc[]=   "钩子函数地址";  
  51. char szType[]=   "钩子类型";  
  52. char szModule[]= "钩子所在模块";  
  53. char szFlags[13][19]={"WH_MSGFILTER      ",  
  54. "WH_JOURNALRECORD  ",  
  55. "WH_JOURNALPLAYBACK",  
  56. "WH_KEYBORD        ",  
  57. "WH_GETMESSAGE     ",  
  58. "WH_CALLWNDPROC    ",  
  59. "WH_CBT            ",  
  60. "WH_SYSMSGFILTER   ",  
  61. "WH_MOUSE          ",  
  62. "WH_HARDWARE       ",  
  63. "WH_DEBUGE         ",  
  64. "WH_SHELL          ",  
  65. "WH_FOREGROUNDIDLE "};  
  66. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)      
  67. {  
  68.     hInst=::GetModuleHandle(NULL);  
  69. BOOL bRet=OpenDevice();  
  70. if(bRet){  
  71.         MessageBox(NULL,"Start Service Succeed","Success",MB_OK);  
  72.     }  
  73. else{  
  74.         MessageBox(NULL,"Failed to Start the Service!","ERR",MB_OK);  
  75.     }  
  76. if(bRet){  
  77.         ::DialogBoxParam(hInst,LPCTSTR(IDD_DIALOG_MAIN),NULL,DlgProc,NULL);  
  78.         ::InitCommonControls();  
  79.         CloseDevice();  
  80.     }  
  81.     ::ExitProcess(0);  
  82. return 0;  
  83. }  
  84. BOOL CALLBACK DlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)  
  85. {  
  86. //  RECT rect;
  87. switch(uMsg)  
  88.     {  
  89. case WM_INITDIALOG:  
  90.         {  
  91.             Init(hDlg);  
  92.         }  
  93. break;  
  94. case WM_COMMAND:  
  95. switch(LOWORD(wParam))  
  96.         {  
  97. case IDC_REFRESH:  
  98.             {  
  99.                 MessageBox(hDlg,"refresh","receive message",MB_OK);  
  100.                 SendMessage(hList,LVM_DELETEALLITEMS,0,0);  
  101.                 Refresh();  
  102.             }  
  103. break;  
  104. case IDC_CLOSE:  
  105.             {  
  106.                 EndDialog(hDlg,0);  
  107.             }  
  108. break;  
  109.         }  
  110. break;  
  111.     }  
  112. return 0;  
  113. }  
  114. BOOL OpenDevice(void)  
  115. {  
  116. HANDLE hSCManager=NULL,hService=NULL;  
  117. char   szDriverPath[MAX_PATH];  
  118. //打开驱动链接
  119.     hDevice=::CreateFile( ("\\\\.\\slEnumHook"),  
  120.         GENERIC_READ|GENERIC_WRITE,  
  121.         FILE_SHARE_READ|FILE_SHARE_WRITE,  
  122.         NULL,  
  123.         OPEN_EXISTING,  
  124.         0,NULL);  
  125. if(INVALID_HANDLE_VALUE!=hDevice){  
  126. return TRUE;  
  127.     }  
  128. //如果上面的打开失败,则说明驱动没有安装或者没有启动
  129.     hSCManager=::OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);  
  130. if(0!=hSCManager){  
  131. //如果驱动已经安装了,则启动驱动程序
  132.         hService=OpenService(hSCManager, ("EnumHook"),SERVICE_START|DELETE);  
  133. if(0!=hService){  
  134.             ::StartService(hService,0,NULL);  
  135.             ::CloseServiceHandle(hService);  
  136.         }//如果驱动程序没有安装,则先安装,再启动
  137. else{  
  138.             ::GetFullPathName( ("EnumHook.sys"),sizeof(szDriverPath),szDriverPath,NULL);  
  139.             hService=::CreateService(hSCManager, ("EnumHook"),  
  140.                  ("ZTS's Enumerate Global Windows Service"),  
  141.                 SERVICE_START|DELETE,  
  142.                 SERVICE_KERNEL_DRIVER,  
  143.                 SERVICE_DEMAND_START,  
  144.                 SERVICE_ERROR_IGNORE,  
  145.                 szDriverPath,  
  146.                 NULL,NULL,NULL,NULL,NULL);  
  147. if(0!=hService){  
  148.                 ::StartService(hService,0,NULL);  
  149.                 ::CloseServiceHandle(hService);  
  150.             }     
  151.         }  
  152.         ::CloseServiceHandle(hSCManager);  
  153.     }  
  154. //启动驱动程序后,再一次打开驱动链接,如果不出意外,这一次应该可以成功
  155.     hDevice=::CreateFile( "\\\\.\\slEnumHook",  
  156.         GENERIC_READ|GENERIC_WRITE,  
  157.         FILE_SHARE_READ|FILE_SHARE_WRITE,  
  158.         NULL,  
  159.         OPEN_EXISTING,  
  160.         0,NULL);  
  161. if(INVALID_HANDLE_VALUE==hDevice){  
  162. return FALSE;  
  163.     }  
  164. return TRUE;  
  165. }  
  166. void CloseDevice(void)  
  167. {  
  168. HANDLE hSCManager,hService;  
  169.     SERVICE_STATUS sest;  
  170. if(hDevice){  
  171.         ::CloseHandle(hDevice);  
  172.     }  
  173.     hSCManager=::OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);  
  174. if(NULL!=hSCManager){  
  175.         hService=::OpenService(hSCManager, "EnumHook",SERVICE_STOP|DELETE);  
  176. if(NULL!=hService){  
  177.                 ::ControlService(hService,SERVICE_CONTROL_STOP,&sest);  
  178.                 ::DeleteService(hService);  
  179.                 ::CloseServiceHandle(hService);  
  180.             }  
  181.             ::CloseServiceHandle(hSCManager);  
  182.     }  
  183. }  
  184. void Init(HWND hWnd)  
  185. {  
  186.     LV_COLUMN lvc;  
  187.     hList=GetDlgItem(hWnd,IDC_LIST);  
  188. //handle
  189.     lvc.mask=LVCF_TEXT+LVCF_WIDTH;  
  190.     lvc.pszText=szHandle;  
  191.     lvc.cx=100;  
  192.     SendMessage(hList,LVM_INSERTCOLUMN,0,(long)(&lvc));  
  193. //func  
  194.     lvc.pszText=szFunc;  
  195.     lvc.cx=100;  
  196.     SendMessage(hList,LVM_INSERTCOLUMN,1,(long)(&lvc));  
  197. //type
  198.     lvc.pszText=szType;  
  199.     lvc.cx=120;  
  200.     SendMessage(hList,LVM_INSERTCOLUMN,2,(long)(&lvc));  
  201. //module name
  202.     lvc.pszText=szModule;  
  203.     lvc.cx=400;  
  204.     SendMessage(hList,LVM_INSERTCOLUMN,3,(long)(&lvc));  
  205. //设置扩展风格
  206.     SendMessage(hList,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,  
  207.         LVS_EX_FULLROWSELECT);  
  208. }  
  209. void Refresh(void)  
  210. {  
  211.     HOOK_INFO* lpHookInfo;  
  212. DWORD dwByteReturned;  
  213. DWORD dwHookNum;  
  214. DWORD dwMaxHook=sizeof(HOOK_INFO)*MAX_HOOKS;  
  215.     lpHookInfo=(HOOK_INFO*)GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT,dwMaxHook);  
  216.     dwByteReturned=0;  
  217. if(INVALID_HANDLE_VALUE==hDevice ){  
  218.         MessageBox(NULL,"hDevice is not valid!","ERR",MB_OK);  
  219.     }  
  220. BOOL bRet=::DeviceIoControl(hDevice,IOCTL_GET_HOOKINFO,0,0,lpHookInfo,  
  221.         dwMaxHook,&dwByteReturned,NULL);  
  222. if(bRet){  
  223.         MessageBox(NULL,"DeviceIoControl succeed!","Success",MB_OK);  
  224.     }  
  225. else{  
  226.         MessageBox(NULL,"DeviceIoControl call failed!","ERROR",MB_OK);  
  227.     }  
  228. if(0!=dwByteReturned){  
  229.         dwHookNum=dwByteReturned/(sizeof(HOOK_INFO));  
  230. DWORD i=0;  
  231. while(i<dwhooknum){ inserthookinfo(hlist,lphookinfo,i);="" lphookinfo="(HOOK_INFO*)((DWORD)lpHookInfo+(sizeof(HOOK_INFO)));" i++;="" }="" else{="" messagebox(null,"receive="" no="" hookinfo","error",mb_ok);="" return;="" void="" inserthookinfo(hwnd="" hwnd,hook_info*="" lphookinfo,dword="" dwnum)="" {="" lv_item="" lvi;="" char="" buf[max_path];="" hook_info*="" phookinfo="lpHookInfo;" assume="" esi:ptr="" hook_info="" edi:ptr="" buf="" handle="" wsprintf(buf,="" ("%08x"),phookinfo-="">Handle);  
  232.     lvi.mask=LVIF_TEXT;  
  233.     lvi.iItem=dwNum;  
  234.     lvi.iSubItem=0;  
  235.     lvi.pszText=Buf;  
  236.     SendMessage(hWnd,LVM_INSERTITEM,0,(long)(&lvi));  
  237. //func
  238. DWORD dwFuncAddr=pHookInfo-&gt;FuncOffset+pHookInfo-&gt;FuncBaseAddr;  
  239.     wsprintf(Buf, ("%08X"),dwFuncAddr);  
  240.     lvi.iSubItem=1;  
  241.     lvi.pszText=Buf;  
  242.     SendMessage(hWnd,LVM_SETITEM,0,(long)(&lvi));  
  243. //type
  244. DWORD dwOffset=(pHookInfo-&gt;iHook+1)*19;  
  245. char* pszFlags=(char*)(szFlags)+dwOffset;  
  246.     lvi.iSubItem=2;  
  247.     lvi.pszText=pszFlags;  
  248.     SendMessage(hWnd,LVM_SETITEM,0,(long)(&lvi));  
  249. //module name
  250. if(0!=pHookInfo-&gt;FuncBaseAddr){  
  251.         memset(Buf,0,sizeof(Buf));  
  252.         GetHookModuleName(pHookInfo-&gt;FuncBaseAddr,Buf);  
  253.         lvi.iSubItem=3;  
  254.         lvi.pszText=Buf;  
  255.         SendMessage(hWnd,LVM_SETITEM,0,(long)(&lvi));  
  256.     }  
  257. return;  
  258. }  
  259. void GetHookModuleName(DWORD dwBaseAddress,char* lpModuleName)  
  260. {  
  261.     MODULEENTRY32 stModule;  
  262. HANDLE hSnapshot;  
  263.     RtlZeroMemory(&stModule,sizeof(MODULEENTRY32));  
  264.     stModule.dwSize=sizeof(MODULEENTRY32);  
  265.     hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);  
  266. BOOL bRet=Module32First(hSnapshot,&stModule);  
  267. while(bRet){  
  268. if((DWORD)stModule.modBaseAddr==dwBaseAddress){  
  269.             lstrcpyn(lpModuleName,stModule.szExePath,MAX_PATH);  
  270. break;  
  271.         }  
  272.         bRet=Module32Next(hSnapshot,&stModule);  
  273.     }  
  274.     CloseHandle(hSnapshot);  
  275. }</dwhooknum){></winioctl.h></tlhelp32.h></commctrl.h></windows.h> 

你可能感兴趣的:(职场,休闲,EnumHook)