Annotation of mstools/samples/sdktools/spy/dll/hook.c, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.