diff options
author | RaMMicHaeL <leahcimmar@gmail.com> | 2015-05-15 20:54:00 +0300 |
---|---|---|
committer | RaMMicHaeL <leahcimmar@gmail.com> | 2015-05-15 20:54:00 +0300 |
commit | c5eb964609dd991cad728eb3240b112b0c6263c6 (patch) | |
tree | 09018c5794bf705484c7b654b6e6ecc3cc1bddec /src | |
parent | 59ae2454da2a819da6ae5e4a15e1003cb7099f12 (diff) |
Fixed subtle bugs caused by fef725e2fdb3f1fa843f5493198f26e28b1a23e3.
Diffstat (limited to 'src')
-rw-r--r-- | src/hook.c | 76 |
1 files changed, 47 insertions, 29 deletions
@@ -397,27 +397,33 @@ static MH_STATUS EnableHookLL(UINT pos, BOOL enable) static MH_STATUS EnableAllHooksLL(BOOL enable) { MH_STATUS status = MH_OK; - UINT i; + UINT i, first = INVALID_HOOK_POS; for (i = 0; i < g_hooks.size; ++i) { if (g_hooks.pItems[i].isEnabled != enable) { - FROZEN_THREADS threads; - Freeze(&threads, ALL_HOOKS_POS, enable ? ACTION_ENABLE : ACTION_DISABLE); + first = i; + break; + } + } - for (; i < g_hooks.size; ++i) + if (first != INVALID_HOOK_POS) + { + FROZEN_THREADS threads; + Freeze(&threads, ALL_HOOKS_POS, enable ? ACTION_ENABLE : ACTION_DISABLE); + + for (i = first; i < g_hooks.size; ++i) + { + if (g_hooks.pItems[i].isEnabled != enable) { - if (g_hooks.pItems[i].isEnabled != enable) - { - status = EnableHookLL(i, enable); - if (status != MH_OK) - break; - } + status = EnableHookLL(i, enable); + if (status != MH_OK) + break; } - - Unfreeze(&threads); } + + Unfreeze(&threads); } return status; @@ -581,14 +587,17 @@ MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOrigina } else { - FreeBuffer(pBuffer); status = MH_ERROR_MEMORY_ALLOC; } } else { + status = MH_ERROR_UNSUPPORTED_FUNCTION; + } + + if (status != MH_OK) + { FreeBuffer(pBuffer); - status= MH_ERROR_UNSUPPORTED_FUNCTION; } } else @@ -638,8 +647,11 @@ MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget) Unfreeze(&threads); } - FreeBuffer(g_hooks.pItems[pos].pTrampoline); - DeleteHookEntry(pos); + if (status == MH_OK) + { + FreeBuffer(g_hooks.pItems[pos].pTrampoline); + DeleteHookEntry(pos); + } } else { @@ -770,7 +782,7 @@ MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget) MH_STATUS WINAPI MH_ApplyQueued(VOID) { MH_STATUS status = MH_OK; - UINT i; + UINT i, first = INVALID_HOOK_POS; EnterSpinLock(); @@ -780,22 +792,28 @@ MH_STATUS WINAPI MH_ApplyQueued(VOID) { if (g_hooks.pItems[i].isEnabled != g_hooks.pItems[i].queueEnable) { - FROZEN_THREADS threads; - Freeze(&threads, ALL_HOOKS_POS, ACTION_APPLY_QUEUED); + first = i; + break; + } + } - for (; i < g_hooks.size; ++i) + if (first != INVALID_HOOK_POS) + { + FROZEN_THREADS threads; + Freeze(&threads, ALL_HOOKS_POS, ACTION_APPLY_QUEUED); + + for (i = first; i < g_hooks.size; ++i) + { + PHOOK_ENTRY pHook = &g_hooks.pItems[i]; + if (pHook->isEnabled != pHook->queueEnable) { - PHOOK_ENTRY pHook = &g_hooks.pItems[i]; - if (pHook->isEnabled != pHook->queueEnable) - { - status = EnableHookLL(i, pHook->queueEnable); - if (status != MH_OK) - break; - } + status = EnableHookLL(i, pHook->queueEnable); + if (status != MH_OK) + break; } - - Unfreeze(&threads); } + + Unfreeze(&threads); } } else |