diff --git a/texthook/engine/engine.cc b/texthook/engine/engine.cc index 34a8f6f..7ad4128 100644 --- a/texthook/engine/engine.cc +++ b/texthook/engine/engine.cc @@ -23758,6 +23758,42 @@ bool InsertNamcoPS2Hook() } #endif // 0 +bool InsertSakanaGLHook() { + //by Blu3train + /* + * Sample games: + * https://vndb.org/v46148 + */ + const BYTE bytes[] = { + 0x89, XX, // mov [ecx],eax <- hook here + 0x33, XX, // xor ecx,ecx + 0x85, XX // test ebx,ebx + }; + HMODULE module = GetModuleHandleW(L"sakanagl.dll"); + auto [minAddress, maxAddress] = Util::QueryModuleLimits(module); + ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), minAddress, maxAddress); + if (!addr) { + ConsoleOutput("vnreng:SakanaGL: pattern not found"); + return false; + } + + HookParam hp = {}; + hp.address = addr; + hp.offset = pusha_edx_off -4; + hp.index = 0; + hp.text_fun = [](DWORD esp_base, HookParam*, BYTE, DWORD *data, DWORD*, DWORD *len) + { + if ( regof(edi,esp_base) != 2) + return; + *len = strlen((char*)*data); + }; + hp.type = USING_UTF8 | USING_STRING; + ConsoleOutput("vnreng: INSERT SakanaGL"); + NewHook(hp, "SakanaGL"); + + return true; +} + bool InsertDebonosuWorksHook() { //by Blu3train /* diff --git a/texthook/engine/engine.h b/texthook/engine/engine.h index 0741985..ed14c33 100644 --- a/texthook/engine/engine.h +++ b/texthook/engine/engine.h @@ -156,6 +156,7 @@ bool InsertWillPlusHook(); // WillPlus: Rio.arc bool InsertWolfHook(); // Wolf: Data.wolf bool InsertYukaSystemHooks(); // YukaSystem2: *.ykc bool InsertYurisHook(); // YU-RIS: *.ypf +bool InsertSakanaGLHook(); // SakanaGL: sakanagl.dll bool InsertDebonosuWorksHook(); // DebonosuWorks: resource string bool InsertLucaSystemHook(); // LucaSystem: *.iga bool InsertKogadoHook(); // Kogado: *.pak diff --git a/texthook/engine/match32.cc b/texthook/engine/match32.cc index 73e01d9..c753897 100644 --- a/texthook/engine/match32.cc +++ b/texthook/engine/match32.cc @@ -380,6 +380,10 @@ bool DetermineEngineByFile3() bool DetermineEngineByFile4() { + if (Util::CheckFile(L"sakanagl.dll")) { + if (InsertSakanaGLHook()) + return true; + } if (Util::SearchResourceString(L"でぼの巣製作所")) { if (InsertDebonosuWorksHook()) return true;