funchook.h 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #pragma once
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #else
  7. #if defined(_MSC_VER) && !defined(inline)
  8. #define inline __inline
  9. #endif
  10. #endif
  11. enum hook_type {
  12. HOOKTYPE_FORWARD_OVERWRITE,
  13. HOOKTYPE_FORWARD_CHAIN,
  14. HOOKTYPE_REVERSE_CHAIN
  15. };
  16. struct func_hook {
  17. void *call_addr;
  18. uintptr_t func_addr; /* function being hooked to */
  19. uintptr_t hook_addr; /* hook function itself */
  20. const char *name;
  21. enum hook_type type;
  22. bool is_64bit_jump;
  23. bool hooked;
  24. bool started;
  25. uint8_t unhook_data[14];
  26. uint8_t rehook_data[14];
  27. };
  28. extern void hook_init(struct func_hook *hook,
  29. void *func_addr, void *hook_addr, const char *name);
  30. extern void hook_start(struct func_hook *hook);
  31. extern void do_hook(struct func_hook *hook, bool force);
  32. extern void unhook(struct func_hook *hook);
  33. static inline void rehook(struct func_hook *hook)
  34. {
  35. do_hook(hook, false);
  36. }
  37. static inline void force_rehook(struct func_hook *hook)
  38. {
  39. do_hook(hook, true);
  40. }
  41. #ifdef __cplusplus
  42. }
  43. #endif