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

104 lines
2.6 KiB
C++

/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
PostIt2.cpp
Abstract:
This shim eliminates an infinite loop in 3M's Post-It Notes application
by preventing the WM_TIMECHANGE message from reaching the Post-It
Notes windows when the application triggers a time change using
SetTimeZoneInformation().
Notes:
This is an application specific shim.
History:
06/04/2001 tonyschr Created
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(PostIt2)
#include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(SetTimeZoneInformation)
APIHOOK_ENUM_ENTRY(CallWindowProcA)
APIHOOK_ENUM_END
static SYSTEMTIME g_localtime = { 0 };
BOOL
APIHOOK(SetTimeZoneInformation)(
CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation
)
{
BOOL fReturn = ORIGINAL_API(SetTimeZoneInformation)(lpTimeZoneInformation);
// Store off local time after this application requests timezone change.
GetLocalTime(&g_localtime);
return fReturn;
}
LRESULT
APIHOOK(CallWindowProcA)(
WNDPROC pfn,
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
// Detect whether the WM_TIMECHANGE message was triggered by the app calling
// SetTimeZoneInformation() or an external timechange by comparing the local
// time.
if (message == WM_TIMECHANGE)
{
SYSTEMTIME newtime;
GetLocalTime(&newtime);
if (newtime.wYear == g_localtime.wYear &&
newtime.wMonth == g_localtime.wMonth &&
newtime.wDayOfWeek == g_localtime.wDayOfWeek &&
newtime.wDay == g_localtime.wDay &&
newtime.wHour == g_localtime.wHour &&
newtime.wMinute == g_localtime.wMinute &&
newtime.wSecond == g_localtime.wSecond &&
newtime.wMilliseconds == g_localtime.wMilliseconds)
{
// Looks like this WM_TIMECHANGE was sent in response to the app
// calling SetTimeZoneInformation(), so block it.
// Note: Because of the asynchronous nature of window messages this
// might let an occasional WM_TIMECHANGE slip through, but it should
// always terminiate the infinite loop.
return 0;
}
}
return ORIGINAL_API(CallWindowProcA)(pfn, hwnd, message, wParam, lParam);
}
/*++
Register hooked functions
--*/
HOOK_BEGIN
APIHOOK_ENTRY(KERNEL32.DLL, SetTimeZoneInformation)
APIHOOK_ENTRY(USER32.DLL, CallWindowProcA)
HOOK_END
IMPLEMENT_SHIM_END