From 968abc859d9f90c4b62713427ee78484c5ab7a0b Mon Sep 17 00:00:00 2001 From: Topaz Whitelock <95656963+TopazTK@users.noreply.github.com> Date: Wed, 18 Feb 2026 16:17:21 +0100 Subject: [PATCH 1/2] Seek SaveFile Directory and attempt to create it to prevent crashes on bootup. --- OpenKh.Research.Panacea/Panacea.cpp | 43 +++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/OpenKh.Research.Panacea/Panacea.cpp b/OpenKh.Research.Panacea/Panacea.cpp index 8035c8786..ea0dff458 100644 --- a/OpenKh.Research.Panacea/Panacea.cpp +++ b/OpenKh.Research.Panacea/Panacea.cpp @@ -17,6 +17,10 @@ #include "bass.h" #include "bass_vgmstream.h" #include +#include +#include + +bool ENSURE_DIRECTORY = false; template class Hook @@ -286,6 +290,27 @@ void LoadDLLs(const std::wstring& folder) f(folder.c_str()); } +char* FetchPattern(const char* pattern, const char* patvalid) +{ + HINSTANCE g_hInstance = GetModuleHandle(NULL); + MODULEINFO moduleInfo; + GetModuleInformation(GetCurrentProcess(), g_hInstance, &moduleInfo, sizeof(MODULEINFO)); + const void* endAddress = (const char*)g_hInstance + moduleInfo.SizeOfImage; + + for (char* addr = (char*)g_hInstance; addr < (char*)endAddress - 0x10; addr += 0x10) + { + size_t patlen = strlen(patvalid); + + int i = 0; + for (; i < patlen; i++) + if (patvalid[i] != '?' && pattern[i] != addr[i]) + break; + + if (i == patlen) + return addr; + } +} + void Panacea::Initialize() { ULONG_PTR baseImage = (ULONG_PTR)GetModuleHandle(nullptr); @@ -1137,6 +1162,24 @@ long __cdecl Panacea::LoadFileWithSize(Axa::CFileMan* _this, const char* filenam void* __cdecl Panacea::LoadFileWithMalloc(Axa::CFileMan* _this, const char* filename, int* sizePtr, bool useHdAsset, const char* filename2) { + if (!ENSURE_DIRECTORY) + { + char _stringBuffer[256]; + bool(*_fetchFunc)(const char* str, char* buff, char* a3) = reinterpret_cast(FetchPattern("\x48\x89\x5C\x24\x20\x55\x56\x57\x48\x81\xEC\x60\x01\x00\x00", "xxxxxxxxxxxxxxx")); + + if (!_fetchFunc) + { + _fetchFunc = reinterpret_cast(FetchPattern("\x48\x89\x5C\x24\x20\x55\x56\x57\x48\x81\xEC\x40\x01\x00\x00", "xxxxxxxxxxxxxxx")); + _fetchFunc("KINGDOM HEARTS HD 1.5+2.5 ReMIX\\Epic Games Store", _stringBuffer, nullptr); + } + + else + _fetchFunc("KINGDOM HEARTS HD 1.5+2.5 ReMIX\\Steam", _stringBuffer, nullptr); + std::filesystem::create_directories(_stringBuffer); + + ENSURE_DIRECTORY = true; + } + wchar_t path[MAX_PATH]; if (GetRawFile(path, sizeof(path), filename)) { From e4688f4d1fa12eaa0d2f1ac68b9aa758075eb05d Mon Sep 17 00:00:00 2001 From: Topaz Whitelock <95656963+TopazTK@users.noreply.github.com> Date: Wed, 18 Feb 2026 16:26:13 +0100 Subject: [PATCH 2/2] Have fun with this ya bot. --- OpenKh.Research.Panacea/Panacea.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/OpenKh.Research.Panacea/Panacea.cpp b/OpenKh.Research.Panacea/Panacea.cpp index ea0dff458..815a3d859 100644 --- a/OpenKh.Research.Panacea/Panacea.cpp +++ b/OpenKh.Research.Panacea/Panacea.cpp @@ -309,6 +309,8 @@ char* FetchPattern(const char* pattern, const char* patvalid) if (i == patlen) return addr; } + + return nullptr; } void Panacea::Initialize() @@ -1170,16 +1172,25 @@ void* __cdecl Panacea::LoadFileWithMalloc(Axa::CFileMan* _this, const char* file if (!_fetchFunc) { _fetchFunc = reinterpret_cast(FetchPattern("\x48\x89\x5C\x24\x20\x55\x56\x57\x48\x81\xEC\x40\x01\x00\x00", "xxxxxxxxxxxxxxx")); + + if (!_fetchFunc) + { + ENSURE_DIRECTORY = true; + goto CONTINUE_FUNC; + } + _fetchFunc("KINGDOM HEARTS HD 1.5+2.5 ReMIX\\Epic Games Store", _stringBuffer, nullptr); } else _fetchFunc("KINGDOM HEARTS HD 1.5+2.5 ReMIX\\Steam", _stringBuffer, nullptr); - std::filesystem::create_directories(_stringBuffer); + std::filesystem::create_directories(_stringBuffer); ENSURE_DIRECTORY = true; } +CONTINUE_FUNC: + wchar_t path[MAX_PATH]; if (GetRawFile(path, sizeof(path), filename)) {