From b27ec3a26451d9940bdc0e33869b509fc70b6cea Mon Sep 17 00:00:00 2001 From: Silent Date: Mon, 12 Sep 2016 00:09:21 +0200 Subject: [PATCH] Adapted for new Memory version --- DDraw/DDraw.vcxproj | 2 +- DDraw/dllmain.cpp | 1 + SilentPatchIII/SilentPatchIII.cpp | 24 ++--- SilentPatchSA/SilentPatchSA.cpp | 145 ++++++++++++------------------ SilentPatchVC/SilentPatchVC.cpp | 24 ++--- 5 files changed, 78 insertions(+), 118 deletions(-) diff --git a/DDraw/DDraw.vcxproj b/DDraw/DDraw.vcxproj index d461450..9955b29 100644 --- a/DDraw/DDraw.vcxproj +++ b/DDraw/DDraw.vcxproj @@ -42,7 +42,7 @@ AnySuitable Speed true - NDEBUG;_SIMPLE_MEMORY_ONLY;%(PreprocessorDefinitions) + NDEBUG;%(PreprocessorDefinitions) true MultiThreaded ..\SilentPatch;%(AdditionalIncludeDirectories) diff --git a/DDraw/dllmain.cpp b/DDraw/dllmain.cpp index 992ce7e..2542fbb 100644 --- a/DDraw/dllmain.cpp +++ b/DDraw/dllmain.cpp @@ -8,6 +8,7 @@ #include #include #include +#define _MEMORY_NO_CRT #include "MemoryMgr.h" extern "C" HRESULT WINAPI DirectDrawCreateEx(GUID FAR *lpGUID, LPVOID *lplpDD, REFIID iid, IUnknown FAR *pUnkOuter) diff --git a/SilentPatchIII/SilentPatchIII.cpp b/SilentPatchIII/SilentPatchIII.cpp index deef4bd..e580cff 100644 --- a/SilentPatchIII/SilentPatchIII.cpp +++ b/SilentPatchIII/SilentPatchIII.cpp @@ -435,9 +435,8 @@ void Patch_III_10(const RECT& desktop) InjectHook(0x46BADA, III_SensResetFix, PATCH_CALL); // (Hopefully) more precise frame limiter - int pAddress = 0x582EFD; - RsEventHandler = (void(*)(int,void*))(*(int*)(pAddress+1) + pAddress + 5); - InjectHook(pAddress, NewFrameRender); + ReadCall( 0x582EFD, RsEventHandler ); + InjectHook(0x582EFD, NewFrameRender); InjectHook(0x582EA4, GetTimeSinceLastFrame); // Default to desktop res @@ -458,8 +457,7 @@ void Patch_III_10(const RECT& desktop) // Reinit CCarCtrl fields (firetruck and ambulance generation) - int pCarCtrlReInit = 0x48C4FB; - orgCarCtrlReInit = (void(*)())(*(int*)(pCarCtrlReInit+1) + pCarCtrlReInit + 5); + ReadCall( 0x48C4FB, orgCarCtrlReInit ); InjectHook(0x48C4FB, CarCtrlReInit_SilentPatch); @@ -607,9 +605,8 @@ void Patch_III_11(const RECT& desktop) Patch(0x581FB4, &pCustomWndProc); // (Hopefully) more precise frame limiter - int pAddress = 0x58323D; - RsEventHandler = (void(*)(int,void*))(*(int*)(pAddress+1) + pAddress + 5); - InjectHook(pAddress, NewFrameRender); + ReadCall( 0x58323D, RsEventHandler ); + InjectHook(0x58323D, NewFrameRender); InjectHook(0x5831E4, GetTimeSinceLastFrame); // Default to desktop res @@ -630,8 +627,7 @@ void Patch_III_11(const RECT& desktop) // Reinit CCarCtrl fields (firetruck and ambulance generation) - int pCarCtrlReInit = 0x48C5FB; - orgCarCtrlReInit = (void(*)())(*(int*)(pCarCtrlReInit+1) + pCarCtrlReInit + 5); + ReadCall( 0x48C5FB, orgCarCtrlReInit ); InjectHook(0x48C5FB, CarCtrlReInit_SilentPatch); @@ -765,9 +761,8 @@ void Patch_III_Steam(const RECT& desktop) Patch(0x581EA4, &pCustomWndProc); // (Hopefully) more precise frame limiter - int pAddress = 0x58312D; - RsEventHandler = (void(*)(int,void*))(*(int*)(pAddress+1) + pAddress + 5); - InjectHook(pAddress, NewFrameRender); + ReadCall( 0x58312D, RsEventHandler ); + InjectHook(0x58312D, NewFrameRender); InjectHook(0x5830D4, GetTimeSinceLastFrame); // Default to desktop res @@ -788,8 +783,7 @@ void Patch_III_Steam(const RECT& desktop) // Reinit CCarCtrl fields (firetruck and ambulance generation) - int pCarCtrlReInit = 0x48C58B; - orgCarCtrlReInit = (void(*)())(*(int*)(pCarCtrlReInit+1) + pCarCtrlReInit + 5); + ReadCall( 0x48C58B, orgCarCtrlReInit ); InjectHook(0x48C58B, CarCtrlReInit_SilentPatch); diff --git a/SilentPatchSA/SilentPatchSA.cpp b/SilentPatchSA/SilentPatchSA.cpp index 2b09563..83c4fa9 100644 --- a/SilentPatchSA/SilentPatchSA.cpp +++ b/SilentPatchSA/SilentPatchSA.cpp @@ -939,7 +939,8 @@ void ShaderDetach() // Function for 1.01 BOOL Initialise3D(void* pParam) { - RwBool (*RsRwInitialize)(void*) = (RwBool(*)(void*))(*(int*)0x5BFB93 + 0x5BFB92 + 5); + RwBool (*RsRwInitialize)(void*); + Memory::ReadCall( 0x5BFB92, RsRwInitialize); if ( RsRwInitialize(pParam) ) return ShaderAttach(); return false; @@ -1975,7 +1976,7 @@ BOOL InjectDelayedPatches_10() if ( !bSAMP ) { - DoSunAndMoon = (void(*)())(*(int*)0x53C137 + 0x53C136 + 5); + ReadCall( 0x53C136, DoSunAndMoon ); InjectHook(0x53C136, SunAndMoonFarClip); Patch(0x6FC5AA, &fSunFarClip); } @@ -2021,9 +2022,9 @@ BOOL InjectDelayedPatches_10() { // Shaders! // plugin-sdk compatibility - InitialiseRenderWare = (bool(*)())(*(int*)0x5BF3A2 + 0x5BF3A1 + 5); - ShutdownRenderWare = (void(*)())(*(int*)0x53D911 + 0x53D910 + 5); - sub_5DA6A0 = (void(*)(void*,void*,void*,void*))(*(int*)0x5D66F2 + 0x5D66F1 + 5); + ReadCall( 0x5BF3A1, InitialiseRenderWare ); + ReadCall( 0x53D910, ShutdownRenderWare ); + ReadCall( 0x5D66F1, sub_5DA6A0 ); InjectHook(0x5DA743, SetShader); InjectHook(0x5D66F1, SetShader2); @@ -2065,8 +2066,8 @@ BOOL InjectDelayedPatches_10() InjectHook(0x470B05, &CRunningScript::GetDay_GymGlitch, PATCH_CALL); // Basketball fix - WipeLocalVariableMemoryForMissionScript = (void(*)())(*(int*)0x489A71 + 0x489A70 + 5); - TheScriptsLoad = (void(*)())(*(int*)0x5D18F1 + 0x5D18F0 + 5); + ReadCall( 0x489A70, WipeLocalVariableMemoryForMissionScript ); + ReadCall( 0x5D18F0, TheScriptsLoad ); InjectHook(0x5D18F0, TheScriptsLoad_BasketballFix); // Fixed for Hoodlum InjectHook(0x489A70, StartNewMission_SCMFixes); @@ -2203,7 +2204,7 @@ BOOL InjectDelayedPatches_11() if ( !bSAMP ) { - DoSunAndMoon = (void(*)())(*(int*)0x53C5D7 + 0x53C5D6 + 5); + ReadCall( 0x53C5D6, DoSunAndMoon ); InjectHook(0x53C5D6, SunAndMoonFarClip); Patch(0x6FCDDA, &fSunFarClip); @@ -2251,9 +2252,9 @@ BOOL InjectDelayedPatches_11() // Shaders! // plugin-sdk compatibility // 1.01 needs to reverse Initialise3D - InitialiseRenderWare = (bool(*)())(*(int*)0x5BFB9F + 0x5BFB9E + 5); - ShutdownRenderWare = (void(*)())(*(int*)0x53DDB1 + 0x53DDB0 + 5); - sub_5DA6A0 = (void(*)(void*,void*,void*,void*))(*(int*)0x5D6ED2 + 0x5D6ED1 + 5); + ReadCall( 0x5BFB9E, InitialiseRenderWare ); + ReadCall( 0x53DDB0, ShutdownRenderWare ); + ReadCall( 0x5D6ED1, sub_5DA6A0 ); InjectHook(0x5BFB70, Initialise3D, PATCH_JUMP); InjectHook(0x5D6ED1, SetShader2); @@ -2309,8 +2310,8 @@ BOOL InjectDelayedPatches_11() InjectHook(0x470B85, &CRunningScript::GetDay_GymGlitch, PATCH_CALL); // Basketball fix - WipeLocalVariableMemoryForMissionScript = (void(*)())(*(int*)0x489AF1 + 0x489AF0 + 5); - TheScriptsLoad = (void(*)())(*(int*)0x5D20D1 + 0x5D20D0 + 5); + ReadCall( 0x489AF0, WipeLocalVariableMemoryForMissionScript ); + ReadCall( 0x5D20D0, TheScriptsLoad ); InjectHook(0x5D20D0, TheScriptsLoad_BasketballFix); // Fixed for Hoodlum InjectHook(0x489A70, StartNewMission_SCMFixes); @@ -2428,7 +2429,7 @@ BOOL InjectDelayedPatches_Steam() if ( !bSAMP ) { - DoSunAndMoon = (void(*)())(*(int*)0x54E0B7 + 0x54E0B6 + 5); + ReadCall( 0x54E0B6, DoSunAndMoon ); InjectHook(0x54E0B6, SunAndMoonFarClip); Patch(0x734DEA, &fSunFarClip); @@ -2475,9 +2476,9 @@ BOOL InjectDelayedPatches_Steam() { // Shaders! // plugin-sdk compatibility - InitialiseRenderWare = (bool(*)())(*(int*)0x5DE5A2 + 0x5DE5A1 + 5); - ShutdownRenderWare = (void(*)())(*(int*)0x550071 + 0x550070 + 5); - sub_5DA6A0 = (void(*)(void*,void*,void*,void*))(*(int*)0x5F663F + 0x5F663E + 5); + ReadCall( 0x5DE5A1, InitialiseRenderWare ); + ReadCall( 0x550070, ShutdownRenderWare ); + ReadCall( 0x5F663E, sub_5DA6A0 ); InjectHook(0x5F6EB3, SetShader); InjectHook(0x5F2F02, SetShader2); @@ -2521,8 +2522,8 @@ BOOL InjectDelayedPatches_Steam() InjectHook(0x476C2C, &CRunningScript::GetDay_GymGlitch, PATCH_CALL); // Basketball fix - WipeLocalVariableMemoryForMissionScript = (void(*)())(*(int*)0x4907AF + 0x4907AE + 5); - TheScriptsLoad = (void(*)())(*(int*)0x5EE018 + 0x5EE017 + 5); + ReadCall( 0x4907AE, WipeLocalVariableMemoryForMissionScript ); + ReadCall( 0x5EE017, TheScriptsLoad ); InjectHook(0x5EE017, TheScriptsLoad_BasketballFix); // Fixed for Hoodlum InjectHook(0x4907AE, StartNewMission_SCMFixes); @@ -2619,7 +2620,7 @@ void Patch_SA_10() // IsAlreadyRunning needs to be read relatively late - the later, the better int pIsAlreadyRunning = AddressByRegion_10(0x74872D); - IsAlreadyRunning = (BOOL(*)())(*(int*)(pIsAlreadyRunning+1) + pIsAlreadyRunning + 5); + ReadCall( pIsAlreadyRunning, IsAlreadyRunning ); InjectHook(pIsAlreadyRunning, InjectDelayedPatches_10); // Newsteam crash fix @@ -2628,7 +2629,7 @@ void Patch_SA_10() // (Hopefully) more precise frame limiter int pAddress = AddressByRegion_10(0x748D9B); - RsEventHandler = (void(*)(int,void*))(*(int*)(pAddress+1) + pAddress + 5); + ReadCall( pAddress, RsEventHandler ); InjectHook(pAddress, NewFrameRender); InjectHook(AddressByRegion_10(0x748D1F), GetTimeSinceLastFrame); @@ -2927,19 +2928,16 @@ void Patch_SA_10() Patch(AddressByRegion_10(0x7F60C6), 0xEB); Patch(AddressByRegion_10(0x7F6683), 0xE990); - int pGetMaxMultiSamplingLevels = 0x57D136; - orgGetMaxMultiSamplingLevels = (RwUInt32(*)())(*(int*)(pGetMaxMultiSamplingLevels+1) + pGetMaxMultiSamplingLevels + 5); + ReadCall( 0x57D136, orgGetMaxMultiSamplingLevels ); InjectHook(0x57D136, GetMaxMultiSamplingLevels); InjectHook(0x57D0EA, GetMaxMultiSamplingLevels); - int pChangeMultiSamplingLevels = 0x5744FD; - orgChangeMultiSamplingLevels = (void(*)(RwUInt32))(*(int*)(pChangeMultiSamplingLevels+1) + pChangeMultiSamplingLevels + 5); + ReadCall( 0x5744FD, orgChangeMultiSamplingLevels ); InjectHook(0x5744FD, ChangeMultiSamplingLevels); InjectHook(0x57D162, ChangeMultiSamplingLevels); InjectHook(0x57D2A6, ChangeMultiSamplingLevels); - int pSetMultiSamplingLevels = 0x746350; - orgSetMultiSamplingLevels = (void(*)(RwUInt32))(*(int*)(pSetMultiSamplingLevels+1) + pSetMultiSamplingLevels + 5); + ReadCall( 0x746350, orgSetMultiSamplingLevels ); InjectHook(0x746350, SetMultiSamplingLevels); Nop(0x57A0FC, 1); @@ -2960,7 +2958,7 @@ void Patch_SA_10() pHoodlumCompat = 0x40F870; int pMemMgrMalloc = pHoodlumCompat + 0x63; - orgMemMgrMalloc = (void*(*)(RwUInt32,RwUInt32))(*(int*)(pMemMgrMalloc+1) + pMemMgrMalloc + 5); + ReadCall( pMemMgrMalloc, orgMemMgrMalloc ); InjectHook(pMemMgrMalloc, CollisionData_MallocAndInit); } { @@ -2977,7 +2975,7 @@ void Patch_SA_10() } int pNewAlloc = pHoodlumCompat + 0xC; - orgNewAlloc = (void*(*)(size_t))(*(int*)(pNewAlloc+1) + pNewAlloc + 5); + ReadCall( pNewAlloc, orgNewAlloc ); InjectHook(pHoodlumCompat + 0xC, CollisionData_NewAndInit); InjectHook(pHoodlumCompat2 + 0xD, CollisionData_NewAndInit); } @@ -2988,15 +2986,13 @@ void Patch_SA_10() // starting again in maximum resolution on secondary monitor. // Secondary monitor maximum resolution had to be greater than maximum resolution of primary monitor. // Not in 1.01 - int pGetNumVideoModes = 0x745B1E; - orgGetNumVideoModes = (RwInt32(*)())(*(int*)(pGetNumVideoModes+1) + pGetNumVideoModes + 5); + ReadCall( 0x745B1E, orgGetNumVideoModes ); InjectHook(0x745B1E, GetNumVideoModes_Store); InjectHook(0x745A81, GetNumVideoModes_Retrieve); // Fixed escalators crash - int pUpdateEscalators = 0x7185B5; - orgEscalatorsUpdate = (void(*)())(*(int*)(pUpdateEscalators+1) + pUpdateEscalators + 5); + ReadCall( 0x7185B5, orgEscalatorsUpdate ); InjectHook(0x7185B5, UpdateEscalators); InjectHook(0x71791F, &CEscalator::SwitchOffNoRemove); @@ -3037,12 +3033,12 @@ void Patch_SA_11() // IsAlreadyRunning needs to be read relatively late - the later, the better int pIsAlreadyRunning = AddressByRegion_11(0x749000); - IsAlreadyRunning = (BOOL(*)())(*(int*)(pIsAlreadyRunning+1) + pIsAlreadyRunning + 5); + ReadCall( pIsAlreadyRunning, IsAlreadyRunning ); InjectHook(pIsAlreadyRunning, InjectDelayedPatches_11); // (Hopefully) more precise frame limiter int pAddress = AddressByRegion_11(0x7496A0); - RsEventHandler = (void(*)(int,void*))(*(int*)(pAddress+1) + pAddress + 5); + ReadCall( pAddress, RsEventHandler ); InjectHook(pAddress, NewFrameRender); InjectHook(AddressByRegion_11(0x749624), GetTimeSinceLastFrame); @@ -3328,19 +3324,16 @@ void Patch_SA_11() Patch(AddressByRegion_11(0x7F69C6), 0xEB); Patch(AddressByRegion_11(0x7F6F83), 0xE990); - int pGetMaxMultiSamplingLevels = 0x57D916; - orgGetMaxMultiSamplingLevels = (RwUInt32(*)())(*(int*)(pGetMaxMultiSamplingLevels+1) + pGetMaxMultiSamplingLevels + 5); + ReadCall( 0x57D916, orgGetMaxMultiSamplingLevels ); InjectHook(0x57D916, GetMaxMultiSamplingLevels); InjectHook(0x57D8CA, GetMaxMultiSamplingLevels); - int pChangeMultiSamplingLevels = 0x574A6D; - orgChangeMultiSamplingLevels = (void(*)(RwUInt32))(*(int*)(pChangeMultiSamplingLevels+1) + pChangeMultiSamplingLevels + 5); + ReadCall( 0x574A6D, orgChangeMultiSamplingLevels ); InjectHook(0x574A6D, ChangeMultiSamplingLevels); InjectHook(0x57D942, ChangeMultiSamplingLevels); InjectHook(0x57DA86, ChangeMultiSamplingLevels); - int pSetMultiSamplingLevels = 0x746BD0; - orgSetMultiSamplingLevels = (void(*)(RwUInt32))(*(int*)(pSetMultiSamplingLevels+1) + pSetMultiSamplingLevels + 5); + ReadCall( 0x746BD0, orgSetMultiSamplingLevels ); InjectHook(0x746BD0, SetMultiSamplingLevels); Nop(0x57A66C, 1); @@ -3380,13 +3373,12 @@ void Patch_SA_Steam() ScopedUnprotect::Section Protect2( (HINSTANCE)0x400000, ".rdata" ); // IsAlreadyRunning needs to be read relatively late - the later, the better - IsAlreadyRunning = (BOOL(*)())(*(int*)(0x7826ED+1) + 0x7826ED + 5); + ReadCall( 0x7826ED, IsAlreadyRunning ); InjectHook(0x7826ED, InjectDelayedPatches_Steam); // (Hopefully) more precise frame limiter - int pAddress = 0x782D25; - RsEventHandler = (void(*)(int,void*))(*(int*)(pAddress+1) + pAddress + 5); - InjectHook(pAddress, NewFrameRender); + ReadCall( 0x782D25, RsEventHandler ); + InjectHook(0x782D25, NewFrameRender); InjectHook(0x782CA8, GetTimeSinceLastFrame); // Set CAEDataStream to use an old structure @@ -3641,19 +3633,16 @@ void Patch_SA_Steam() Patch(0x830086, 0xEB); Patch(0x830643, 0xE990); - int pGetMaxMultiSamplingLevels = 0x592BCF; - orgGetMaxMultiSamplingLevels = (RwUInt32(*)())(*(int*)(pGetMaxMultiSamplingLevels+1) + pGetMaxMultiSamplingLevels + 5); + ReadCall( 0x592BCF, orgGetMaxMultiSamplingLevels ); InjectHook(0x592BCF, GetMaxMultiSamplingLevels); InjectHook(0x592B81, GetMaxMultiSamplingLevels); - int pChangeMultiSamplingLevels = 0x5897CD; - orgChangeMultiSamplingLevels = (void(*)(RwUInt32))(*(int*)(pChangeMultiSamplingLevels+1) + pChangeMultiSamplingLevels + 5); + ReadCall( 0x5897CD, orgChangeMultiSamplingLevels ); InjectHook(0x5897CD, ChangeMultiSamplingLevels); InjectHook(0x592BFB, ChangeMultiSamplingLevels); InjectHook(0x592D2E, ChangeMultiSamplingLevels); - int pSetMultiSamplingLevels = 0x780206; - orgSetMultiSamplingLevels = (void(*)(RwUInt32))(*(int*)(pSetMultiSamplingLevels+1) + pSetMultiSamplingLevels + 5); + ReadCall( 0x780206, orgSetMultiSamplingLevels ); InjectHook(0x780206, SetMultiSamplingLevels); Patch(0x58F88C, 0xBA90); @@ -3666,12 +3655,10 @@ void Patch_SA_Steam() // Car explosion crash with multimonitor // Unitialized collision data breaking stencil shadows - int pMemMgrMalloc = 0x41A216; - orgMemMgrMalloc = (void*(*)(RwUInt32,RwUInt32))(*(int*)(pMemMgrMalloc+1) + pMemMgrMalloc + 5); + ReadCall( 0x41A216, orgMemMgrMalloc ); InjectHook(0x41A216, CollisionData_MallocAndInit); - int pNewAlloc = 0x41A07C; - orgNewAlloc = (void*(*)(size_t))(*(int*)(pNewAlloc+1) + pNewAlloc + 5); + ReadCall( 0x41A07C, orgNewAlloc ); InjectHook(0x41A07C, CollisionData_NewAndInit); InjectHook(0x41A159, CollisionData_NewAndInit); @@ -3681,15 +3668,13 @@ void Patch_SA_Steam() // starting again in maximum resolution on secondary monitor. // Secondary monitor maximum resolution had to be greater than maximum resolution of primary monitor. // Not in 1.01 - int pGetNumVideoModes = 0x77F99E; - orgGetNumVideoModes = (RwInt32(*)())(*(int*)(pGetNumVideoModes+1) + pGetNumVideoModes + 5); + ReadCall( 0x77F99E, orgGetNumVideoModes ); InjectHook(0x77F99E, GetNumVideoModes_Store); InjectHook(0x77F901, GetNumVideoModes_Retrieve); // Fixed escalators crash - int pUpdateEscalators = 0x739975; - orgEscalatorsUpdate = (void(*)())(*(int*)(pUpdateEscalators+1) + pUpdateEscalators + 5); + ReadCall( 0x739975, orgEscalatorsUpdate ); InjectHook(0x739975, UpdateEscalators); InjectHook(0x738BBD, &CEscalator::SwitchOffNoRemove); @@ -3827,8 +3812,7 @@ void Patch_SA_NewSteam_r2() ScopedUnprotect::Section Protect2( GetModuleHandle( nullptr ), ".rdata" ); // (Hopefully) more precise frame limiter - int pAddress = DynBaseAddress(0x77D55F); - RsEventHandler = (void(*)(int,void*))(*(int*)(pAddress+1) + pAddress + 5); + ReadCall( DynBaseAddress(0x77D55F), RsEventHandler ); InjectHook(0x77D55F, NewFrameRender); InjectHook(0x77D4E8, GetTimeSinceLastFrame); @@ -3930,19 +3914,16 @@ void Patch_SA_NewSteam_r2() Patch(0x82A916, 0xEB); Patch(0x82AED3, 0xE990); - int pGetMaxMultiSamplingLevels = DynBaseAddress(0x590F8B); - orgGetMaxMultiSamplingLevels = (RwUInt32(*)())(*(int*)(pGetMaxMultiSamplingLevels+1) + pGetMaxMultiSamplingLevels + 5); + ReadCall( DynBaseAddress(0x590F8B), orgGetMaxMultiSamplingLevels ); InjectHook(0x590F8B, GetMaxMultiSamplingLevels); InjectHook(0x590F36, GetMaxMultiSamplingLevels); - int pChangeMultiSamplingLevels = DynBaseAddress(0x5881C0); - orgChangeMultiSamplingLevels = (void(*)(RwUInt32))(*(int*)(pChangeMultiSamplingLevels+1) + pChangeMultiSamplingLevels + 5); + ReadCall( DynBaseAddress(0x5881C0), orgChangeMultiSamplingLevels ); InjectHook(0x5881C0, ChangeMultiSamplingLevels); InjectHook(0x590FBB, ChangeMultiSamplingLevels); InjectHook(0x591111, ChangeMultiSamplingLevels); - int pSetMultiSamplingLevels = DynBaseAddress(0x77A40D); - orgSetMultiSamplingLevels = (void(*)(RwUInt32))(*(int*)(pSetMultiSamplingLevels+1) + pSetMultiSamplingLevels + 5); + ReadCall( DynBaseAddress(0x77A40D), orgSetMultiSamplingLevels ); InjectHook(0x77A40D, SetMultiSamplingLevels); Patch(0x58DDEF, 0xBA90); @@ -3955,12 +3936,10 @@ void Patch_SA_NewSteam_r2() // Car explosion crash with multimonitor // Unitialized collision data breaking stencil shadows - int pMemMgrMalloc = DynBaseAddress(0x41A661); - orgMemMgrMalloc = (void*(*)(RwUInt32,RwUInt32))(*(int*)(pMemMgrMalloc+1) + pMemMgrMalloc + 5); + ReadCall( DynBaseAddress(0x41A661), orgMemMgrMalloc ); InjectHook(0x41A661, CollisionData_MallocAndInit); - int pNewAlloc = DynBaseAddress(0x41A4CC); - orgNewAlloc = (void*(*)(size_t))(*(int*)(pNewAlloc+1) + pNewAlloc + 5); + ReadCall( DynBaseAddress(0x41A4CC), orgNewAlloc ); InjectHook(0x41A4CC, CollisionData_NewAndInit); InjectHook(0x41A5A9, CollisionData_NewAndInit); @@ -3970,8 +3949,7 @@ void Patch_SA_NewSteam_r2() // starting again in maximum resolution on secondary monitor. // Secondary monitor maximum resolution had to be greater than maximum resolution of primary monitor. // Not in 1.01 - int pGetNumVideoModes = DynBaseAddress(0x779B71); - orgGetNumVideoModes = (RwInt32(*)())(*(int*)(pGetNumVideoModes+1) + pGetNumVideoModes + 5); + ReadCall( DynBaseAddress(0x779B71), orgGetNumVideoModes ); InjectHook(0x779B71, GetNumVideoModes_Store); InjectHook(0x779AD1, GetNumVideoModes_Retrieve); @@ -4023,8 +4001,7 @@ void Patch_SA_NewSteam_r2_lv() ScopedUnprotect::Section Protect2( GetModuleHandle( nullptr ), ".rdata" ); // (Hopefully) more precise frame limiter - int pAddress = DynBaseAddress(0x77D44F); - RsEventHandler = (void(*)(int,void*))(*(int*)(pAddress+1) + pAddress + 5); + ReadCall( DynBaseAddress(0x77D44F), RsEventHandler ); InjectHook(0x77D44F, NewFrameRender); InjectHook(0x77D3D8, GetTimeSinceLastFrame); @@ -4126,19 +4103,16 @@ void Patch_SA_NewSteam_r2_lv() Patch(0x82A7E6, 0xEB); Patch(0x82ADA3, 0xE990); - int pGetMaxMultiSamplingLevels = DynBaseAddress(0x590ECB); - orgGetMaxMultiSamplingLevels = (RwUInt32(*)())(*(int*)(pGetMaxMultiSamplingLevels+1) + pGetMaxMultiSamplingLevels + 5); + ReadCall( DynBaseAddress(0x590ECB), orgGetMaxMultiSamplingLevels ); InjectHook(0x590ECB, GetMaxMultiSamplingLevels); InjectHook(0x590E76, GetMaxMultiSamplingLevels); - int pChangeMultiSamplingLevels = DynBaseAddress(0x588100); - orgChangeMultiSamplingLevels = (void(*)(RwUInt32))(*(int*)(pChangeMultiSamplingLevels+1) + pChangeMultiSamplingLevels + 5); + ReadCall( DynBaseAddress(0x588100), orgChangeMultiSamplingLevels ); InjectHook(0x588100, ChangeMultiSamplingLevels); InjectHook(0x590EFB, ChangeMultiSamplingLevels); InjectHook(0x591051, ChangeMultiSamplingLevels); - int pSetMultiSamplingLevels = DynBaseAddress(0x77A2FD); - orgSetMultiSamplingLevels = (void(*)(RwUInt32))(*(int*)(pSetMultiSamplingLevels+1) + pSetMultiSamplingLevels + 5); + ReadCall( DynBaseAddress(0x77A2FD), orgSetMultiSamplingLevels ); InjectHook(0x77A2FD, SetMultiSamplingLevels); Patch(0x58DD2F, 0xBA90); @@ -4151,12 +4125,10 @@ void Patch_SA_NewSteam_r2_lv() // Car explosion crash with multimonitor // Unitialized collision data breaking stencil shadows - int pMemMgrMalloc = DynBaseAddress(0x41A661); - orgMemMgrMalloc = (void*(*)(RwUInt32,RwUInt32))(*(int*)(pMemMgrMalloc+1) + pMemMgrMalloc + 5); + ReadCall( DynBaseAddress(0x41A661), orgMemMgrMalloc ); InjectHook(0x41A661, CollisionData_MallocAndInit); - int pNewAlloc = DynBaseAddress(0x41A4CC); - orgNewAlloc = (void*(*)(size_t))(*(int*)(pNewAlloc+1) + pNewAlloc + 5); + ReadCall( DynBaseAddress(0x41A4CC), orgNewAlloc ); InjectHook(0x41A4CC, CollisionData_NewAndInit); InjectHook(0x41A5A9, CollisionData_NewAndInit); @@ -4166,8 +4138,7 @@ void Patch_SA_NewSteam_r2_lv() // starting again in maximum resolution on secondary monitor. // Secondary monitor maximum resolution had to be greater than maximum resolution of primary monitor. // Not in 1.01 - int pGetNumVideoModes = DynBaseAddress(0x779A61); - orgGetNumVideoModes = (RwInt32(*)())(*(int*)(pGetNumVideoModes+1) + pGetNumVideoModes + 5); + ReadCall( DynBaseAddress(0x779A61), orgGetNumVideoModes ); InjectHook(0x779A61, GetNumVideoModes_Store); InjectHook(0x7799C1, GetNumVideoModes_Retrieve); diff --git a/SilentPatchVC/SilentPatchVC.cpp b/SilentPatchVC/SilentPatchVC.cpp index f1979c5..24fd715 100644 --- a/SilentPatchVC/SilentPatchVC.cpp +++ b/SilentPatchVC/SilentPatchVC.cpp @@ -254,9 +254,8 @@ void Patch_VC_10(const RECT& desktop) Patch(0x601740, 0xC3C030); // (Hopefully) more precise frame limiter - int pAddress = 0x6004A2; - RsEventHandler = (void(*)(int,void*))(*(int*)(pAddress+1) + pAddress + 5); - InjectHook(pAddress, NewFrameRender); + ReadCall( 0x6004A2, RsEventHandler ); + InjectHook(0x6004A2, NewFrameRender); InjectHook(0x600449, GetTimeSinceLastFrame); // Default to desktop res @@ -320,8 +319,7 @@ void Patch_VC_10(const RECT& desktop) // Reinit CCarCtrl fields (firetruck and ambulance generation) - int pCarCtrlReInit = 0x4A489B; - orgCarCtrlReInit = (void(*)())(*(int*)(pCarCtrlReInit+1) + pCarCtrlReInit + 5); + ReadCall( 0x4A489B, orgCarCtrlReInit ); InjectHook(0x4A489B, CarCtrlReInit_SilentPatch); @@ -405,9 +403,8 @@ void Patch_VC_11(const RECT& desktop) Patch(0x601770, 0xC3C030); // (Hopefully) more precise frame limiter - int pAddress = 0x6004C2; - RsEventHandler = (void(*)(int,void*))(*(int*)(pAddress+1) + pAddress + 5); - InjectHook(pAddress, NewFrameRender); + ReadCall( 0x6004C2, RsEventHandler ); + InjectHook(0x6004C2, NewFrameRender); InjectHook(0x600469, GetTimeSinceLastFrame); // Default to desktop res @@ -471,8 +468,7 @@ void Patch_VC_11(const RECT& desktop) // Reinit CCarCtrl fields (firetruck and ambulance generation) - int pCarCtrlReInit = 0x4A48BB; - orgCarCtrlReInit = (void(*)())(*(int*)(pCarCtrlReInit+1) + pCarCtrlReInit + 5); + ReadCall( 0x4A48BB, orgCarCtrlReInit ); InjectHook(0x4A48BB, CarCtrlReInit_SilentPatch); @@ -547,9 +543,8 @@ void Patch_VC_Steam(const RECT& desktop) Patch(0x6013B0, 0xC3C030); // (Hopefully) more precise frame limiter - int pAddress = 0x600102; - RsEventHandler = (void(*)(int,void*))(*(int*)(pAddress+1) + pAddress + 5); - InjectHook(pAddress, NewFrameRender); + ReadCall( 0x600102, RsEventHandler ); + InjectHook(0x600102, NewFrameRender); InjectHook(0x6000A9, GetTimeSinceLastFrame); // Default to desktop res @@ -612,8 +607,7 @@ void Patch_VC_Steam(const RECT& desktop) // Reinit CCarCtrl fields (firetruck and ambulance generation) - int pCarCtrlReInit = 0x4A475B; - orgCarCtrlReInit = (void(*)())(*(int*)(pCarCtrlReInit+1) + pCarCtrlReInit + 5); + ReadCall( 0x4A475B, orgCarCtrlReInit ); InjectHook(0x4A475B, CarCtrlReInit_SilentPatch);