#include "StdAfx.h" #include "Timer.h" struct RsGlobalType { const char* AppName; unsigned int unkWidth, unkHeight; unsigned int MaximumWidth; unsigned int MaximumHeight; unsigned int frameLimit; BOOL quit; void* ps; void* keyboard; void* mouse; void* pad; }; bool* bSnapShotActive; static const void* RosieAudioFix_JumpBack; void (__stdcall *AudioResetTimers)(unsigned int); static void (*PrintString)(float,float,const wchar_t*); static bool* bWantsToDrawHud; static bool* bCamCheck; static RsGlobalType* RsGlobal; static const float* ResolutionWidthMult; static const float* ResolutionHeightMult; static const void* SubtitlesShadowFix_JumpBack; void __declspec(naked) RosiesAudioFix() { _asm { mov byte ptr [ebx+0CCh], 0 mov byte ptr [ebx+148h], 0 jmp [RosieAudioFix_JumpBack] } } void __stdcall Recalculate(float& fX, float& fY, signed int nShadow) { fX = nShadow * *ResolutionWidthMult * RsGlobal->MaximumWidth; fY = nShadow * *ResolutionHeightMult * RsGlobal->MaximumHeight; } template void AlteredPrintString(float fX, float fY, const wchar_t* pText) { float fMarginX = **reinterpret_cast(pFltX); float fMarginY = **reinterpret_cast(pFltY); PrintString(fX - fMarginX + (fMarginX * *ResolutionWidthMult * RsGlobal->MaximumWidth), fY - fMarginY + (fMarginY * *ResolutionHeightMult * RsGlobal->MaximumHeight), pText); } template void AlteredPrintStringMinus(float fX, float fY, const wchar_t* pText) { float fMarginX = **reinterpret_cast(pFltX); float fMarginY = **reinterpret_cast(pFltY); PrintString(fX + fMarginX - (fMarginX * *ResolutionWidthMult * RsGlobal->MaximumWidth), fY + fMarginY - (fMarginY * *ResolutionHeightMult * RsGlobal->MaximumHeight), pText); } template void AlteredPrintStringXOnly(float fX, float fY, const wchar_t* pText) { float fMarginX = **reinterpret_cast(pFltX); PrintString(fX - fMarginX + (fMarginX * *ResolutionWidthMult * RsGlobal->MaximumWidth), fY, pText); } template void AlteredPrintStringYOnly(float fX, float fY, const wchar_t* pText) { float fMarginY = **reinterpret_cast(pFltY); PrintString(fX, fY - fMarginY + (fMarginY * *ResolutionHeightMult * RsGlobal->MaximumHeight), pText); } float FixedRefValue() { return 1.0f; } void __declspec(naked) SubtitlesShadowFix() { _asm { mov [esp], eax fild [esp] push eax lea eax, [esp+20h-18h] push eax lea eax, [esp+24h-14h] push eax call Recalculate jmp SubtitlesShadowFix_JumpBack } } __forceinline void Patch_VC_10() { using namespace MemoryVP; AudioResetTimers = (void(__stdcall*)(unsigned int))0x5F98D0; PrintString = (void(*)(float,float,const wchar_t*))0x551040; bSnapShotActive = *(bool**)0x4D1239; RsGlobal = *(RsGlobalType**)0x602D32; ResolutionWidthMult = *(float**)0x5FA15E; ResolutionHeightMult = *(float**)0x5FA148; RosieAudioFix_JumpBack = (void*)0x42BFFE; SubtitlesShadowFix_JumpBack = (void*)0x551701; CTimer::ms_fTimeScale = *(float**)0x453D38; CTimer::ms_fTimeStep = *(float**)0x41A318; CTimer::ms_fTimeStepNotClipped = *(float**)0x40605B; CTimer::m_UserPause = *(bool**)0x4D0F91; CTimer::m_CodePause = *(bool**)0x4D0FAE; CTimer::m_snTimeInMilliseconds = *(int**)0x418CFC; CTimer::m_snPreviousTimeInMilliseconds = *(int**)0x41BB3A; CTimer::m_snTimeInMillisecondsNonClipped = *(int**)0x4D1081; CTimer::m_snTimeInMillisecondsPauseMode = *(int**)0x4D0FE2; CTimer::m_FrameCounter = *(unsigned int**)0x4D12CF; Patch(0x43E983, 16); Patch(0x43EC03, 16); Patch(0x43EECB, 16); Patch(0x43F52B, 16); Patch(0x43F842, 16); Patch(0x48EB27, 16); Patch(0x541E7E, 16); InjectHook(0x4D1300, CTimer::Initialise, PATCH_JUMP); InjectHook(0x4D0ED0, CTimer::Suspend, PATCH_JUMP); InjectHook(0x4D0E50, CTimer::Resume, PATCH_JUMP); InjectHook(0x4D0DF0, CTimer::GetCyclesPerFrame, PATCH_JUMP); InjectHook(0x4D0E30, CTimer::GetCyclesPerMillisecond, PATCH_JUMP); InjectHook(0x4D0F30, CTimer::Update, PATCH_JUMP); InjectHook(0x61AA7D, CTimer::RecoverFromSave); InjectHook(0x5433BD, FixedRefValue); InjectHook(0x42BFF7, RosiesAudioFix, PATCH_JUMP); InjectHook(0x5516FC, SubtitlesShadowFix, PATCH_JUMP); Patch(0x5517C4, 0xD9); Patch(0x5517DF, 0xD9); Patch(0x551832, 0xD9); Patch(0x551848, 0xD9); Patch(0x5517E2, 0x34-0x14); Patch(0x55184B, 0x34-0x14); Patch(0x5517C7, 0x28-0x18); Patch(0x551835, 0x24-0x18); Patch(0x5516FB, 0x90); InjectHook(0x5FA1FD, AlteredPrintString<0x5FA1F6,0x5FA1D5>); InjectHook(0x54474D, AlteredPrintStringMinus<0x544727,0x544727>); } __forceinline void Patch_VC_11() { using namespace MemoryVP; AudioResetTimers = (void(__stdcall*)(unsigned int))0x5F98F0; PrintString = (void(*)(float,float,const wchar_t*))0x551060; bSnapShotActive = *(bool**)0x4D1259; RsGlobal = *(RsGlobalType**)0x602D12; ResolutionWidthMult = *(float**)0x5FA17E; ResolutionHeightMult = *(float**)0x5FA168; RosieAudioFix_JumpBack = (void*)0x42BFFE; SubtitlesShadowFix_JumpBack = (void*)0x551721; CTimer::ms_fTimeScale = *(float**)0x453D38; CTimer::ms_fTimeStep = *(float**)0x41A318; CTimer::ms_fTimeStepNotClipped = *(float**)0x40605B; CTimer::m_UserPause = *(bool**)0x4D0FB1; CTimer::m_CodePause = *(bool**)0x4D0FCE; CTimer::m_snTimeInMilliseconds = *(int**)0x418CFC; CTimer::m_snPreviousTimeInMilliseconds = *(int**)0x41BB3A; CTimer::m_snTimeInMillisecondsNonClipped = *(int**)0x4D10A1; CTimer::m_snTimeInMillisecondsPauseMode = *(int**)0x4D1002; CTimer::m_FrameCounter = *(unsigned int**)0x4D12EF; Patch(0x43E983, 16); Patch(0x43EC03, 16); Patch(0x43EECB, 16); Patch(0x43F52B, 16); Patch(0x43F842, 16); Patch(0x48EB37, 16); Patch(0x541E9E, 16); InjectHook(0x4D1320, CTimer::Initialise, PATCH_JUMP); InjectHook(0x4D0EF0, CTimer::Suspend, PATCH_JUMP); InjectHook(0x4D0E70, CTimer::Resume, PATCH_JUMP); InjectHook(0x4D0E10, CTimer::GetCyclesPerFrame, PATCH_JUMP); InjectHook(0x4D0E50, CTimer::GetCyclesPerMillisecond, PATCH_JUMP); InjectHook(0x4D0F50, CTimer::Update, PATCH_JUMP); InjectHook(0x61AA5D, CTimer::RecoverFromSave); InjectHook(0x5433DD, FixedRefValue); InjectHook(0x42BFF7, RosiesAudioFix, PATCH_JUMP); InjectHook(0x55171C, SubtitlesShadowFix, PATCH_JUMP); Patch(0x5517E4, 0xD9); Patch(0x5517FF, 0xD9); Patch(0x551852, 0xD9); Patch(0x551868, 0xD9); Patch(0x551802, 0x34-0x14); Patch(0x55186B, 0x34-0x14); Patch(0x5517E7, 0x28-0x18); Patch(0x551855, 0x24-0x18); Patch(0x55171B, 0x90); InjectHook(0x5FA21D, AlteredPrintString<0x5FA216,0x5FA1F5>); InjectHook(0x54476D, AlteredPrintStringMinus<0x544747,0x544747>); } __forceinline void Patch_VC_Steam() { using namespace MemoryVP; AudioResetTimers = (void(__stdcall*)(unsigned int))0x5F9530; PrintString = (void(*)(float,float,const wchar_t*))0x550F30; bSnapShotActive = *(bool**)0x4D10F9; RsGlobal = *(RsGlobalType**)0x602952; ResolutionWidthMult = *(float**)0x5F9DBE; ResolutionHeightMult = *(float**)0x5F9DA8; RosieAudioFix_JumpBack = (void*)0x42BFCE; SubtitlesShadowFix_JumpBack = (void*)0x5515F1; CTimer::ms_fTimeScale = *(float**)0x453C18; CTimer::ms_fTimeStep = *(float**)0x41A318; CTimer::ms_fTimeStepNotClipped = *(float**)0x40605B; CTimer::m_UserPause = *(bool**)0x4D0E51; CTimer::m_CodePause = *(bool**)0x4D0E6E; CTimer::m_snTimeInMilliseconds = *(int**)0x418CFC; CTimer::m_snPreviousTimeInMilliseconds = *(int**)0x41BB3A; CTimer::m_snTimeInMillisecondsNonClipped = *(int**)0x4D0F41; CTimer::m_snTimeInMillisecondsPauseMode = *(int**)0x4D0EA2; CTimer::m_FrameCounter = *(unsigned int**)0x4D118F; Patch(0x43E8F3, 16); Patch(0x43EB73, 16); Patch(0x43EE3B, 16); Patch(0x43F49B, 16); Patch(0x43F7B2, 16); Patch(0x48EA37, 16); Patch(0x541D6E, 16); InjectHook(0x4D11C0, CTimer::Initialise, PATCH_JUMP); InjectHook(0x4D0D90, CTimer::Suspend, PATCH_JUMP); InjectHook(0x4D0D10, CTimer::Resume, PATCH_JUMP); InjectHook(0x4D0CB0, CTimer::GetCyclesPerFrame, PATCH_JUMP); InjectHook(0x4D0CF0, CTimer::GetCyclesPerMillisecond, PATCH_JUMP); InjectHook(0x4D0DF0, CTimer::Update, PATCH_JUMP); InjectHook(0x61A6A6, CTimer::RecoverFromSave); InjectHook(0x5432AD, FixedRefValue); InjectHook(0x42BFC7, RosiesAudioFix, PATCH_JUMP); InjectHook(0x5515EC, SubtitlesShadowFix, PATCH_JUMP); Patch(0x5516B4, 0xD9); Patch(0x5516CF, 0xD9); Patch(0x551722, 0xD9); Patch(0x551738, 0xD9); Patch(0x5516D2, 0x34-0x14); Patch(0x55173B, 0x34-0x14); Patch(0x5516B7, 0x28-0x18); Patch(0x551725, 0x24-0x18); Patch(0x5515EB, 0x90); InjectHook(0x5F9E5D, AlteredPrintString<0x5F9E56,0x5F9E35>); InjectHook(0x54463D, AlteredPrintStringMinus<0x544617,0x544617>); } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { UNREFERENCED_PARAMETER(hinstDLL); UNREFERENCED_PARAMETER(lpvReserved); if ( fdwReason == DLL_PROCESS_ATTACH ) { if(*(DWORD*)0x667BF0 == 0x53E58955) Patch_VC_10(); else if(*(DWORD*)0x667C40 == 0x53E58955) Patch_VC_11(); else if (*(DWORD*)0x666BA0 == 0x53E58955) Patch_VC_Steam(); else return FALSE; } return TRUE; }