Add hooks header

With macros for declaring hooks in header, in code, actually hooking and
calling the originals
Also with CL_CreateMove hooked
This commit is contained in:
8dcc 2023-07-20 17:42:06 +02:00
parent 9b20d7e71f
commit ef8504cdc9
1 changed files with 65 additions and 0 deletions

65
src/include/hooks.h Normal file
View File

@ -0,0 +1,65 @@
#ifndef _HOOKS_H
#define _HOOKS_H
/*----------------------------------------------------------------------------*/
#include "sdk.h"
/*
* Table of prefixes:
* prefix | meaning
* -------+----------------------------
* *_t | typedef (function type)
* h_* | hook function (ours)
* ho_* | hook original (ptr to orig)
*
*
* DECL_HOOK_EXTERN: Version for the header. typedef's the function pointer with
* the return type, name and args. Example:
*
* DECL_HOOK_EXTERN(int, test, double, double);
* typedef int (*test_t)(double, double);
* extern test_t ho_test; // Original
* int h_test(double, double); // Our func
*
*
* DECL_HOOK: Macro for declaring the global function pointer for the original
* in the source file. Example:
*
* DECL_HOOK(test);
* test_t ho_test = NULL; // Original
*
*
* HOOK: Macro for storing the original function ptr of an interface and hooking
* our own. Example:
*
* HOOK(gp_client, CL_CreateMove);
* ho_CL_CreateMove = gp_client->CL_CreateMove; // Original
* gp_client->CL_CreateMove = h_CL_CreateMove; // Our func
*
*
* ORIGINAL: Macro for calling the original function. Example:
*
* ORIGINAL(CL_CreateMove, frametime, cmd, active);
* ho_CL_CreateMove(frametime, cmd, active); // Original
*/
#define DECL_HOOK_EXTERN(type, name, ...) \
typedef type (*name##_t)(__VA_ARGS__); \
extern name##_t ho_##name; \
type h_##name(__VA_ARGS__);
#define DECL_HOOK(name) name##_t ho_##name = NULL;
#define HOOK(interface, name) \
ho_##name = interface->name; \
interface->name = h_##name;
#define ORIGINAL(name, ...) ho_##name(__VA_ARGS__);
/*----------------------------------------------------------------------------*/
bool hooks_init(void);
DECL_HOOK_EXTERN(void, CL_CreateMove, float, usercmd_t*, int);
#endif /* _HOOKS_H */