windows-nt/Source/XPSP1/NT/windows/appcompat/shims/specific/descent2.cpp

189 lines
4.3 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
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