299 lines
8.8 KiB
C++
299 lines
8.8 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
PlaneCrazy.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Hooks all application-defined window procedures and adds a WM_PAINT
|
||
|
message upon receipt of a WM_SETFOCUS. For some reason the one that normally
|
||
|
came through on win9x gets lost.
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
This shim can be reused for other shims that require WindowProc hooking.
|
||
|
Copy all APIHook_* functions and simply replace the code in PlaneCrazy_WindowProcHook
|
||
|
and PlaneCrazy_DialogProcHook.
|
||
|
|
||
|
History:
|
||
|
|
||
|
11/01/1999 markder Created
|
||
|
02/15/1999 markder Reworked WndProc hooking mechanism so that it generically
|
||
|
hooks all WndProcs for the process.
|
||
|
02/15/1999 a-chcoff copied to here and created this shim with code base.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
IMPLEMENT_SHIM_BEGIN(PlaneCrazy)
|
||
|
#include "ShimHookMacro.h"
|
||
|
|
||
|
|
||
|
APIHOOK_ENUM_BEGIN
|
||
|
APIHOOK_ENUM_ENTRY(RegisterClassA)
|
||
|
APIHOOK_ENUM_ENTRY(RegisterClassW)
|
||
|
APIHOOK_ENUM_ENTRY(RegisterClassExA)
|
||
|
APIHOOK_ENUM_ENTRY(RegisterClassExW)
|
||
|
APIHOOK_ENUM_ENTRY(CreateDialogParamA)
|
||
|
APIHOOK_ENUM_ENTRY(CreateDialogParamW)
|
||
|
APIHOOK_ENUM_ENTRY(CreateDialogIndirectParamA)
|
||
|
APIHOOK_ENUM_ENTRY(CreateDialogIndirectParamW)
|
||
|
APIHOOK_ENUM_ENTRY(CreateDialogIndirectParamAorW)
|
||
|
APIHOOK_ENUM_ENTRY(SetWindowLongA)
|
||
|
APIHOOK_ENUM_ENTRY(SetWindowLongW)
|
||
|
APIHOOK_ENUM_END
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Change WM_DRAWITEM behaviour
|
||
|
|
||
|
--*/
|
||
|
|
||
|
LRESULT CALLBACK
|
||
|
PlaneCrazy_WindowProcHook(
|
||
|
WNDPROC pfnOld, // address of old WindowProc
|
||
|
HWND hwnd, // handle to window
|
||
|
UINT uMsg, // message identifier
|
||
|
WPARAM wParam, // first message parameter
|
||
|
LPARAM lParam // second message parameter
|
||
|
)
|
||
|
{
|
||
|
// Check for message we're interested in
|
||
|
if (uMsg == WM_SETFOCUS)
|
||
|
{
|
||
|
SendMessage(hwnd,WM_PAINT,NULL,NULL);
|
||
|
|
||
|
}
|
||
|
|
||
|
return (*pfnOld)(hwnd, uMsg, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
INT_PTR CALLBACK
|
||
|
PlaneCrazy_DialogProcHook(
|
||
|
DLGPROC pfnOld, // address of old DialogProc
|
||
|
HWND hwndDlg, // handle to dialog box
|
||
|
UINT uMsg, // message
|
||
|
WPARAM wParam, // first message parameter
|
||
|
LPARAM lParam // second message parameter
|
||
|
)
|
||
|
{
|
||
|
// Check for message we're interested in
|
||
|
if (uMsg == WM_SETFOCUS)
|
||
|
{
|
||
|
SendMessage(hwndDlg,WM_PAINT,NULL,NULL);
|
||
|
|
||
|
}
|
||
|
|
||
|
return (*pfnOld)(hwndDlg, uMsg, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Hook all possible calls that can initialize or change a window's
|
||
|
WindowProc (or DialogProc)
|
||
|
|
||
|
--*/
|
||
|
|
||
|
ATOM
|
||
|
APIHOOK(RegisterClassA)(
|
||
|
CONST WNDCLASSA *lpWndClass // class data
|
||
|
)
|
||
|
{
|
||
|
WNDCLASSA wcNewWndClass = *lpWndClass;
|
||
|
|
||
|
wcNewWndClass.lpfnWndProc = (WNDPROC) HookCallback(lpWndClass->lpfnWndProc, PlaneCrazy_WindowProcHook);
|
||
|
|
||
|
return ORIGINAL_API(RegisterClassA)(&wcNewWndClass);
|
||
|
}
|
||
|
|
||
|
ATOM
|
||
|
APIHOOK(RegisterClassW)(
|
||
|
CONST WNDCLASSW *lpWndClass // class data
|
||
|
)
|
||
|
{
|
||
|
WNDCLASSW wcNewWndClass = *lpWndClass;
|
||
|
|
||
|
wcNewWndClass.lpfnWndProc = (WNDPROC) HookCallback(lpWndClass->lpfnWndProc, PlaneCrazy_WindowProcHook);
|
||
|
|
||
|
return ORIGINAL_API(RegisterClassW)(&wcNewWndClass);
|
||
|
}
|
||
|
|
||
|
ATOM
|
||
|
APIHOOK(RegisterClassExA)(
|
||
|
CONST WNDCLASSEXA *lpwcx // class data
|
||
|
)
|
||
|
{
|
||
|
WNDCLASSEXA wcNewWndClass = *lpwcx;
|
||
|
|
||
|
wcNewWndClass.lpfnWndProc = (WNDPROC) HookCallback(lpwcx->lpfnWndProc, PlaneCrazy_WindowProcHook);
|
||
|
|
||
|
return ORIGINAL_API(RegisterClassExA)(&wcNewWndClass);
|
||
|
}
|
||
|
|
||
|
ATOM
|
||
|
APIHOOK(RegisterClassExW)(
|
||
|
CONST WNDCLASSEXW *lpwcx // class data
|
||
|
)
|
||
|
{
|
||
|
WNDCLASSEXW wcNewWndClass = *lpwcx;
|
||
|
|
||
|
wcNewWndClass.lpfnWndProc = (WNDPROC) HookCallback(lpwcx->lpfnWndProc, PlaneCrazy_WindowProcHook);
|
||
|
|
||
|
return ORIGINAL_API(RegisterClassExW)(&wcNewWndClass);
|
||
|
}
|
||
|
|
||
|
HWND
|
||
|
APIHOOK(CreateDialogParamA)(
|
||
|
HINSTANCE hInstance, // handle to module
|
||
|
LPCSTR lpTemplateName, // dialog box template
|
||
|
HWND hWndParent, // handle to owner window
|
||
|
DLGPROC lpDialogFunc, // dialog box procedure
|
||
|
LPARAM dwInitParam // initialization value
|
||
|
)
|
||
|
{
|
||
|
lpDialogFunc = (DLGPROC) HookCallback(lpDialogFunc, PlaneCrazy_DialogProcHook);
|
||
|
|
||
|
return ORIGINAL_API(CreateDialogParamA)( hInstance,
|
||
|
lpTemplateName,
|
||
|
hWndParent,
|
||
|
lpDialogFunc,
|
||
|
dwInitParam );
|
||
|
}
|
||
|
|
||
|
HWND
|
||
|
APIHOOK(CreateDialogParamW)(
|
||
|
HINSTANCE hInstance, // handle to module
|
||
|
LPCWSTR lpTemplateName, // dialog box template
|
||
|
HWND hWndParent, // handle to owner window
|
||
|
DLGPROC lpDialogFunc, // dialog box procedure
|
||
|
LPARAM dwInitParam // initialization value
|
||
|
)
|
||
|
{
|
||
|
lpDialogFunc = (DLGPROC) HookCallback(lpDialogFunc, PlaneCrazy_DialogProcHook);
|
||
|
|
||
|
return ORIGINAL_API(CreateDialogParamW)( hInstance,
|
||
|
lpTemplateName,
|
||
|
hWndParent,
|
||
|
lpDialogFunc,
|
||
|
dwInitParam );
|
||
|
}
|
||
|
|
||
|
HWND
|
||
|
APIHOOK(CreateDialogIndirectParamA)(
|
||
|
HINSTANCE hInstance, // handle to module
|
||
|
LPCDLGTEMPLATE lpTemplate, // dialog box template
|
||
|
HWND hWndParent, // handle to owner window
|
||
|
DLGPROC lpDialogFunc, // dialog box procedure
|
||
|
LPARAM lParamInit // initialization value
|
||
|
)
|
||
|
{
|
||
|
lpDialogFunc = (DLGPROC) HookCallback(lpDialogFunc, PlaneCrazy_DialogProcHook);
|
||
|
|
||
|
return ORIGINAL_API(CreateDialogIndirectParamA)( hInstance,
|
||
|
lpTemplate,
|
||
|
hWndParent,
|
||
|
lpDialogFunc,
|
||
|
lParamInit );
|
||
|
}
|
||
|
|
||
|
HWND
|
||
|
APIHOOK(CreateDialogIndirectParamW)(
|
||
|
HINSTANCE hInstance, // handle to module
|
||
|
LPCDLGTEMPLATE lpTemplate, // dialog box template
|
||
|
HWND hWndParent, // handle to owner window
|
||
|
DLGPROC lpDialogFunc, // dialog box procedure
|
||
|
LPARAM lParamInit // initialization value
|
||
|
)
|
||
|
{
|
||
|
lpDialogFunc = (DLGPROC) HookCallback(lpDialogFunc, PlaneCrazy_DialogProcHook);
|
||
|
|
||
|
return ORIGINAL_API(CreateDialogIndirectParamW)( hInstance,
|
||
|
lpTemplate,
|
||
|
hWndParent,
|
||
|
lpDialogFunc,
|
||
|
lParamInit );
|
||
|
}
|
||
|
|
||
|
HWND
|
||
|
APIHOOK(CreateDialogIndirectParamAorW)(
|
||
|
HINSTANCE hInstance, // handle to module
|
||
|
LPCDLGTEMPLATE lpTemplate, // dialog box template
|
||
|
HWND hWndParent, // handle to owner window
|
||
|
DLGPROC lpDialogFunc, // dialog box procedure
|
||
|
LPARAM lParamInit // initialization value
|
||
|
)
|
||
|
{
|
||
|
lpDialogFunc = (DLGPROC) HookCallback(lpDialogFunc, PlaneCrazy_DialogProcHook);
|
||
|
|
||
|
return ORIGINAL_API(CreateDialogIndirectParamAorW)( hInstance,
|
||
|
lpTemplate,
|
||
|
hWndParent,
|
||
|
lpDialogFunc,
|
||
|
lParamInit );
|
||
|
}
|
||
|
|
||
|
LONG
|
||
|
APIHOOK(SetWindowLongA)(
|
||
|
HWND hWnd,
|
||
|
int nIndex,
|
||
|
LONG dwNewLong
|
||
|
)
|
||
|
{
|
||
|
if( nIndex == GWL_WNDPROC )
|
||
|
dwNewLong = (LONG) HookCallback((PVOID)dwNewLong, PlaneCrazy_WindowProcHook);
|
||
|
else if( nIndex == DWL_DLGPROC )
|
||
|
dwNewLong = (LONG) HookCallback((PVOID)dwNewLong, PlaneCrazy_DialogProcHook);
|
||
|
|
||
|
return ORIGINAL_API(SetWindowLongA)( hWnd,
|
||
|
nIndex,
|
||
|
dwNewLong );
|
||
|
}
|
||
|
|
||
|
LONG
|
||
|
APIHOOK(SetWindowLongW)(
|
||
|
HWND hWnd,
|
||
|
int nIndex,
|
||
|
LONG dwNewLong
|
||
|
)
|
||
|
{
|
||
|
if( nIndex == GWL_WNDPROC )
|
||
|
dwNewLong = (LONG) HookCallback((PVOID)dwNewLong, PlaneCrazy_WindowProcHook);
|
||
|
else if( nIndex == DWL_DLGPROC )
|
||
|
dwNewLong = (LONG) HookCallback((PVOID)dwNewLong, PlaneCrazy_DialogProcHook);
|
||
|
|
||
|
return ORIGINAL_API(SetWindowLongA)( hWnd,
|
||
|
nIndex,
|
||
|
dwNewLong );
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Register hooked functions
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HOOK_BEGIN
|
||
|
APIHOOK_ENTRY(USER32.DLL, RegisterClassA)
|
||
|
APIHOOK_ENTRY(USER32.DLL, RegisterClassW)
|
||
|
APIHOOK_ENTRY(USER32.DLL, RegisterClassExA)
|
||
|
APIHOOK_ENTRY(USER32.DLL, RegisterClassExW)
|
||
|
APIHOOK_ENTRY(USER32.DLL, CreateDialogParamA)
|
||
|
APIHOOK_ENTRY(USER32.DLL, CreateDialogParamW)
|
||
|
APIHOOK_ENTRY(USER32.DLL, CreateDialogIndirectParamA)
|
||
|
APIHOOK_ENTRY(USER32.DLL, CreateDialogIndirectParamW)
|
||
|
APIHOOK_ENTRY(USER32.DLL, CreateDialogIndirectParamAorW)
|
||
|
APIHOOK_ENTRY(USER32.DLL, SetWindowLongA)
|
||
|
APIHOOK_ENTRY(USER32.DLL, SetWindowLongW)
|
||
|
HOOK_END
|
||
|
|
||
|
IMPLEMENT_SHIM_END
|
||
|
|