From bfdb2b4ea6dbd75881096400db43b3f4a276bea7 Mon Sep 17 00:00:00 2001 From: Zeex Date: Sat, 13 Aug 2016 02:17:42 +0600 Subject: Improve C++ interface --- subhook.h | 134 +++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 75 insertions(+), 59 deletions(-) (limited to 'subhook.h') diff --git a/subhook.h b/subhook.h index 6e80d6d..a072316 100644 --- a/subhook.h +++ b/subhook.h @@ -90,8 +90,8 @@ typedef enum subhook_options { SUBHOOK_OPTION_64BIT_OFFSET = 1u << 1 } subhook_options_t; -struct subhook; -typedef struct subhook *subhook_t; +struct subhook_struct; +typedef struct subhook_struct *subhook_t; SUBHOOK_EXPORT subhook_t SUBHOOK_API subhook_new(void *src, void *dst, @@ -115,16 +115,32 @@ SUBHOOK_EXPORT void *SUBHOOK_API subhook_read_dst(void *src); #ifdef __cplusplus -class SubHook -{ -public: - SubHook() : hook_(0) {} - SubHook(void *src, - void *dst, - subhook_options_t options = (subhook_options_t)0) - : hook_(subhook_new(src, dst, options)) {} +namespace subhook { - ~SubHook() { +enum HookOptions { + HookOptionsNone = 0, + HookOption64BitOffset = SUBHOOK_OPTION_64BIT_OFFSET +}; + +inline HookOptions operator|(HookOptions o1, HookOptions o2) { + return static_cast( + static_cast(o1) | static_cast(o2)); +} + +inline HookOptions operator&(HookOptions o1, HookOptions o2) { + return static_cast( + static_cast(o1) & static_cast(o2)); +} + +class Hook { + public: + Hook() : hook_(0) {} + Hook(void *src, + void *dst, + HookOptions options = HookOptionsNone) + : hook_(subhook_new(src, dst, (subhook_options_t)options)) {} + + ~Hook() { subhook_remove(hook_); subhook_free(hook_); } @@ -139,9 +155,9 @@ public: bool Install(void *src, void *dst, - subhook_options_t options = (subhook_options_t)0) { + HookOptions options = HookOptionsNone) { if (hook_ == 0) { - hook_ = subhook_new(src, dst, options); + hook_ = subhook_new(src, dst, (subhook_options_t)options); } return Install(); } @@ -154,66 +170,66 @@ public: return !!subhook_is_installed(hook_); } - class ScopedRemove - { - public: - ScopedRemove(SubHook *hook) - : hook_(hook) - , removed_(hook_->Remove()) - { - } - - ~ScopedRemove() { - if (removed_) { - hook_->Install(); - } - } + static void *ReadDst(void *src) { + return subhook_read_dst(src); + } - private: - ScopedRemove(const ScopedRemove &); - void operator=(const ScopedRemove &); + private: + Hook(const Hook &); + void operator=(const Hook &); - private: - SubHook *hook_; - bool removed_; - }; + private: + subhook_t hook_; +}; - class ScopedInstall +class ScopedHookRemove { + public: + ScopedHookRemove(Hook *hook) + : hook_(hook) + , removed_(hook_->Remove()) { - public: - ScopedInstall(SubHook *hook) - : hook_(hook) - , installed_(hook_->Install()) - { - } + } - ~ScopedInstall() { - if (installed_) { - hook_->Remove(); - } + ~ScopedHookRemove() { + if (removed_) { + hook_->Install(); } + } - private: - ScopedInstall(const ScopedInstall &); - void operator=(const ScopedInstall &); + private: + ScopedHookRemove(const ScopedHookRemove &); + void operator=(const ScopedHookRemove &); - private: - SubHook *hook_; - bool installed_; - }; + private: + Hook *hook_; + bool removed_; +}; - static void *ReadDst(void *src) { - return subhook_read_dst(src); +class ScopedHookInstall { + public: + ScopedHookInstall(Hook *hook) + : hook_(hook) + , installed_(hook_->Install()) + { } -private: - SubHook(const SubHook &); - void operator=(const SubHook &); + ~ScopedHookInstall() { + if (installed_) { + hook_->Remove(); + } + } -private: - subhook_t hook_; + private: + ScopedHookInstall(const ScopedHookInstall &); + void operator=(const ScopedHookInstall &); + + private: + Hook *hook_; + bool installed_; }; +} // namespace subhook + #endif /* __cplusplus */ #endif /* SUBHOOK_H */ -- cgit v1.1