custom methods

This commit is contained in:
m 2024-01-07 22:16:06 -06:00
parent a9333f7d71
commit b87e0b661b

View File

@ -104,9 +104,7 @@ namespace gsc
func(); func();
} }
void* vm_call_builtin_function_stub() void vm_call_builtin_function_stub(utils::hook::assembler& a)
{
return utils::hook::assemble([](utils::hook::assembler& a)
{ {
a.pushad64(); a.pushad64();
a.push(rcx); a.push(rcx);
@ -116,7 +114,6 @@ namespace gsc
a.popad64(); a.popad64();
a.jmp(0xC0E8F9_b); a.jmp(0xC0E8F9_b);
});
} }
void execute_custom_method(const std::uint16_t id, game::scr_entref_t ent_ref) void execute_custom_method(const std::uint16_t id, game::scr_entref_t ent_ref)
@ -158,23 +155,19 @@ namespace gsc
meth(ent_ref); meth(ent_ref);
} }
void* vm_call_builtin_method_stub() void vm_call_builtin_method_stub(utils::hook::assembler& a)
{
return utils::hook::assemble([](utils::hook::assembler& a)
{ {
a.pushad64(); a.pushad64();
a.push(ecx);
a.push(rdx); a.push(rdx);
a.mov(ecx, ebx); // ent ref is stored in ebx a.push(ecx);
a.mov(rdx, rdi); // function id is stored in rdi a.mov(rdx, rdi); // function id is stored in rdi
a.mov(ecx, ebx); // ent ref is stored in ebx
a.call_aligned(vm_call_builtin_method_internal); a.call_aligned(vm_call_builtin_method_internal);
a.pop(ecx);
a.pop(rdx); a.pop(rdx);
a.pop(ecx);
a.popad64(); a.popad64();
a.mov(rax, qword_ptr(0x6B183C8_b)); a.jmp(0xC0E8F9_b);
a.jmp(0xC0E900_b);
});
} }
void builtin_call_error(const std::string& error) void builtin_call_error(const std::string& error)
@ -363,17 +356,15 @@ namespace gsc
utils::hook::set<uint32_t>(0xBFD172_b + 4, static_cast<uint32_t>(reverse_b((&func_table)))); utils::hook::set<uint32_t>(0xBFD172_b + 4, static_cast<uint32_t>(reverse_b((&func_table))));
utils::hook::nop(0xC0E5CE_b, 12); // nop the call & jmp at the end of call_builtin utils::hook::nop(0xC0E5CE_b, 12); // nop the call & jmp at the end of call_builtin
utils::hook::jump(0xC0E5CE_b, vm_call_builtin_function_stub(), true); utils::hook::jump(0xC0E5CE_b, utils::hook::assemble(vm_call_builtin_function_stub), true);
utils::hook::inject(0xBFD5A1_b + 3, &func_table); utils::hook::inject(0xBFD5A1_b + 3, &func_table);
utils::hook::set<uint32_t>(0xBFD595_b + 2, sizeof(func_table)); utils::hook::set<uint32_t>(0xBFD595_b + 2, sizeof(func_table));
/*
utils::hook::set<uint32_t>(0xBFD182_b + 4, static_cast<uint32_t>(reverse_b((&meth_table)))); utils::hook::set<uint32_t>(0xBFD182_b + 4, static_cast<uint32_t>(reverse_b((&meth_table))));
utils::hook::nop(0xC0E8F2_b, 14); // nop the call & mov at the end of call_builtin_method utils::hook::nop(0xC0E8EB_b, 14); // nop the lea & call at the end of call_builtin_method
utils::hook::jump(0xC0E8F2_b, vm_call_builtin_method_stub(), true); utils::hook::jump(0xC0E8EB_b, utils::hook::assemble(vm_call_builtin_method_stub), true);
utils::hook::inject(0xBFD5AF_b + 3, &meth_table); utils::hook::inject(0xBFD5AF_b + 3, &meth_table);
utils::hook::set<uint32_t>(0xBFD5B6_b + 2, sizeof(meth_table)); utils::hook::set<uint32_t>(0xBFD5B6_b + 2, sizeof(meth_table));
*/
utils::hook::call(0xC0F8C1_b, vm_error_stub); // LargeLocalResetToMark utils::hook::call(0xC0F8C1_b, vm_error_stub); // LargeLocalResetToMark
@ -495,4 +486,4 @@ namespace gsc
}; };
} }
//REGISTER_COMPONENT(gsc::extension) REGISTER_COMPONENT(gsc::extension)