windows-nt/Source/XPSP1/NT/windows/appcompat/shims/general/forceansiwindowproc.cpp
2020-09-26 16:20:57 +08:00

141 lines
2.8 KiB
C++

/*++
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