Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
ForceAnsiWindowProc.cpp
Abstract:
Apps call GetWindowLongA() to get a window procedure and subsequently does not call CallWindowProc() with the value returned from GetWindowLongA(). This SHIM calls GetWindowLongW( ), which returns the window procedure. If the app wants a Dialog procedure, we pass back our function and subsequently call CallWindowProc() in our function. SetWindowLongA() is hooked to prevent the app from setting our function as a Dialog Proc. Notes:
This is a general purpose SHIM History:
03/16/2000 prashkud Created 01/30/2001 prashkud Converted to a general SHIM
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(ForceAnsiWindowProc) #include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN APIHOOK_ENUM_ENTRY(SetWindowLongA) APIHOOK_ENUM_ENTRY(GetWindowLongA) APIHOOK_ENUM_END
#define HANDLE_MASK 0xffff0000
LONG g_lGetWindowLongRet = 0;
LRESULT MyProcAddress( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { return CallWindowProcA( (WNDPROC) g_lGetWindowLongRet, hWnd, uMsg, wParam, lParam ); }
LONG APIHOOK(SetWindowLongA)( HWND hwnd, int nIndex, LONG dwNewLong ) { LONG lRet = 0;
// If the address that is being set is my address, don't!
if (dwNewLong == (LONG)MyProcAddress) { lRet = 0; } else { lRet = ORIGINAL_API(SetWindowLongA)(hwnd,nIndex,dwNewLong); }
return lRet; }
/*++
This function intercepts GetWindowLong( ), checks the nIndex for GWL_WNDPROC and if it is,calls GetWindowLongW( ). Otherwise, it calls GetWindowLongA( )
--*/
LONG APIHOOK(GetWindowLongA)( HWND hwnd, int nIndex ) { LONG lRet = 0;
// Apply the modification only if the App wants a WindowProc.
if ((nIndex == GWL_WNDPROC) || (nIndex == DWL_DLGPROC)) { if ((nIndex == GWL_WNDPROC)) { lRet = GetWindowLongW(hwnd, nIndex); } else { g_lGetWindowLongRet = ORIGINAL_API(GetWindowLongA)( hwnd, nIndex ); if ((g_lGetWindowLongRet & HANDLE_MASK) == HANDLE_MASK) { lRet = (LONG) MyProcAddress; } else { lRet = g_lGetWindowLongRet; } } } else { lRet = ORIGINAL_API(GetWindowLongA)(hwnd, nIndex); }
return lRet; }
/*++
Register hooked functions
--*/
HOOK_BEGIN APIHOOK_ENTRY(USER32.DLL, SetWindowLongA) APIHOOK_ENTRY(USER32.DLL, GetWindowLongA) HOOK_END
IMPLEMENT_SHIM_END
|