105 lines
1.8 KiB
C++
105 lines
1.8 KiB
C++
/*++
|
|
|
|
Copyright (c) 2000-2002 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
LazyReleaseDC.cpp
|
|
|
|
Abstract:
|
|
|
|
Delay releasing a DC by one call. A DC is not released until the next call to ReleaseDC
|
|
|
|
Notes:
|
|
|
|
This is a general purpose shim.
|
|
|
|
History:
|
|
|
|
10/10/1999 linstev Created
|
|
02/05/2002 mnikkel Changed InitializeCriticalSection to InitializeCriticalSectionAndSpinCount
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
IMPLEMENT_SHIM_BEGIN(LazyReleaseDC)
|
|
#include "ShimHookMacro.h"
|
|
|
|
APIHOOK_ENUM_BEGIN
|
|
APIHOOK_ENUM_ENTRY(ReleaseDC)
|
|
APIHOOK_ENUM_END
|
|
|
|
HWND g_hWndPrev;
|
|
HDC g_hDcPrev;
|
|
CRITICAL_SECTION g_MakeThreadSafe;
|
|
|
|
/*++
|
|
|
|
Save this hWnd and hdc for releasing later. If there is already a DC to be
|
|
released, release it now.
|
|
|
|
--*/
|
|
|
|
int
|
|
APIHOOK(ReleaseDC)(
|
|
HWND hWnd,
|
|
HDC hdc
|
|
)
|
|
{
|
|
UINT uRet = 1; // All's well
|
|
|
|
EnterCriticalSection(&g_MakeThreadSafe);
|
|
|
|
// If there is a previous DC, release it now
|
|
if (g_hDcPrev) {
|
|
uRet = ORIGINAL_API(ReleaseDC)(g_hWndPrev, g_hDcPrev);
|
|
}
|
|
|
|
g_hWndPrev = hWnd;
|
|
g_hDcPrev = hdc;
|
|
|
|
LeaveCriticalSection(&g_MakeThreadSafe);
|
|
|
|
return uRet;
|
|
}
|
|
|
|
/*++
|
|
|
|
Register hooked functions
|
|
|
|
--*/
|
|
|
|
BOOL
|
|
NOTIFY_FUNCTION(
|
|
DWORD fdwReason
|
|
)
|
|
{
|
|
if (fdwReason == DLL_PROCESS_ATTACH) {
|
|
g_hWndPrev = 0;
|
|
g_hDcPrev = 0;
|
|
|
|
return InitializeCriticalSectionAndSpinCount(&g_MakeThreadSafe,0x80000000);
|
|
}
|
|
|
|
// Ignore Detach code
|
|
/*
|
|
else if (fdwReason == DLL_PROCESS_DETACH) {
|
|
DeleteCriticalSection(&g_MakeThreadSafe);
|
|
}
|
|
*/
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
HOOK_BEGIN
|
|
|
|
CALL_NOTIFY_FUNCTION
|
|
APIHOOK_ENTRY(USER32.DLL, ReleaseDC)
|
|
|
|
HOOK_END
|
|
|
|
|
|
IMPLEMENT_SHIM_END
|
|
|