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

124 lines
2.2 KiB
C++

/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
MidTownMadness2.cpp
Abstract:
This app has a funky timing system whereby it waits for the processor that
it's running on to return a 'stable' speed. The calculation is especially
prone to problems on faster machines because there is greater uncertainty.
Not sure why we hit this so easily on dual-procs - perhaps something about
the scheduler wrt sleep and timeGetTime.
Notes:
This is an app specific shim.
History:
11/15/2001 linstev Created
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(MidTownMadness2)
#include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(Sleep)
APIHOOK_ENUM_ENTRY(timeGetTime)
APIHOOK_ENUM_END
DWORD g_dwState;
DWORD g_dwTimer;
DWORD g_dwLastTime;
/*++
After we call GetDlgItemTextA we convert the long path name to the short path name.
--*/
DWORD
APIHOOK(timeGetTime)(VOID)
{
DWORD dwRet = ORIGINAL_API(timeGetTime)();
switch (g_dwState) {
case 0:
// Initial state
g_dwLastTime = dwRet;
g_dwState++;
break;
case 1:
// Shouldn't get here, reset state
g_dwState = 0;
break;
case 2:
// We're in the known bad zone, return our precalculated value
dwRet = g_dwLastTime + g_dwTimer;
g_dwState = 0;
break;
}
return dwRet;
}
VOID
APIHOOK(Sleep)(
DWORD dwMilliseconds
)
{
//
// Check for their specific sleep and update our state if required
//
if (dwMilliseconds == 100 && g_dwState == 1) {
g_dwState = 2;
}
ORIGINAL_API(Sleep)(dwMilliseconds);
}
/*++
Register hooked functions
--*/
BOOL
NOTIFY_FUNCTION(
DWORD fdwReason)
{
if (fdwReason == SHIM_STATIC_DLLS_INITIALIZED) {
// Make the calculation that the app does
DWORD dwTimer = timeGetTime();
Sleep(100);
g_dwTimer = timeGetTime() - dwTimer;
// Set initial state to 0
g_dwState = 0;
}
return TRUE;
}
HOOK_BEGIN
CALL_NOTIFY_FUNCTION
APIHOOK_ENTRY(KERNEL32.DLL, Sleep)
APIHOOK_ENTRY(WINMM.DLL, timeGetTime)
HOOK_END
IMPLEMENT_SHIM_END