From ea3f58dd5f15629ab4e6c389470de86ed2bebede Mon Sep 17 00:00:00 2001 From: illusiony <37698908+illusion0001@users.noreply.github.com> Date: Wed, 30 Apr 2025 11:00:15 +1200 Subject: [PATCH 1/2] LogPatchFailed: Message box on fail optional --- include/helper.hpp | 12 ++++++------ source/Shared/helper.cpp | 26 +++++++++++++++----------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/include/helper.hpp b/include/helper.hpp index 9f2fb7b..93f569a 100644 --- a/include/helper.hpp +++ b/include/helper.hpp @@ -24,24 +24,24 @@ void file_log2(const wchar_t* fmt, ...); const wchar_t* GetBoolStr(bool input_bool); void LoggingInit(const wchar_t* Project_Name, const wchar_t* Project_Log_Name); void ShowPatchInfo(size_t Patch_Size, uint64_t Patch_Addr, const wchar_t* Patch_Name, uint64_t Patch_Function_Target); -void LogPatchFailed(const wchar_t* Patch_Name, const wchar_t* Patch_Pattern); -uintptr_t WritePatchPattern(const wchar_t* Patch_Pattern, const unsigned char* Patch_Bytes, size_t Patch_Size, const wchar_t* Patch_Name, uint64_t Patch_Offset); -void WritePatchPattern_Hook(const wchar_t* Patch_Pattern, size_t Patch_Size, const wchar_t* Patch_Name, uint64_t Patch_Offset, void* Function_Target, uint64_t* Return_Address); +void LogPatchFailed(const wchar_t* Patch_Name, const wchar_t* Patch_Pattern, const bool FailedQuiet); +uintptr_t WritePatchPattern(const wchar_t* Patch_Pattern, const unsigned char* Patch_Bytes, size_t Patch_Size, const wchar_t* Patch_Name, uint64_t Patch_Offset, const bool FailedQuiet = false); +void WritePatchPattern_Hook(const wchar_t* Patch_Pattern, size_t Patch_Size, const wchar_t* Patch_Name, uint64_t Patch_Offset, void* Function_Target, uint64_t* Return_Address, const bool FailedQuiet = false); void WritePatchPattern_Int(uint32_t mode, const wchar_t* Patch_Pattern, void* Patch_Value, const wchar_t* Patch_Name, uint64_t Patch_Offset); void WritePatchAddress(uint64_t Patch_Address, const unsigned char* Patch_Bytes, size_t Patch_Size, const wchar_t* Patch_Name, uint64_t Patch_Offset); void WritePatchAddressFloat32(uint64_t Patch_Address, const float* Patch_Bytes, const wchar_t* Patch_Name, uint64_t Patch_Offset); void WritePatchAddressFloat64(uint64_t Patch_Address, const double* Patch_Bytes, const wchar_t* Patch_Name, uint64_t Patch_Offset); wchar_t* GetRunningPath(wchar_t* output); wchar_t* GetModuleName(wchar_t* output); -uintptr_t FindAndPrintPatternW(const wchar_t* Patch_Pattern, const wchar_t* Pattern_Name, size_t offset = 0); -uintptr_t FindAndPrintPatternW(const HMODULE Module, const wchar_t* Patch_Pattern, const wchar_t* Pattern_Name, size_t offset = 0); +uintptr_t FindAndPrintPatternW(const wchar_t* Patch_Pattern, const wchar_t* Pattern_Name, size_t offset = 0, const bool FailedQuiet = false); +uintptr_t FindAndPrintPatternW(const HMODULE Module, const wchar_t* Patch_Pattern, const wchar_t* Pattern_Name, size_t offset = 0, const bool FailedQuiet = false); uintptr_t FindInt3Jmp(const HMODULE Module); uintptr_t FindInt3Jmp(); void Make32to64Call(void* source_target, void* second_jmp, void* target_jmp, uint32_t source_size, const wchar_t* source_name, const wchar_t* second_jmp_name, const wchar_t* target_jmp_name); void Make32to64Hook(void* source_target, void* second_jmp, void* target_jmp, uint32_t source_size, const wchar_t* source_name, const wchar_t* second_jmp_name, const wchar_t* target_jmp_name); void Make32Hook(void* source_target, void* target_jmp, uint32_t source_size, const wchar_t* source_name, const wchar_t* target_jmp_name); void Make64Hook(void* source_target, void* target_jmp, uint32_t source_size, const wchar_t* source_name, const wchar_t* target_jmp_name); -uintptr_t ReadLEA32(const wchar_t* Patch_Pattern, const wchar_t* Pattern_Name, size_t offset, size_t lea_size, size_t lea_opcode_size); +uintptr_t ReadLEA32(const wchar_t* Patch_Pattern, const wchar_t* Pattern_Name, size_t offset, size_t lea_size, size_t lea_opcode_size, const bool FailedQuiet = false); uintptr_t ReadLEA32(uintptr_t Address, const wchar_t* Pattern_Name, size_t offset, size_t lea_size, size_t lea_opcode_size); #define MAKE32HOOK(src,mid,dest,size) Make32to64Hook((void*)(src),(void*)(mid),(void*)(dest),size,TEXT(#src) " Size: " #size ,TEXT(#mid),TEXT(#dest)) diff --git a/source/Shared/helper.cpp b/source/Shared/helper.cpp index 582c975..1d6a7cc 100644 --- a/source/Shared/helper.cpp +++ b/source/Shared/helper.cpp @@ -74,10 +74,14 @@ void ShowPatchInfo(size_t Patch_Size, uint64_t Patch_Addr, const wchar_t* Patch_ LOG(L"Patch Function Target: 0x%016llx\n", Patch_Function_Target); } -void LogPatchFailed(const wchar_t* Patch_Name, const wchar_t* Patch_Pattern) +void LogPatchFailed(const wchar_t* Patch_Name, const wchar_t* Patch_Pattern, const bool FailedQuiet) { LOG(L"\"%s\" Pattern Scan Failed. Please adjust your scan patterns and try again\n", Patch_Name); LOG(L"Pattern \"%s\"\n", Patch_Pattern); + if (FailedQuiet) + { + return; + } #ifndef _DEBUG wchar_t msg[8 * 1024]{}; _snwprintf_s(msg, _countof(msg), _TRUNCATE, L"" @@ -105,7 +109,7 @@ void LogPatchFailed(const wchar_t* Patch_Name, const wchar_t* Patch_Pattern) #endif } -uintptr_t WritePatchPattern(const wchar_t* Patch_Pattern, const unsigned char* Patch_Bytes, size_t Patch_Size, const wchar_t* Patch_Name, uint64_t Patch_Offset) +uintptr_t WritePatchPattern(const wchar_t* Patch_Pattern, const unsigned char* Patch_Bytes, size_t Patch_Size, const wchar_t* Patch_Name, uint64_t Patch_Offset, const bool FailedQuiet) { uint8_t* Address_Result = Memory::PatternScanW(baseModule, Patch_Pattern); uintptr_t Patch_Address = 0; @@ -118,13 +122,13 @@ uintptr_t WritePatchPattern(const wchar_t* Patch_Pattern, const unsigned char* P } else { - LogPatchFailed(Patch_Name, Patch_Pattern); + LogPatchFailed(Patch_Name, Patch_Pattern, FailedQuiet); return 0; } return 0; } -void WritePatchPattern_Hook(const wchar_t* Patch_Pattern, size_t Patch_Size, const wchar_t* Patch_Name, uint64_t Patch_Offset, void* Function_Target, uint64_t* Return_Address) +void WritePatchPattern_Hook(const wchar_t* Patch_Pattern, size_t Patch_Size, const wchar_t* Patch_Name, uint64_t Patch_Offset, void* Function_Target, uint64_t* Return_Address, const bool FailedQuiet) { uint8_t* Address_Result = nullptr; Address_Result = Memory::PatternScanW(baseModule, Patch_Pattern); @@ -151,7 +155,7 @@ void WritePatchPattern_Hook(const wchar_t* Patch_Pattern, size_t Patch_Size, con } else { - LogPatchFailed(Patch_Name, Patch_Pattern); + LogPatchFailed(Patch_Name, Patch_Pattern, FailedQuiet); } } @@ -243,7 +247,7 @@ wchar_t* ConvertToWideChar(const char* input) return output; } -uintptr_t FindAndPrintPatternW(const HMODULE Module, const wchar_t* Patch_Pattern, const wchar_t* Pattern_Name, size_t offset) +uintptr_t FindAndPrintPatternW(const HMODULE Module, const wchar_t* Patch_Pattern, const wchar_t* Pattern_Name, size_t offset, const bool FailedQuiet) { size_t Address_Result = (size_t)Memory::PatternScanW(Module, Patch_Pattern); size_t Patch_Address = 0; @@ -263,14 +267,14 @@ uintptr_t FindAndPrintPatternW(const HMODULE Module, const wchar_t* Patch_Patter } else { - LogPatchFailed(Pattern_Name, Patch_Pattern); + LogPatchFailed(Pattern_Name, Patch_Pattern, FailedQuiet); } return 0; } -uintptr_t FindAndPrintPatternW(const wchar_t* Patch_Pattern, const wchar_t* Pattern_Name, size_t offset) +uintptr_t FindAndPrintPatternW(const wchar_t* Patch_Pattern, const wchar_t* Pattern_Name, size_t offset, const bool FailedQuiet) { - return FindAndPrintPatternW(baseModule, Patch_Pattern, Pattern_Name, offset); + return FindAndPrintPatternW(baseModule, Patch_Pattern, Pattern_Name, offset, FailedQuiet); } #define INT3PATTERN_OFFSET 1 @@ -349,7 +353,7 @@ void Make64Hook(void* source_target, void* target_jmp, uint32_t source_size, con LOG(L"Created jump %s (0x%016llx) to %s (0x%016llx)\n", source_name, (uintptr_t)source_target, target_jmp_name, (uintptr_t)target_jmp); } -uintptr_t ReadLEA32(const wchar_t* Patch_Pattern, const wchar_t* Pattern_Name, size_t offset, size_t lea_size, size_t lea_opcode_size) +uintptr_t ReadLEA32(const wchar_t* Patch_Pattern, const wchar_t* Pattern_Name, size_t offset, size_t lea_size, size_t lea_opcode_size, const bool FailedQuiet) { uintptr_t Address_Result = (uintptr_t)Memory::PatternScanW(baseModule, Patch_Pattern); uintptr_t Patch_Address = 0; @@ -374,7 +378,7 @@ uintptr_t ReadLEA32(const wchar_t* Patch_Pattern, const wchar_t* Pattern_Name, s } else { - LogPatchFailed(Pattern_Name, Patch_Pattern); + LogPatchFailed(Pattern_Name, Patch_Pattern, FailedQuiet); } return 0; } From 247ab6cb78b7aeba2e49f54a531727ad768dc2d9 Mon Sep 17 00:00:00 2001 From: illusiony <37698908+illusion0001@users.noreply.github.com> Date: Wed, 30 Apr 2025 12:35:17 +1200 Subject: [PATCH 2/2] Control: Alert user if `DebugCameraKeyCheckAddr` fails --- source/Control.Patches/dllmain.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/source/Control.Patches/dllmain.cpp b/source/Control.Patches/dllmain.cpp index fd4db0d..6b786b0 100644 --- a/source/Control.Patches/dllmain.cpp +++ b/source/Control.Patches/dllmain.cpp @@ -371,11 +371,12 @@ static void ApplyPatches() MAKE32CALL(RenderLoop, int3, RenderLoopHook, 5); } } + constexpr bool quietFail = true; const uintptr_t DebugCameraKeyCheckAddr = // Pre official HDR Version, unoffical HDR version also uses this pattern - FindAndPrintPatternW(L"48 8b 08 41 8d 50 2c ff 15 ? ? ? ?", L"DebugCameraKeyCheck", 7) ? : + FindAndPrintPatternW(L"48 8b 08 41 8d 50 2c ff 15 ? ? ? ?", L"DebugCameraKeyCheck", 7, quietFail) ? : // Offical HDR Version, offset remains the same, compiler ordered the instructions slightly differently - FindAndPrintPatternW(L"41 8d 50 2c 48 8b 08 ff 15 ? ? ? ?", L"DebugCameraKeyCheck_v130", 7); + FindAndPrintPatternW(L"41 8d 50 2c 48 8b 08 ff 15 ? ? ? ?", L"DebugCameraKeyCheck_v130", 7, quietFail); if (DebugCameraKeyCheckAddr) { const uintptr_t int3 = FindInt3Jmp(); @@ -384,6 +385,15 @@ static void ApplyPatches() MAKE32CALL(DebugCameraKeyCheckAddr, int3, DebugCameraCheckButton, 6); } } + else + { + if (quietFail) + { + eMSGW(L"" + "Failed to find DebugCameraKeyCheck Pattern.\n" + "Debug camera will not work!", _PROJECT_NAME); + } + } } }