Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions include/helper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
14 changes: 12 additions & 2 deletions source/Control.Patches/dllmain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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);
}
}
}
}

Expand Down
26 changes: 15 additions & 11 deletions source/Shared/helper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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""
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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);
}
}

Expand Down Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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;
Expand All @@ -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;
}
Expand Down