Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/TsudaKageyu/minhook.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRaMMicHaeL <leahcimmar@gmail.com>2015-05-15 20:54:00 +0300
committerRaMMicHaeL <leahcimmar@gmail.com>2015-05-15 20:54:00 +0300
commitc5eb964609dd991cad728eb3240b112b0c6263c6 (patch)
tree09018c5794bf705484c7b654b6e6ecc3cc1bddec /src
parent59ae2454da2a819da6ae5e4a15e1003cb7099f12 (diff)
Fixed subtle bugs caused by fef725e2fdb3f1fa843f5493198f26e28b1a23e3.
Diffstat (limited to 'src')
-rw-r--r--src/hook.c76
1 files changed, 47 insertions, 29 deletions
diff --git a/src/hook.c b/src/hook.c
index 2b1ed4a..ae2d01d 100644
--- a/src/hook.c
+++ b/src/hook.c
@@ -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