diff --git a/texthook/engine/engine.cc b/texthook/engine/engine.cc index c2c7abc..2594c93 100644 --- a/texthook/engine/engine.cc +++ b/texthook/engine/engine.cc @@ -584,16 +584,70 @@ bool FindKiriKiriHook(DWORD fun, DWORD size, DWORD pt, DWORD flag) // jichi 10/2 return false; } +bool KiriKiri3Filter(LPVOID data, DWORD *size, HookParam *, BYTE) +{ + auto text = reinterpret_cast(data); + auto len = reinterpret_cast(size); + static std::wstring prevText; + + if (!*len) + return false; + text[*len/sizeof(wchar_t)] = L'\0'; // clean text + if (!prevText.compare(text)) + return false; + prevText = text; + + if (cpp_wcsnstr(text, L"[", *len/sizeof(wchar_t))) { + WideStringFilterBetween(text, len, L"[", 1, L"]\\", 2); + WideStringFilterBetween(text, len, L"[", 1, L"]", 1); + } + return true; +} + +bool InsertKiriKiri3Hook() +{ + //by Blu3train + /* + * Sample games: + * https://vndb.org/v16190 + */ + const BYTE bytes[] = { + 0x66, 0x83, 0x3C, 0x41 , 0x5B, // cmp word ptr [ecx+eax*2],5B << hook here + 0x75, 0x09, // jne LBK-30067.exe+1EB26F + 0x8B, 0x85, XX4 // mov eax,[ebp-00000254] + }; + + ULONG range = min(processStopAddress - processStartAddress, MAX_REL_ADDR); + ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStartAddress + range); + if (!addr) { + //ConsoleOutput("vnreng:KiriKiri3: pattern not found"); + return false; + } + + HookParam hp = {}; + hp.address = addr; + hp.offset = pusha_ecx_off -4; + hp.index = 0; + //hp.split = -4 -4; + hp.split = 5 * 4; //arg5 + hp.split_index = 0; + hp.type = USING_UNICODE | USING_STRING | USING_SPLIT; + hp.filter_fun = KiriKiri3Filter; + ConsoleOutput("vnreng: INSERT KiriKiri3"); + NewHook(hp, "KiriKiri3"); + return true; +} + bool InsertKiriKiriHook() // 9/20/2014 jichi: change return type to bool { bool k1 = FindKiriKiriHook((DWORD)GetGlyphOutlineW, processStopAddress - processStartAddress, processStartAddress, 0), // KiriKiri1 - k2 = FindKiriKiriHook((DWORD)GetTextExtentPoint32W, processStopAddress - processStartAddress, processStartAddress, 1); // KiriKiri2 + k2 = FindKiriKiriHook((DWORD)GetTextExtentPoint32W, processStopAddress - processStartAddress, processStartAddress, 1), // KiriKiri2 + k3 = InsertKiriKiri3Hook(); // KiriKiri3 //RegisterEngineType(ENGINE_KIRIKIRI); if (k1 && k2) { ConsoleOutput("vnreng:KiriKiri1: disable GDI hooks"); - } - return k1 || k2; + return k1 || k2 || k3; } /** 10/20/2014 jichi: KAGParser