From cf75844f404da14c6d5f2ab25a3a8ae43da8b922 Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Fri, 31 Jan 2025 23:33:24 +0300 Subject: [PATCH] Fix crash on reconnect --- Client/game_sa/CPtrNodeSingleLinkPoolSA.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Client/game_sa/CPtrNodeSingleLinkPoolSA.cpp b/Client/game_sa/CPtrNodeSingleLinkPoolSA.cpp index 57348bf29a..6bed46f048 100644 --- a/Client/game_sa/CPtrNodeSingleLinkPoolSA.cpp +++ b/Client/game_sa/CPtrNodeSingleLinkPoolSA.cpp @@ -36,10 +36,31 @@ static CPtrNodeSingleLinkPoolSA::pool_item_t* __cdecl HOOK_SingleLinkNodeDestruc return item; } +// Replace pool->RemoveItem here +constexpr std::uint32_t HOOKPOS_CPtrListSingleLink_Flush = 0x55243B; +constexpr std::size_t HOOKSIZE_CPtrListSingleLink_Flush = 6; +constexpr std::uint32_t CONTINUE_CPtrListSingleLink_Flush = 0x55245B; +static void _declspec(naked) HOOK_CPtrListSingleLink_Flush() +{ + __asm { + mov edi, ecx ; save register + + ; CPtrNodeSingleLinkPoolSA::m_customPool->RemoveItem(eax) + + mov ecx, CPtrNodeSingleLinkPoolSA::m_customPool + push eax + call CPtrNodeSingleLinkPoolSA::pool_t::RemoveItem + + mov ecx, edi ; restore + jmp CONTINUE_CPtrListSingleLink_Flush + } +} + void CPtrNodeSingleLinkPoolSA::StaticSetHooks() { EZHookInstall(SingleLinkNodeConstructor); EZHookInstall(SingleLinkNodeDestructor); + EZHookInstall(CPtrListSingleLink_Flush); // Skip the original pool initialization MemCpy((void*)0x550F26, "\xEB\x2D", 2);