funchook.h 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. void *bounce_addr;
  21. const char *name;
  22. enum hook_type type;
  23. bool is_64bit_jump;
  24. bool hooked;
  25. bool started;
  26. bool attempted_bounce;
  27. uint8_t unhook_data[14];
  28. uint8_t rehook_data[14];
  29. };
  30. extern void hook_init(struct func_hook *hook,
  31. void *func_addr, void *hook_addr, const char *name);
  32. extern void hook_start(struct func_hook *hook);
  33. extern void do_hook(struct func_hook *hook, bool force);
  34. extern void unhook(struct func_hook *hook);
  35. static inline void rehook(struct func_hook *hook)
  36. {
  37. do_hook(hook, false);
  38. }
  39. static inline void force_rehook(struct func_hook *hook)
  40. {
  41. do_hook(hook, true);
  42. }
  43. #ifdef __cplusplus
  44. }
  45. #endif