aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeex <zeex@rocketmail.com>2020-05-30 19:59:20 +0600
committerZeex <zeex@rocketmail.com>2020-05-30 20:07:29 +0600
commit2fe65f1de98ff5f3b1afab6b33b68947b6258f47 (patch)
tree7cfb84efc2ebb19e6dd61982ac6821e77deb22db
parent873e7cd795ea7f4a97db7f50c361589626f39cea (diff)
downloadsubhook-2fe65f1de98ff5f3b1afab6b33b68947b6258f47.zip
subhook-2fe65f1de98ff5f3b1afab6b33b68947b6258f47.tar.gz
subhook-2fe65f1de98ff5f3b1afab6b33b68947b6258f47.tar.bz2
Make Install(src, dst, flags) remove existing hook
-rw-r--r--subhook.h19
1 files changed, 12 insertions, 7 deletions
diff --git a/subhook.h b/subhook.h
index f003e76..e93c332 100644
--- a/subhook.h
+++ b/subhook.h
@@ -186,8 +186,13 @@ class Hook {
bool Install(void *src,
void *dst,
HookFlags flags = HookNoFlags) {
+ if (hook_ != nullptr) {
+ subhook_remove(hook_);
+ subhook_free(hook_);
+ }
+ hook_ = subhook_new(src, dst, (subhook_flags_t)flags);
if (hook_ == nullptr) {
- hook_ = subhook_new(src, dst, (subhook_flags_t)flags);
+ return false;
}
return Install();
}
@@ -211,8 +216,8 @@ class Hook {
class ScopedHookRemove {
public:
ScopedHookRemove(Hook *hook)
- : hook_(hook)
- , removed_(hook_->Remove())
+ : hook_(hook),
+ removed_(hook_->Remove())
{
}
@@ -234,8 +239,8 @@ class ScopedHookRemove {
class ScopedHookInstall {
public:
ScopedHookInstall(Hook *hook)
- : hook_(hook)
- , installed_(hook_->Install())
+ : hook_(hook),
+ installed_(hook_->Install())
{
}
@@ -243,8 +248,8 @@ class ScopedHookInstall {
void *src,
void *dst,
HookFlags flags = HookNoFlags)
- : hook_(hook)
- , installed_(hook_->Install(src, dst, flags))
+ : hook_(hook),
+ installed_(hook_->Install(src, dst, flags))
{
}