From 7bd947df30988398e3ce2e3429ca5518b7eeb9e1 Mon Sep 17 00:00:00 2001 From: praydog Date: Tue, 14 May 2024 19:32:54 -0700 Subject: [PATCH] VM: Fix DD2 update crash (fallback scan for invoke table) --- shared/sdk/REContext.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/shared/sdk/REContext.cpp b/shared/sdk/REContext.cpp index d48c308b7..8304ffb77 100644 --- a/shared/sdk/REContext.cpp +++ b/shared/sdk/REContext.cpp @@ -260,7 +260,25 @@ namespace sdk { } } if (!method_inside_invoke_tbl) { - spdlog::info("[VM::update_pointers] Unable to find method inside invoke table."); + spdlog::info("[VM::update_pointers] Unable to find method inside invoke table. Trying fallback scan..."); + const auto anchor = utility::scan(mod, "8D 56 FF 48 8B CF E8 ? ? ? ?"); + + if (!anchor) { + spdlog::info("[VM::update_pointers] Unable to find anchor for invoke table."); + return; + } + + const auto lea_rdx = utility::scan_reverse(*anchor, 0x100, "48 8D 15 ? ? ? ?"); + + if (!lea_rdx) { + spdlog::info("[VM::update_pointers] Unable to find lea rdx for invoke table."); + return; + } + + s_invoke_tbl = (sdk::InvokeMethod*)utility::resolve_displacement(*lea_rdx).value_or(0); + + spdlog::info("[VM::update_pointers] s_invoke_tbl: {:x}", (uintptr_t)s_invoke_tbl); + return; }