From 78129d665a5e677a6f8c5468d9bc01dc7ff04139 Mon Sep 17 00:00:00 2001 From: rtldg Date: Fri, 7 Mar 2025 14:47:30 +0000 Subject: [PATCH] AGHHH --- extensions/dhooks/DynamicHooks/convention.h | 2 +- .../conventions/x86_64SystemVDefault.h | 1 - extensions/dhooks/dynhooks_sourcepawn.cpp | 3 ++- extensions/dhooks/natives.cpp | 1 + extensions/dhooks/util.cpp | 4 +-- extensions/dhooks/vhook.cpp | 25 +++++++++++++++++++ extensions/dhooks/vhook.h | 6 ----- 7 files changed, 31 insertions(+), 11 deletions(-) diff --git a/extensions/dhooks/DynamicHooks/convention.h b/extensions/dhooks/DynamicHooks/convention.h index 8616439ba..1253ca89a 100644 --- a/extensions/dhooks/DynamicHooks/convention.h +++ b/extensions/dhooks/DynamicHooks/convention.h @@ -193,7 +193,7 @@ public: virtual void** GetStackArgumentPtr(CRegisters* pRegisters) = 0; /* - Returns the number of bytes for the buffer to store all the arguments that are passed in a register in. + Returns the number of bytes for the buffer to store all the arguments that are passed in a register. */ virtual int GetArgRegisterSize() = 0; diff --git a/extensions/dhooks/DynamicHooks/conventions/x86_64SystemVDefault.h b/extensions/dhooks/DynamicHooks/conventions/x86_64SystemVDefault.h index 802300a1c..c84b4fb61 100644 --- a/extensions/dhooks/DynamicHooks/conventions/x86_64SystemVDefault.h +++ b/extensions/dhooks/DynamicHooks/conventions/x86_64SystemVDefault.h @@ -62,7 +62,6 @@ public: virtual void RestoreCallArguments(CRegisters* pRegisters) override; protected: - std::uint32_t m_stackArgs; }; #endif // _X86_64_SYSTEMV_DEFAULT_H diff --git a/extensions/dhooks/dynhooks_sourcepawn.cpp b/extensions/dhooks/dynhooks_sourcepawn.cpp index 08146abb6..9cf48200a 100644 --- a/extensions/dhooks/dynhooks_sourcepawn.cpp +++ b/extensions/dhooks/dynhooks_sourcepawn.cpp @@ -259,7 +259,7 @@ ICallingConvention *ConstructCallingConvention(HookSetup *setup) #if defined(DYNAMICHOOKS_x86_64) && defined(PLATFORM_LINUX) if (setup->returnType == ReturnType_Vector) { - returnType.size = 16; + returnType.size = 12; returnType.custom_register = XMM0; returnType.custom_register2 = XMM1; } @@ -704,6 +704,7 @@ void CDynamicHooksSourcePawn::UpdateParamsFromStruct(HookParamsStruct *params) size_t numArgs = argTypes.size(); size_t firstArg = 0; + // TODO: Linux64 will use RDI for retmem even if thiscall // TODO: Support custom register for this ptr. if (callConv == CallConv_THISCALL) firstArg = 1; diff --git a/extensions/dhooks/natives.cpp b/extensions/dhooks/natives.cpp index d56fe7d2f..b1ecfe580 100644 --- a/extensions/dhooks/natives.cpp +++ b/extensions/dhooks/natives.cpp @@ -291,6 +291,7 @@ cell_t Native_AddParam(IPluginContext *pContext, const cell_t *params) info.flags = PASSFLAG_BYVAL; } + // TODO: why? // DynamicDetours doesn't expose the passflags concept like SourceHook. // See if we're trying to set some invalid flags on detour arguments. if(setup->hookMethod == Detour && (info.flags & ~PASSFLAG_BYVAL) > 0) diff --git a/extensions/dhooks/util.cpp b/extensions/dhooks/util.cpp index ac9b678a1..02f48c089 100644 --- a/extensions/dhooks/util.cpp +++ b/extensions/dhooks/util.cpp @@ -37,7 +37,7 @@ void * GetObjectAddr(HookParamType type, unsigned int flags, void **params, size if (type == HookParamType_Object) return (void *)((intptr_t)params + offset); #elif POSIX - if (type == HookParamType_Object && !(flags & PASSFLAG_ODTOR)) //Objects are passed by rrefrence if they contain destructors. + if (type == HookParamType_Object && !(flags & PASSFLAG_ODTOR)) //Objects are passed by reference if they contain destructors. return (void *)((intptr_t)params + offset); #endif return *(void **)((intptr_t)params + offset); @@ -62,7 +62,7 @@ size_t GetStackParamOffset(HookParamsStruct *paramStruct, unsigned int index) continue; } #endif -#ifdef KE_ARCH_X64 +#if defined(KE_ARCH_X64) && defined(WIN64) offset += 8; #else offset += paramStruct->dg->params[i].size; diff --git a/extensions/dhooks/vhook.cpp b/extensions/dhooks/vhook.cpp index 778c43013..66f6b83bd 100644 --- a/extensions/dhooks/vhook.cpp +++ b/extensions/dhooks/vhook.cpp @@ -54,6 +54,7 @@ using namespace sp; #ifdef KE_ARCH_X64 using namespace SourceHook::Asm; +#ifdef WIN32 SourceHook::Asm::x64JitWriter* GenerateThunk(HookSetup* hook) { auto masm = new x64JitWriter(); @@ -130,6 +131,28 @@ SourceHook::Asm::x64JitWriter* GenerateThunk(HookSetup* hook) masm->SetRE(); return masm; } +#else +// linux64 thunker +SourceHook::Asm::x64JitWriter* GenerateThunk(HookSetup* hook) +{ + auto masm = new x64JitWriter(); + auto type = hook->returnType; + + // Save our frame pointer. + // This also realigns the stack to 16 bytes. + masm->push(rbp); + masm->mov(rbp, rsp); + + // Restore RSP and RBP + // (same as `mov rsp, rbp` + `pop rbp`) + masm->leave(); + + masm->retn(); + + masm->SetRE(); + return masm; +} +#endif #elif !defined( WIN32 ) void *GenerateThunk(HookSetup* hook) { @@ -317,6 +340,7 @@ SourceHook::PassInfo::PassType GetParamTypePassType(HookParamType type) size_t GetStackArgsSize(DHooksCallback *dg) { size_t res = GetParamsSize(dg); +#if defined(WIN32) || !defined(KE_ARCH_X64) // linux64 shall not pass #ifdef WIN32 if(dg->returnType == ReturnType_Vector)//Account for result vector ptr. #else @@ -325,6 +349,7 @@ size_t GetStackArgsSize(DHooksCallback *dg) { res += OBJECT_OFFSET; } +#endif return res; } diff --git a/extensions/dhooks/vhook.h b/extensions/dhooks/vhook.h index e68d2ef72..e2209c639 100644 --- a/extensions/dhooks/vhook.h +++ b/extensions/dhooks/vhook.h @@ -133,12 +133,6 @@ struct ParamInfo Register_t custom_register; }; -#ifdef WIN32 -#define OBJECT_OFFSET sizeof(void *) -#else -#define OBJECT_OFFSET (sizeof(void *)*2) -#endif - class HookReturnStruct { public: