189 lines
4.3 KiB
C++
189 lines
4.3 KiB
C++
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Descent2.cpp
|
|
|
|
Abstract:
|
|
|
|
Hooks all application-defined window procedures and forcefully clears the
|
|
background to white. For some reason the EraseBackground that normally
|
|
comes through on win9x does not always work.
|
|
|
|
Notes:
|
|
|
|
This shim can be reused for other shims that need to forcefully clear the
|
|
background.
|
|
|
|
History:
|
|
|
|
03/28/2000 a-michni Created
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
IMPLEMENT_SHIM_BEGIN(Descent2)
|
|
#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(SetWindowLongA)
|
|
APIHOOK_ENUM_ENTRY(SetWindowLongW)
|
|
APIHOOK_ENUM_END
|
|
|
|
/*++
|
|
|
|
Change WM_ERASEBKGND behaviour
|
|
|
|
--*/
|
|
|
|
|
|
LRESULT CALLBACK
|
|
Descent2_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
|
|
)
|
|
{
|
|
HDC hdc;
|
|
RECT rc;
|
|
|
|
/* Retrieve the size info and fill with a standard White */
|
|
switch( uMsg )
|
|
{
|
|
case WM_ERASEBKGND:
|
|
hdc = (HDC) wParam;
|
|
GetClientRect(hwnd, &rc);
|
|
SetMapMode(hdc, MM_ANISOTROPIC);
|
|
SetWindowExtEx(hdc, 100, 100, NULL);
|
|
SetViewportExtEx(hdc, rc.right, rc.bottom, NULL);
|
|
FillRect(hdc, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH));
|
|
break;
|
|
|
|
default: break;
|
|
}
|
|
|
|
return (*pfnOld)(hwnd, uMsg, wParam, lParam);
|
|
}
|
|
|
|
INT_PTR CALLBACK
|
|
Descent2_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
|
|
)
|
|
{
|
|
return (*pfnOld)(hwndDlg, uMsg, wParam, lParam);
|
|
}
|
|
|
|
|
|
|
|
ATOM
|
|
APIHOOK(RegisterClassA)(
|
|
CONST WNDCLASSA *lpWndClass // class data
|
|
)
|
|
{
|
|
WNDCLASSA wcNewWndClass = *lpWndClass;
|
|
|
|
wcNewWndClass.lpfnWndProc = (WNDPROC) HookCallback(lpWndClass->lpfnWndProc, Descent2_WindowProcHook);
|
|
|
|
return ORIGINAL_API(RegisterClassA)(&wcNewWndClass);
|
|
}
|
|
|
|
ATOM
|
|
APIHOOK(RegisterClassW)(
|
|
CONST WNDCLASSW *lpWndClass // class data
|
|
)
|
|
{
|
|
WNDCLASSW wcNewWndClass = *lpWndClass;
|
|
|
|
wcNewWndClass.lpfnWndProc = (WNDPROC) HookCallback(lpWndClass->lpfnWndProc, Descent2_WindowProcHook);
|
|
|
|
return ORIGINAL_API(RegisterClassW)(&wcNewWndClass);
|
|
}
|
|
|
|
ATOM
|
|
APIHOOK(RegisterClassExA)(
|
|
CONST WNDCLASSEXA *lpwcx // class data
|
|
)
|
|
{
|
|
WNDCLASSEXA wcNewWndClass = *lpwcx;
|
|
|
|
wcNewWndClass.lpfnWndProc = (WNDPROC) HookCallback(lpwcx->lpfnWndProc, Descent2_WindowProcHook);
|
|
|
|
return ORIGINAL_API(RegisterClassExA)(&wcNewWndClass);
|
|
}
|
|
|
|
ATOM
|
|
APIHOOK(RegisterClassExW)(
|
|
CONST WNDCLASSEXW *lpwcx // class data
|
|
)
|
|
{
|
|
WNDCLASSEXW wcNewWndClass = *lpwcx;
|
|
|
|
wcNewWndClass.lpfnWndProc = (WNDPROC) HookCallback(lpwcx->lpfnWndProc, Descent2_WindowProcHook);
|
|
|
|
return ORIGINAL_API(RegisterClassExW)(&wcNewWndClass);
|
|
}
|
|
|
|
LONG
|
|
APIHOOK(SetWindowLongA)(
|
|
HWND hWnd,
|
|
int nIndex,
|
|
LONG dwNewLong
|
|
)
|
|
{
|
|
if( nIndex == GWL_WNDPROC )
|
|
dwNewLong = (LONG) HookCallback((PVOID)dwNewLong, Descent2_WindowProcHook);
|
|
else if( nIndex == DWL_DLGPROC )
|
|
dwNewLong = (LONG) HookCallback((PVOID)dwNewLong, Descent2_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, Descent2_WindowProcHook);
|
|
else if( nIndex == DWL_DLGPROC )
|
|
dwNewLong = (LONG) HookCallback((PVOID)dwNewLong, Descent2_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, SetWindowLongA)
|
|
APIHOOK_ENTRY(USER32.DLL, SetWindowLongW)
|
|
|
|
HOOK_END
|
|
|
|
IMPLEMENT_SHIM_END
|
|
|