104 lines
2.7 KiB
C++
104 lines
2.7 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
|