HOOK.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:7k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. *       This is a part of the Microsoft Source Code Samples. 
  3. *       Copyright (C) 1993-1997 Microsoft Corporation.
  4. *       All rights reserved. 
  5. *       This source code is only intended as a supplement to 
  6. *       Microsoft Development Tools and/or WinHelp documentation.
  7. *       See these sources for detailed information regarding the 
  8. *       Microsoft samples programs.
  9. ******************************************************************************/
  10. /*****************************************************************************
  11. * hook.c - Windows message spy application dll
  12. *
  13. * Functions:
  14. *
  15. * DllMain()
  16. * FindSpyWindow()
  17. * HookProc()
  18. * SpyGetMsgProc()
  19. * SpyCallWndProc()
  20. * DbgPrintf()
  21. *
  22. * Comments:
  23. *
  24. *****************************************************************************/
  25. #include <windows.h>
  26. #include "..hook.h"
  27. PRIVATE HWND ghwndSpyHook = NULL;   // the handle back to the spy executable
  28. PRIVATE SPYMSGDATA gsmd;
  29. PRIVATE COPYDATASTRUCT gcds = { 0, sizeof(SPYMSGDATA), &gsmd };
  30. PRIVATE VOID FindSpyWindow(VOID);
  31. #ifdef DBG
  32. VOID DbgPrintf(LPTSTR fmt, ...);
  33. #endif
  34. /*****************************************************************************
  35. * DllMain (hModule,cbHeap,lpchCmdLine)
  36. *
  37. * Called when the libary is loaded
  38. *
  39. * Arguments:
  40. *    PVOID hModule - Module handle for the libary.
  41. *    ULONG ulReason - DLL purpose
  42. *    PCONTEXT pctx - not used
  43. *
  44. * Returns:
  45. *    TRUE - Everything is ok
  46. *    FALSE- Error.
  47. *****************************************************************************/
  48. BOOL
  49. APIENTRY DllMain(
  50.     PVOID hModule,
  51.     ULONG ulReason,
  52.     PCONTEXT pctx
  53.     )
  54. {
  55.     UNREFERENCED_PARAMETER(hModule);
  56.     UNREFERENCED_PARAMETER(pctx);
  57.     //
  58.     // This function is called for every instance of the DLL. We must find
  59.     // and store the handle to the spy window every time an instance of the
  60.     // DLL is instantiated.
  61.     //
  62.     if ( ulReason == DLL_PROCESS_ATTACH ) {
  63.         FindSpyWindow();
  64.     }
  65.     return TRUE;
  66. }
  67. /*****************************************************************************
  68. * FindSpyWindow
  69. *
  70. * Finds the spy window and store a local copy in this instances data.
  71. * This must be called everytime that a new instance of the DLL is
  72. * created.
  73. *
  74. * Arguments:
  75. *    none
  76. *
  77. * Returns:
  78. *    VOID
  79. *****************************************************************************/
  80. PRIVATE VOID
  81. FindSpyWindow(
  82.     VOID
  83.     )
  84. {
  85.     ghwndSpyHook = FindWindow(HOOKWINDOWCLASS, HOOKWINDOWNAME);
  86. }
  87. /*****************************************************************************
  88. * HookProc( hWnd, uiMessage, wParam, lParam )
  89. *
  90. * The hook proc for the windows hook being spied on
  91. *
  92. * Arguments:
  93. *    HWND hWnd - window handle for the parent window
  94. *    UINT uiMessage - message number
  95. *    WPARAM wParam - message-dependent
  96. *    LPARAM lParam - message-dependent
  97. *
  98. * Returns:
  99. *    0 if processed, nonzero if ignored
  100. *****************************************************************************/
  101. BOOL WINAPI
  102. HookProc(
  103.     HWND hwnd,
  104.     UINT uiMessage,
  105.     WPARAM wParam,
  106.     LPARAM lParam
  107.     )
  108. {
  109.     HWND hwndSpyingOn;
  110.     HWND hwndSpyApp;
  111.     if (ghwndSpyHook == NULL || !IsWindow(ghwndSpyHook))
  112.     {
  113.         //
  114.         // Spy has terminated. Find the new window.
  115.         //
  116.         FindSpyWindow();
  117.     }
  118.     if (ghwndSpyHook != NULL && hwnd != ghwndSpyHook)
  119.     {
  120.         hwndSpyingOn = (HWND)GetWindowLong(ghwndSpyHook, 0);
  121.         hwndSpyApp = (HWND)GetWindowLong(ghwndSpyHook, sizeof(HWND));
  122. //DbgPrintf("H ghwndSpyHook:%8.8x", ghwndSpyHook);
  123. //DbgPrintf("H hwndSpyingOn:%8.8x", hwndSpyingOn);
  124. //DbgPrintf("H hwndSpyApp:%8.8x", hwndSpyApp);
  125.         //
  126.         // Send the message on asynchronously for Spy to deal with if
  127.         // it is the appropriate hwndSpyingOn window to spy on.
  128.         //
  129.         if (hwndSpyingOn == hwnd
  130.             || (hwndSpyingOn == HWND_ALL && hwnd != hwndSpyApp
  131.             && !IsChild(hwndSpyApp, hwnd)))
  132.         {
  133.             gsmd.wParam = wParam;
  134.             gsmd.lParam = lParam;
  135.             gcds.dwData = uiMessage;
  136. //DbgPrintf("H Sending Message hwnd:%8.8x msg:%d", hwnd, uiMessage);
  137.             SendMessage(ghwndSpyHook, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)&gcds);
  138. //DbgPrintf("H Sent Message hwnd:%8.8x msg:%d", hwnd, uiMessage);
  139. //DbgPrintf("");
  140.             return TRUE;
  141.         }
  142. //DbgPrintf("");
  143.     }
  144.     return FALSE;
  145. }
  146. /*****************************************************************************
  147. * SpyGetMsgProc
  148. *
  149. * The Get Message hook function.
  150. *
  151. *****************************************************************************/
  152. LRESULT CALLBACK
  153. SpyGetMsgProc(
  154.     INT hc,
  155.     WPARAM wParam,
  156.     LPARAM lParam
  157.     )
  158. {
  159.     PMSG pmsg;
  160.     pmsg = (PMSG)lParam;
  161.     if (hc >= 0 && pmsg && pmsg->hwnd)
  162.     {
  163.         return HookProc(pmsg->hwnd, pmsg->message, pmsg->wParam, pmsg->lParam);
  164.     }
  165.     //
  166.     // Note that CallNextHookEx ignores the first parameter (hhook) so
  167.     // it is acceptable (barely) to pass in a NULL.
  168.     //
  169.     return CallNextHookEx(NULL, hc, wParam, lParam);
  170. }
  171. /*****************************************************************************
  172. * SpyCallWndProc
  173. *
  174. * The Call Window Proc (Send Message) hook function.
  175. *
  176. *****************************************************************************/
  177. LRESULT CALLBACK
  178. SpyCallWndProc(
  179.     INT hc,
  180.     WPARAM wParam,
  181.     LPARAM lParam
  182.     )
  183. {
  184.     PCWPSTRUCT pcwps;
  185.     pcwps = (PCWPSTRUCT)lParam;
  186.     if (hc >= 0 && pcwps && pcwps->hwnd)
  187.     {
  188.         return HookProc(pcwps->hwnd, pcwps->message, pcwps->wParam, pcwps->lParam);
  189.     }
  190.     //
  191.     // Note that CallNextHookEx ignores the first parameter (hhook) so
  192.     // it is acceptable (barely) to pass in a NULL.
  193.     //
  194.     return CallNextHookEx(NULL, hc, wParam, lParam);
  195. }
  196. #ifdef DBG
  197. /****************************************************************************
  198. * DBGprintf
  199. *
  200. * This debugging function prints out a string to the debug output.
  201. * An optional set of substitutional parameters can be specified,
  202. * and the final output will be the processed result of these combined
  203. * with the format string, just like printf.  A newline is always
  204. * output after every call to this function.
  205. *
  206. * Arguments:
  207. *   LPTSTR fmt - Format string (printf style).
  208. *   ...        - Variable number of arguments.
  209. * Returns:
  210. *    VOID
  211. ****************************************************************************/
  212. VOID DbgPrintf(
  213.     LPTSTR fmt,
  214.     ...
  215.     )
  216. {
  217.     va_list marker;
  218.     TCHAR szBuf[256];
  219.     va_start(marker, fmt);
  220.     wvsprintf(szBuf, fmt, marker);
  221.     va_end(marker);
  222.     OutputDebugString(szBuf);
  223.     OutputDebugString(TEXT("rn"));
  224. }
  225. #endif