4#include <../thirdparty/Detours/src/detours.h>
6#define __CMNLIB_INTERNAL_STATIC_LIB_ENROLMENT "Hooking macros on Windows use Detours."
8#define __CMNLIB_INTERNAL_STATIC_HOOK_IMPL(NAME, ADDRESS, INSTALLER)
9 static bool result_##NAME{};
10 static bool install_##NAME()
13 return result_##NAME = false;
15 return result_##NAME = INSTALLER(NAME);
17 static bool runner_##NAME = install_##NAME();
29#define FUNCTION_PTR(RETURN_TYPE, CALLING_CONVENTION, FUNCTION_NAME, ADDRESS, ...)
30 RETURN_TYPE (CALLING_CONVENTION* FUNCTION_NAME)(__VA_ARGS__) = (RETURN_TYPE (CALLING_CONVENTION*)(__VA_ARGS__))(ADDRESS)
40#define IMPORT_FUNCTION_PTR(RETURN_TYPE, LIBRARY_NAME, FUNCTION_NAME, ...)
41 typedef RETURN_TYPE _##FUNCTION_NAME(__VA_ARGS__);
42 _##FUNCTION_NAME* FUNCTION_NAME = (_##FUNCTION_NAME*)IMPORT_FUNC(LIBRARY_NAME, #FUNCTION_NAME);
54#define HOOK(RETURN_TYPE, CALLING_CONVENTION, FUNCTION_NAME, ADDRESS, ...)
55 typedef RETURN_TYPE CALLING_CONVENTION FUNCTION_NAME(__VA_ARGS__);
56 FUNCTION_NAME* x_##FUNCTION_NAME = (FUNCTION_NAME*)(ADDRESS);
57 FUNCTION_NAME* original_##FUNCTION_NAME = x_##FUNCTION_NAME;
58 FUNCTION_NAME* post_##FUNCTION_NAME{};
59 RETURN_TYPE CALLING_CONVENTION impl_##FUNCTION_NAME(__VA_ARGS__)
73#define STATIC_HOOK(RETURN_TYPE, CALLING_CONVENTION, FUNCTION_NAME, ADDRESS, ...)
74 HOOK(RETURN_TYPE, CALLING_CONVENTION, FUNCTION_NAME, ADDRESS, __VA_ARGS__);
76 RETURN_TYPE CALLING_CONVENTION impl_##FUNCTION_NAME(__VA_ARGS__)
85#define GET_STATIC_HOOK_RESULT(FUNCTION_NAME)
86 result_##FUNCTION_NAME
88#if defined(CMNLIB_X64) || defined(CMNLIB_X86)
90#define THISCALL __fastcall
92#if defined(CMNLIB_X64)
93#define THISCALL_PARAMS(CLASS_NAME) CLASS_NAME* self
94#define THISCALL_RETURN_PARAMS self
95#elif defined(CMNLIB_X86)
96#define THISCALL_PARAMS(CLASS_NAME) CLASS_NAME* self, void* _
97#define THISCALL_RETURN_PARAMS self, _
101static_assert(
false,
"THISCALL is not implemented for this architecture.");
114#define VFTABLE_HOOK(RETURN_TYPE, CALLING_CONVENTION, CLASS_NAME, FUNCTION_NAME, ...)
115 HOOK(RETURN_TYPE, CALLING_CONVENTION, CLASS_NAME##_##FUNCTION_NAME, nullptr, __VA_ARGS__)
129#define STATIC_VFTABLE_HOOK(RETURN_TYPE, CALLING_CONVENTION, CLASS_NAME, FUNCTION_NAME, ...)
130 STATIC_HOOK(RETURN_TYPE, CALLING_CONVENTION, CLASS_NAME##_##FUNCTION_NAME, nullptr, __VA_ARGS__)
140#define GET_STATIC_VFTABLE_HOOK_RESULT(CLASS_NAME, FUNCTION_NAME)
141 result_##CLASS_NAME##_##FUNCTION_NAME
143#if defined(CMNLIB_X64)
154#define ASM_HOOK(NAME, ADDRESS)
155 extern "C" uint64_t x_##NAME = (uint64_t)(ADDRESS);
156 extern "C" uint64_t original_##NAME = x_##NAME;
157 extern "C" uint64_t post_##NAME{};
158 extern "C" void* impl_##NAME;
170#define STATIC_ASM_HOOK(NAME, ADDRESS)
171 ASM_HOOK(NAME, ADDRESS) {}
172 __CMNLIB_INTERNAL_STATIC_HOOK_IMPL(NAME, ADDRESS, INSTALL_HOOK);
175#elif defined(CMNLIB_X86)
182#define ASM_HOOK_RETURN(NAME) __asm jmp original_##NAME
189#define ASM_HOOK_BRANCH(NAME) __asm jmp post_##NAME
197#define ASM_HOOK(NAME, ADDRESS)
198 void* x_##NAME = (void*)(ADDRESS);
199 void* original_##NAME = x_##NAME;
201 void NAKED_FUNC impl_##NAME()
209#define STATIC_ASM_HOOK(NAME, ADDRESS)
210 void* x_##NAME = (void*)(ADDRESS);
211 void* original_##NAME = x_##NAME;
214 __CMNLIB_INTERNAL_STATIC_HOOK_IMPL(NAME, ADDRESS, INSTALL_HOOK);
215 void NAKED_FUNC impl_##NAME()
218static_assert(
false,
"Assembly hooks are not implemented for this architecture.");
228#define INSTALL_HOOK(FUNCTION_NAME)
239#define INSTALL_HOOK_EXPLICIT(FUNCTION_NAME, ADDRESS)
242 if (!original_##FUNCTION_NAME && !(ADDRESS))
245 *(void**)&original_##FUNCTION_NAME = (void*)(ADDRESS);
247 DetourTransactionBegin();
248 DetourUpdateThread(GetCurrentThread());
249 DetourAttach((void**)&original_##FUNCTION_NAME, &impl_##FUNCTION_NAME);
251 const auto result = DetourTransactionCommit() == NO_ERROR;
254 post_##FUNCTION_NAME = hedgedev::csl::hook::GetPostHookAddress((void*)(x_##FUNCTION_NAME));
266#define UNINSTALL_HOOK(FUNCTION_NAME)
269 if (x_##FUNCTION_NAME == original_##FUNCTION_NAME)
272 DetourTransactionBegin();
273 DetourUpdateThread(GetCurrentThread());
274 DetourDetach((void**)&original_##FUNCTION_NAME, &impl_##FUNCTION_NAME);
276 return DetourTransactionCommit() == NO_ERROR;
289#define INSTALL_VFTABLE_HOOK(CLASS_NAME, INSTANCE, FUNCTION_NAME, FUNCTION_INDEX)
292 if (original_##CLASS_NAME##_##FUNCTION_NAME)
295 original_##CLASS_NAME##FUNCTION_NAME = (*(CLASS_NAME##_##FUNCTION_NAME***)INSTANCE)[FUNCTION_INDEX];
297 DetourTransactionBegin();
298 DetourUpdateThread(GetCurrentThread());
299 DetourAttach((void**)&original##CLASS_NAME##_##FUNCTION_NAME, impl_##CLASS_NAME##_##FUNCTION_NAME);
301 const auto result = DetourTransactionCommit() == NO_ERROR;
304 post_##FUNCTION_NAME = hedgedev::csl::hook::GetPostHookAddress((void*)(x_##FUNCTION_NAME));
317#define UNINSTALL_VFTABLE_HOOK(CLASS_NAME, FUNCTION_NAME)
327 const auto branchInfo = hedgedev::csl::mem::GetBranchInfo(in_pHookStart);
329 auto pPostHook = (uint8_t*)(size_t(in_pHookStart) + branchInfo.InstrLength);
331 while (*pPostHook == 0xCC)
339#include "HookingUserCall.h"
#define __CMNLIB_INTERNAL_STATIC_HOOK_IMPL(NAME, ADDRESS, INSTALLER)
Definition Hooking.h:8
#define INSTALL_HOOK(FUNCTION_NAME)
Definition Hooking.h:228
#define HOOK(RETURN_TYPE, CALLING_CONVENTION, FUNCTION_NAME, ADDRESS,...)
Definition Hooking.h:54
#define UNINSTALL_HOOK(FUNCTION_NAME)
Definition Hooking.h:266
#define STATIC_HOOK(RETURN_TYPE, CALLING_CONVENTION, FUNCTION_NAME, ADDRESS,...)
Definition Hooking.h:73
#define INSTALL_HOOK_EXPLICIT(FUNCTION_NAME, ADDRESS)
Definition Hooking.h:239
void * GetPostHookAddress(void *in_pHookStart)
Definition Hooking.h:322