124 lines
2.2 KiB
C++
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
|
|
|