Author: dchapyshev
Date: Fri May 22 16:50:31 2009
New Revision: 41042
URL:
http://svn.reactos.org/svn/reactos?rev=41042&view=rev
Log:
- Formatting fix. No code change
Modified:
trunk/reactos/subsystems/win32/win32k/ntuser/hook.c
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/hook.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/hook.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/hook.c [iso-8859-1] Fri May 22 16:50:31
2009
@@ -22,145 +22,157 @@
/* create a new hook table */
-static PHOOKTABLE
+static
+PHOOKTABLE
IntAllocHookTable(void)
{
- PHOOKTABLE Table;
- UINT i;
-
- Table = ExAllocatePoolWithTag(PagedPool, sizeof(HOOKTABLE), TAG_HOOK);
- if (NULL != Table)
- {
- for (i = 0; i < NB_HOOKS; i++)
- {
- InitializeListHead(&Table->Hooks[i]);
- Table->Counts[i] = 0;
- }
- }
-
- return Table;
-}
-
-
-PHOOK FASTCALL IntGetHookObject(HHOOK hHook)
-{
- PHOOK Hook;
-
- if (!hHook)
- {
- SetLastWin32Error(ERROR_INVALID_HOOK_HANDLE);
- return NULL;
- }
-
- Hook = (PHOOK)UserGetObject(gHandleTable, hHook, otHook);
- if (!Hook)
- {
- SetLastWin32Error(ERROR_INVALID_HOOK_HANDLE);
- return NULL;
- }
-
- ASSERT(USER_BODY_TO_HEADER(Hook)->RefCount >= 0);
-
- USER_BODY_TO_HEADER(Hook)->RefCount++;
-
- return Hook;
+ PHOOKTABLE Table;
+ UINT i;
+
+ Table = ExAllocatePoolWithTag(PagedPool, sizeof(HOOKTABLE), TAG_HOOK);
+ if (NULL != Table)
+ {
+ for (i = 0; i < NB_HOOKS; i++)
+ {
+ InitializeListHead(&Table->Hooks[i]);
+ Table->Counts[i] = 0;
+ }
+ }
+
+ return Table;
+}
+
+
+PHOOK
+FASTCALL
+IntGetHookObject(HHOOK hHook)
+{
+ PHOOK Hook;
+
+ if (!hHook)
+ {
+ SetLastWin32Error(ERROR_INVALID_HOOK_HANDLE);
+ return NULL;
+ }
+
+ Hook = (PHOOK)UserGetObject(gHandleTable, hHook, otHook);
+ if (!Hook)
+ {
+ SetLastWin32Error(ERROR_INVALID_HOOK_HANDLE);
+ return NULL;
+ }
+
+ ASSERT(USER_BODY_TO_HEADER(Hook)->RefCount >= 0);
+
+ USER_BODY_TO_HEADER(Hook)->RefCount++;
+
+ return Hook;
}
/* create a new hook and add it to the specified table */
-static PHOOK
+static
+PHOOK
IntAddHook(PETHREAD Thread, int HookId, BOOLEAN Global, PWINSTATION_OBJECT WinStaObj)
{
- PTHREADINFO W32Thread;
- PHOOK Hook;
- PHOOKTABLE Table = Global ? GlobalHooks :
MsqGetHooks(((PTHREADINFO)Thread->Tcb.Win32Thread)->MessageQueue);
- HANDLE Handle;
-
- if (NULL == Table)
- {
- Table = IntAllocHookTable();
- if (NULL == Table)
- {
- return NULL;
- }
- if (Global)
- {
- GlobalHooks = Table;
- }
- else
- {
- MsqSetHooks(((PTHREADINFO)Thread->Tcb.Win32Thread)->MessageQueue, Table);
- }
- }
-
- Hook = UserCreateObject(gHandleTable, &Handle, otHook, sizeof(HOOK));
- if (NULL == Hook)
- {
- return NULL;
- }
-
- Hook->Self = Handle;
- Hook->Thread = Thread;
- Hook->HookId = HookId;
-
- if (Thread)
- {
- W32Thread = ((PTHREADINFO)Thread->Tcb.Win32Thread);
- ASSERT(W32Thread != NULL);
- W32Thread->fsHooks |= HOOKID_TO_FLAG(HookId);
-
- GetWin32ClientInfo()->fsHooks = W32Thread->fsHooks;
-
- if (W32Thread->ThreadInfo != NULL)
- W32Thread->ThreadInfo->fsHooks = W32Thread->fsHooks;
- }
-
- RtlInitUnicodeString(&Hook->ModuleName, NULL);
-
- InsertHeadList(&Table->Hooks[HOOKID_TO_INDEX(HookId)], &Hook->Chain);
-
- return Hook;
+ PTHREADINFO W32Thread;
+ PHOOK Hook;
+ PHOOKTABLE Table = Global ? GlobalHooks :
MsqGetHooks(((PTHREADINFO)Thread->Tcb.Win32Thread)->MessageQueue);
+ HANDLE Handle;
+
+ if (NULL == Table)
+ {
+ Table = IntAllocHookTable();
+ if (NULL == Table)
+ {
+ return NULL;
+ }
+ if (Global)
+ {
+ GlobalHooks = Table;
+ }
+ else
+ {
+ MsqSetHooks(((PTHREADINFO)Thread->Tcb.Win32Thread)->MessageQueue,
Table);
+ }
+ }
+
+ Hook = UserCreateObject(gHandleTable, &Handle, otHook, sizeof(HOOK));
+ if (NULL == Hook)
+ {
+ return NULL;
+ }
+
+ Hook->Self = Handle;
+ Hook->Thread = Thread;
+ Hook->HookId = HookId;
+
+ if (Thread)
+ {
+ W32Thread = ((PTHREADINFO)Thread->Tcb.Win32Thread);
+ ASSERT(W32Thread != NULL);
+ W32Thread->fsHooks |= HOOKID_TO_FLAG(HookId);
+
+ GetWin32ClientInfo()->fsHooks = W32Thread->fsHooks;
+
+ if (W32Thread->ThreadInfo != NULL)
+ W32Thread->ThreadInfo->fsHooks = W32Thread->fsHooks;
+ }
+
+ RtlInitUnicodeString(&Hook->ModuleName, NULL);
+
+ InsertHeadList(&Table->Hooks[HOOKID_TO_INDEX(HookId)], &Hook->Chain);
+
+ return Hook;
}
/* get the hook table that a given hook belongs to */
-static PHOOKTABLE FASTCALL
+static
+PHOOKTABLE
+FASTCALL
IntGetTable(PHOOK Hook)
{
- if (NULL == Hook->Thread || WH_KEYBOARD_LL == Hook->HookId ||
- WH_MOUSE_LL == Hook->HookId)
- {
- return GlobalHooks;
- }
-
- return
MsqGetHooks(((PTHREADINFO)Hook->Thread->Tcb.Win32Thread)->MessageQueue);
+ if (NULL == Hook->Thread || WH_KEYBOARD_LL == Hook->HookId ||
+ WH_MOUSE_LL == Hook->HookId)
+ {
+ return GlobalHooks;
+ }
+
+ return
MsqGetHooks(((PTHREADINFO)Hook->Thread->Tcb.Win32Thread)->MessageQueue);
}
/* get the first hook in the chain */
-static PHOOK FASTCALL
+static
+PHOOK
+FASTCALL
IntGetFirstHook(PHOOKTABLE Table, int HookId)
{
- PLIST_ENTRY Elem = Table->Hooks[HOOKID_TO_INDEX(HookId)].Flink;
- return Elem == &Table->Hooks[HOOKID_TO_INDEX(HookId)]
- ? NULL : CONTAINING_RECORD(Elem, HOOK, Chain);
+ PLIST_ENTRY Elem = Table->Hooks[HOOKID_TO_INDEX(HookId)].Flink;
+
+ return Elem == &Table->Hooks[HOOKID_TO_INDEX(HookId)]
+ ? NULL : CONTAINING_RECORD(Elem, HOOK, Chain);
}
/* find the first non-deleted hook in the chain */
-static PHOOK FASTCALL
+static
+PHOOK
+FASTCALL
IntGetFirstValidHook(PHOOKTABLE Table, int HookId)
{
- PHOOK Hook;
- PLIST_ENTRY Elem;
-
- Hook = IntGetFirstHook(Table, HookId);
- while (NULL != Hook && NULL == Hook->Proc)
- {
- Elem = Hook->Chain.Flink;
- Hook = (Elem == &Table->Hooks[HOOKID_TO_INDEX(HookId)]
- ? NULL : CONTAINING_RECORD(Elem, HOOK, Chain));
- }
-
- return Hook;
+ PHOOK Hook;
+ PLIST_ENTRY Elem;
+
+ Hook = IntGetFirstHook(Table, HookId);
+
+ while (NULL != Hook && NULL == Hook->Proc)
+ {
+ Elem = Hook->Chain.Flink;
+ Hook = (Elem == &Table->Hooks[HOOKID_TO_INDEX(HookId)]
+ ? NULL : CONTAINING_RECORD(Elem, HOOK, Chain));
+ }
+
+ return Hook;
}
/* find the next hook in the chain, skipping the deleted ones */
@@ -168,129 +180,140 @@
FASTCALL
IntGetNextHook(PHOOK Hook)
{
- PHOOKTABLE Table = IntGetTable(Hook);
- int HookId = Hook->HookId;
- PLIST_ENTRY Elem;
-
- Elem = Hook->Chain.Flink;
- while (Elem != &Table->Hooks[HOOKID_TO_INDEX(HookId)])
- {
- Hook = CONTAINING_RECORD(Elem, HOOK, Chain);
- if (NULL != Hook->Proc)
- {
- return Hook;
- }
- }
-
- if (NULL != GlobalHooks && Table != GlobalHooks) /* now search through the
global table */
- {
- return IntGetFirstValidHook(GlobalHooks, HookId);
- }
-
- return NULL;
+ PHOOKTABLE Table = IntGetTable(Hook);
+ int HookId = Hook->HookId;
+ PLIST_ENTRY Elem;
+
+ Elem = Hook->Chain.Flink;
+ while (Elem != &Table->Hooks[HOOKID_TO_INDEX(HookId)])
+ {
+ Hook = CONTAINING_RECORD(Elem, HOOK, Chain);
+ if (NULL != Hook->Proc)
+ {
+ return Hook;
+ }
+ }
+
+ if (NULL != GlobalHooks && Table != GlobalHooks) /* now search through the
global table */
+ {
+ return IntGetFirstValidHook(GlobalHooks, HookId);
+ }
+
+ return NULL;
}
/* free a hook, removing it from its chain */
-static VOID FASTCALL
+static
+VOID
+FASTCALL
IntFreeHook(PHOOKTABLE Table, PHOOK Hook, PWINSTATION_OBJECT WinStaObj)
{
- RemoveEntryList(&Hook->Chain);
- RtlFreeUnicodeString(&Hook->ModuleName);
-
- /* Dereference thread if required */
- if (Hook->Flags & HOOK_THREAD_REFERENCED)
- {
- ObDereferenceObject(Hook->Thread);
- }
-
- /* Close handle */
- UserDeleteObject(Hook->Self, otHook);
+ RemoveEntryList(&Hook->Chain);
+ RtlFreeUnicodeString(&Hook->ModuleName);
+
+ /* Dereference thread if required */
+ if (Hook->Flags & HOOK_THREAD_REFERENCED)
+ {
+ ObDereferenceObject(Hook->Thread);
+ }
+
+ /* Close handle */
+ UserDeleteObject(Hook->Self, otHook);
}
/* remove a hook, freeing it if the chain is not in use */
-static VOID
+static
+VOID
IntRemoveHook(PHOOK Hook, PWINSTATION_OBJECT WinStaObj, BOOL TableAlreadyLocked)
{
- PTHREADINFO W32Thread;
- PHOOKTABLE Table = IntGetTable(Hook);
-
- ASSERT(NULL != Table);
- if (NULL == Table)
- {
- return;
- }
-
- W32Thread = ((PTHREADINFO)Hook->Thread->Tcb.Win32Thread);
- ASSERT(W32Thread != NULL);
- W32Thread->fsHooks &= ~HOOKID_TO_FLAG(Hook->HookId);
-
- GetWin32ClientInfo()->fsHooks = W32Thread->fsHooks;
-
- if (W32Thread->ThreadInfo != NULL)
- W32Thread->ThreadInfo->fsHooks = W32Thread->fsHooks;
-
- if (0 != Table->Counts[HOOKID_TO_INDEX(Hook->HookId)])
- {
- Hook->Proc = NULL; /* chain is in use, just mark it and return */
- }
- else
- {
- IntFreeHook(Table, Hook, WinStaObj);
- }
+ PTHREADINFO W32Thread;
+ PHOOKTABLE Table = IntGetTable(Hook);
+
+ ASSERT(NULL != Table);
+ if (NULL == Table)
+ {
+ return;
+ }
+
+ W32Thread = ((PTHREADINFO)Hook->Thread->Tcb.Win32Thread);
+ ASSERT(W32Thread != NULL);
+ W32Thread->fsHooks &= ~HOOKID_TO_FLAG(Hook->HookId);
+
+ GetWin32ClientInfo()->fsHooks = W32Thread->fsHooks;
+
+ if (W32Thread->ThreadInfo != NULL)
+ W32Thread->ThreadInfo->fsHooks = W32Thread->fsHooks;
+
+ if (0 != Table->Counts[HOOKID_TO_INDEX(Hook->HookId)])
+ {
+ Hook->Proc = NULL; /* chain is in use, just mark it and return */
+ }
+ else
+ {
+ IntFreeHook(Table, Hook, WinStaObj);
+ }
}
/* release a hook chain, removing deleted hooks if the use count drops to 0 */
-static VOID FASTCALL
+static
+VOID
+FASTCALL
IntReleaseHookChain(PHOOKTABLE Table, int HookId, PWINSTATION_OBJECT WinStaObj)
{
- PLIST_ENTRY Elem;
- PHOOK HookObj;
-
- if (NULL == Table)
- {
- return;
- }
-
- /* use count shouldn't already be 0 */
- ASSERT(0 != Table->Counts[HOOKID_TO_INDEX(HookId)]);
- if (0 == Table->Counts[HOOKID_TO_INDEX(HookId)])
- {
- return;
- }
- if (0 == --Table->Counts[HOOKID_TO_INDEX(HookId)])
- {
- Elem = Table->Hooks[HOOKID_TO_INDEX(HookId)].Flink;
- while (Elem != &Table->Hooks[HOOKID_TO_INDEX(HookId)])
- {
- HookObj = CONTAINING_RECORD(Elem, HOOK, Chain);
- Elem = Elem->Flink;
- if (NULL == HookObj->Proc)
- {
- IntFreeHook(Table, HookObj, WinStaObj);
- }
- }
- }
-}
-
-static LRESULT FASTCALL
+ PLIST_ENTRY Elem;
+ PHOOK HookObj;
+
+ if (NULL == Table)
+ {
+ return;
+ }
+
+ /* use count shouldn't already be 0 */
+ ASSERT(0 != Table->Counts[HOOKID_TO_INDEX(HookId)]);
+
+ if (0 == Table->Counts[HOOKID_TO_INDEX(HookId)])
+ {
+ return;
+ }
+
+ if (0 == --Table->Counts[HOOKID_TO_INDEX(HookId)])
+ {
+ Elem = Table->Hooks[HOOKID_TO_INDEX(HookId)].Flink;
+
+ while (Elem != &Table->Hooks[HOOKID_TO_INDEX(HookId)])
+ {
+ HookObj = CONTAINING_RECORD(Elem, HOOK, Chain);
+ Elem = Elem->Flink;
+
+ if (NULL == HookObj->Proc)
+ {
+ IntFreeHook(Table, HookObj, WinStaObj);
+ }
+ }
+ }
+}
+
+static
+LRESULT
+FASTCALL
IntCallLowLevelHook(PHOOK Hook, INT Code, WPARAM wParam, LPARAM lParam)
{
- NTSTATUS Status;
- ULONG_PTR uResult;
-
- /* FIXME should get timeout from
- * HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */
- Status =
co_MsqSendMessage(((PTHREADINFO)Hook->Thread->Tcb.Win32Thread)->MessageQueue,
- (HWND) Code,
- Hook->HookId,
- wParam,
- lParam,
- 5000,
- TRUE,
- MSQ_ISHOOK,
- &uResult);
-
- return NT_SUCCESS(Status) ? uResult : 0;
+ NTSTATUS Status;
+ ULONG_PTR uResult;
+
+ /* FIXME should get timeout from
+ * HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */
+ Status =
co_MsqSendMessage(((PTHREADINFO)Hook->Thread->Tcb.Win32Thread)->MessageQueue,
+ (HWND)Code,
+ Hook->HookId,
+ wParam,
+ lParam,
+ 5000,
+ TRUE,
+ MSQ_ISHOOK,
+ &uResult);
+
+ return NT_SUCCESS(Status) ? uResult : 0;
}
/*
@@ -300,267 +323,281 @@
FASTCALL
co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
{
- PHOOK Hook, SaveHook;
- PTHREADINFO pti;
- PCLIENTINFO ClientInfo;
- PHOOKTABLE Table;
- LRESULT Result;
- PWINSTATION_OBJECT WinStaObj;
- NTSTATUS Status;
-
- ASSERT(WH_MINHOOK <= HookId && HookId <= WH_MAXHOOK);
-
- pti = PsGetCurrentThreadWin32Thread();
- if (!pti)
- {
- Table = NULL;
- }
- else
- {
- Table = MsqGetHooks(pti->MessageQueue);
- }
-
- if (NULL == Table || ! (Hook = IntGetFirstValidHook(Table, HookId)))
- {
- /* try global table */
- Table = GlobalHooks;
- if (NULL == Table || ! (Hook = IntGetFirstValidHook(Table, HookId)))
- {
- return 0; /* no hook set */
- }
- }
-
- if ((Hook->Thread != PsGetCurrentThread()) && (Hook->Thread != NULL))
- {
- // Post it in message queue.
- return IntCallLowLevelHook(Hook, Code, wParam, lParam);
- }
-
- Table->Counts[HOOKID_TO_INDEX(HookId)]++;
- if (Table != GlobalHooks && GlobalHooks != NULL)
- {
- GlobalHooks->Counts[HOOKID_TO_INDEX(HookId)]++;
- }
-
- ClientInfo = GetWin32ClientInfo();
- SaveHook = ClientInfo->phkCurrent;
- ClientInfo->phkCurrent = Hook; // Load the call.
-
- Result = co_IntCallHookProc( HookId,
- Code,
+ PHOOK Hook, SaveHook;
+ PTHREADINFO pti;
+ PCLIENTINFO ClientInfo;
+ PHOOKTABLE Table;
+ LRESULT Result;
+ PWINSTATION_OBJECT WinStaObj;
+ NTSTATUS Status;
+
+ ASSERT(WH_MINHOOK <= HookId && HookId <= WH_MAXHOOK);
+
+ pti = PsGetCurrentThreadWin32Thread();
+ if (!pti)
+ {
+ Table = NULL;
+ }
+ else
+ {
+ Table = MsqGetHooks(pti->MessageQueue);
+ }
+
+ if (NULL == Table || ! (Hook = IntGetFirstValidHook(Table, HookId)))
+ {
+ /* try global table */
+ Table = GlobalHooks;
+ if (NULL == Table || ! (Hook = IntGetFirstValidHook(Table, HookId)))
+ {
+ return 0; /* no hook set */
+ }
+ }
+
+ if ((Hook->Thread != PsGetCurrentThread()) && (Hook->Thread != NULL))
+ {
+ /* Post it in message queue. */
+ return IntCallLowLevelHook(Hook, Code, wParam, lParam);
+ }
+
+ Table->Counts[HOOKID_TO_INDEX(HookId)]++;
+ if (Table != GlobalHooks && GlobalHooks != NULL)
+ {
+ GlobalHooks->Counts[HOOKID_TO_INDEX(HookId)]++;
+ }
+
+ ClientInfo = GetWin32ClientInfo();
+ SaveHook = ClientInfo->phkCurrent;
+ ClientInfo->phkCurrent = Hook; /* Load the call. */
+
+ Result = co_IntCallHookProc(HookId,
+ Code,
wParam,
lParam,
- Hook->Proc,
- Hook->Ansi,
- &Hook->ModuleName);
-
- ClientInfo->phkCurrent = SaveHook;
-
- Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
- KernelMode,
- 0,
- &WinStaObj);
-
- if (! NT_SUCCESS(Status))
- {
- DPRINT1("Invalid window station????\n");
- }
- else
- {
- IntReleaseHookChain(MsqGetHooks(pti->MessageQueue), HookId, WinStaObj);
- IntReleaseHookChain(GlobalHooks, HookId, WinStaObj);
- ObDereferenceObject(WinStaObj);
- }
-
- return Result;
-}
-
-VOID FASTCALL
+ Hook->Proc,
+ Hook->Ansi,
+ &Hook->ModuleName);
+
+ ClientInfo->phkCurrent = SaveHook;
+
+ Status =
IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
+ KernelMode,
+ 0,
+ &WinStaObj);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Invalid window station????\n");
+ }
+ else
+ {
+ IntReleaseHookChain(MsqGetHooks(pti->MessageQueue), HookId, WinStaObj);
+ IntReleaseHookChain(GlobalHooks, HookId, WinStaObj);
+ ObDereferenceObject(WinStaObj);
+ }
+
+ return Result;
+}
+
+VOID
+FASTCALL
HOOK_DestroyThreadHooks(PETHREAD Thread)
{
- int HookId;
- PLIST_ENTRY Elem;
- PHOOK HookObj;
- PWINSTATION_OBJECT WinStaObj;
- NTSTATUS Status;
-
- if (NULL != GlobalHooks)
- {
- Status =
IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
- KernelMode,
- 0,
- &WinStaObj);
-
- if (! NT_SUCCESS(Status))
- {
- DPRINT1("Invalid window station????\n");
- return;
- }
-
- for (HookId = WH_MINHOOK; HookId <= WH_MAXHOOK; HookId++)
- {
- /* only low-level keyboard/mouse global hooks can be owned by a thread */
- switch(HookId)
- {
- case WH_KEYBOARD_LL:
- case WH_MOUSE_LL:
- Elem = GlobalHooks->Hooks[HOOKID_TO_INDEX(HookId)].Flink;
- while (Elem != &GlobalHooks->Hooks[HOOKID_TO_INDEX(HookId)])
- {
- HookObj = CONTAINING_RECORD(Elem, HOOK, Chain);
- Elem = Elem->Flink;
- if (HookObj->Thread == Thread)
- {
- IntRemoveHook(HookObj, WinStaObj, TRUE);
- }
- }
- break;
- }
- }
- }
-}
-
-static LRESULT
+ int HookId;
+ PLIST_ENTRY Elem;
+ PHOOK HookObj;
+ PWINSTATION_OBJECT WinStaObj;
+ NTSTATUS Status;
+
+ if (NULL != GlobalHooks)
+ {
+ Status =
IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
+ KernelMode,
+ 0,
+ &WinStaObj);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Invalid window station????\n");
+ return;
+ }
+
+ for (HookId = WH_MINHOOK; HookId <= WH_MAXHOOK; HookId++)
+ {
+ /* only low-level keyboard/mouse global hooks can be owned by a thread */
+ switch(HookId)
+ {
+ case WH_KEYBOARD_LL:
+ case WH_MOUSE_LL:
+ Elem = GlobalHooks->Hooks[HOOKID_TO_INDEX(HookId)].Flink;
+
+ while (Elem != &GlobalHooks->Hooks[HOOKID_TO_INDEX(HookId)])
+ {
+ HookObj = CONTAINING_RECORD(Elem, HOOK, Chain);
+ Elem = Elem->Flink;
+
+ if (HookObj->Thread == Thread)
+ {
+ IntRemoveHook(HookObj, WinStaObj, TRUE);
+ }
+ }
+ break;
+ }
+ }
+ }
+}
+
+static
+LRESULT
FASTCALL
co_HOOK_CallHookNext(PHOOK Hook, INT Code, WPARAM wParam, LPARAM lParam)
{
- if ((Hook->Thread != PsGetCurrentThread()) && (Hook->Thread != NULL))
- {
- DPRINT1("CALLING HOOK from another Thread. %d\n",Hook->HookId);
- return IntCallLowLevelHook(Hook, Code, wParam, lParam);
- }
- DPRINT("CALLING HOOK %d\n",Hook->HookId);
- return co_IntCallHookProc(Hook->HookId,
- Code,
- wParam,
- lParam,
- Hook->Proc,
- Hook->Ansi,
- &Hook->ModuleName);
+ if ((Hook->Thread != PsGetCurrentThread()) && (Hook->Thread != NULL))
+ {
+ DPRINT1("CALLING HOOK from another Thread. %d\n", Hook->HookId);
+ return IntCallLowLevelHook(Hook, Code, wParam, lParam);
+ }
+
+ DPRINT("CALLING HOOK %d\n", Hook->HookId);
+
+ return co_IntCallHookProc(Hook->HookId,
+ Code,
+ wParam,
+ lParam,
+ Hook->Proc,
+ Hook->Ansi,
+ &Hook->ModuleName);
}
LRESULT
FASTCALL
-IntCallDebugHook(
- PHOOK Hook,
- int Code,
- WPARAM wParam,
- LPARAM lParam)
-{
- LRESULT lResult = 0;
- ULONG Size;
- DEBUGHOOKINFO Debug;
- PVOID HooklParam = NULL;
- BOOL BadChk = FALSE;
-
- if (lParam)
- {
- _SEH2_TRY
- {
- ProbeForRead((PVOID)lParam,
- sizeof(DEBUGHOOKINFO),
- 1);
- RtlCopyMemory( &Debug,
- (PVOID)lParam,
- sizeof(DEBUGHOOKINFO));
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- BadChk = TRUE;
- }
- _SEH2_END;
- if (BadChk)
- {
- DPRINT1("HOOK WH_DEBUG read from lParam ERROR!\n");
- return lResult;
- }
- }
- else
- return lResult; // Need lParam!
-
- switch (wParam)
- {
- case WH_CBT:
- {
- switch (Debug.code)
- {
- case HCBT_CLICKSKIPPED:
- Size = sizeof(MOUSEHOOKSTRUCTEX);
- break;
- case HCBT_MOVESIZE:
- Size = sizeof(RECT);
- break;
- case HCBT_ACTIVATE:
- Size = sizeof(CBTACTIVATESTRUCT);
- break;
- case HCBT_CREATEWND: // Handle Ansi?
- Size = sizeof(CBT_CREATEWND);
- // What shall we do? Size += sizeof(CREATESTRUCTEX);
- break;
- default:
- Size = sizeof(LPARAM);
- }
- }
- break;
-
- case WH_MOUSE_LL:
- Size = sizeof(MSLLHOOKSTRUCT);
- break;
-
- case WH_KEYBOARD_LL:
- Size = sizeof(KBDLLHOOKSTRUCT);
- break;
-
- case WH_MSGFILTER:
- case WH_SYSMSGFILTER:
- case WH_GETMESSAGE:
- Size = sizeof(MSG);
- break;
-
- case WH_JOURNALPLAYBACK:
- case WH_JOURNALRECORD:
- Size = sizeof(EVENTMSG);
- break;
-
- case WH_FOREGROUNDIDLE:
- case WH_KEYBOARD:
- case WH_SHELL:
- default:
- Size = sizeof(LPARAM);
- }
-
- if (Size > sizeof(LPARAM))
- HooklParam = ExAllocatePoolWithTag(NonPagedPool, Size, TAG_HOOK);
-
- if (HooklParam)
- {
- _SEH2_TRY
- {
- ProbeForRead((PVOID)Debug.lParam,
- Size,
- 1);
- RtlCopyMemory( HooklParam,
- (PVOID)Debug.lParam,
- Size);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- BadChk = TRUE;
- }
- _SEH2_END;
- if (BadChk)
- {
- DPRINT1("HOOK WH_DEBUG read from Debug.lParam ERROR!\n");
- ExFreePool(HooklParam);
- return lResult;
- }
- }
-
- if (HooklParam) Debug.lParam = (LPARAM)HooklParam;
- lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Debug);
- if (HooklParam) ExFreePoolWithTag(HooklParam, TAG_HOOK);
- return lResult;
+IntCallDebugHook(PHOOK Hook,
+ int Code,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ LRESULT lResult = 0;
+ ULONG Size;
+ DEBUGHOOKINFO Debug;
+ PVOID HooklParam = NULL;
+ BOOL BadChk = FALSE;
+
+ if (lParam)
+ {
+ _SEH2_TRY
+ {
+ ProbeForRead((PVOID)lParam,
+ sizeof(DEBUGHOOKINFO),
+ 1);
+
+ RtlCopyMemory(&Debug,
+ (PVOID)lParam,
+ sizeof(DEBUGHOOKINFO));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ BadChk = TRUE;
+ }
+ _SEH2_END;
+
+ if (BadChk)
+ {
+ DPRINT1("HOOK WH_DEBUG read from lParam ERROR!\n");
+ return lResult;
+ }
+ }
+ else
+ return lResult; /* Need lParam! */
+
+ switch (wParam)
+ {
+ case WH_CBT:
+ {
+ switch (Debug.code)
+ {
+ case HCBT_CLICKSKIPPED:
+ Size = sizeof(MOUSEHOOKSTRUCTEX);
+ break;
+
+ case HCBT_MOVESIZE:
+ Size = sizeof(RECT);
+ break;
+
+ case HCBT_ACTIVATE:
+ Size = sizeof(CBTACTIVATESTRUCT);
+ break;
+
+ case HCBT_CREATEWND: /* Handle Ansi? */
+ Size = sizeof(CBT_CREATEWND);
+ /* What shall we do? Size += sizeof(CREATESTRUCTEX); */
+ break;
+
+ default:
+ Size = sizeof(LPARAM);
+ }
+ }
+ break;
+
+ case WH_MOUSE_LL:
+ Size = sizeof(MSLLHOOKSTRUCT);
+ break;
+
+ case WH_KEYBOARD_LL:
+ Size = sizeof(KBDLLHOOKSTRUCT);
+ break;
+
+ case WH_MSGFILTER:
+ case WH_SYSMSGFILTER:
+ case WH_GETMESSAGE:
+ Size = sizeof(MSG);
+ break;
+
+ case WH_JOURNALPLAYBACK:
+ case WH_JOURNALRECORD:
+ Size = sizeof(EVENTMSG);
+ break;
+
+ case WH_FOREGROUNDIDLE:
+ case WH_KEYBOARD:
+ case WH_SHELL:
+ default:
+ Size = sizeof(LPARAM);
+ }
+
+ if (Size > sizeof(LPARAM))
+ HooklParam = ExAllocatePoolWithTag(NonPagedPool, Size, TAG_HOOK);
+
+ if (HooklParam)
+ {
+ _SEH2_TRY
+ {
+ ProbeForRead((PVOID)Debug.lParam,
+ Size,
+ 1);
+
+ RtlCopyMemory(HooklParam,
+ (PVOID)Debug.lParam,
+ Size);
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ BadChk = TRUE;
+ }
+ _SEH2_END;
+
+ if (BadChk)
+ {
+ DPRINT1("HOOK WH_DEBUG read from Debug.lParam ERROR!\n");
+ ExFreePool(HooklParam);
+ return lResult;
+ }
+ }
+
+ if (HooklParam) Debug.lParam = (LPARAM)HooklParam;
+ lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Debug);
+ if (HooklParam) ExFreePoolWithTag(HooklParam, TAG_HOOK);
+
+ return lResult;
}
/*
@@ -568,647 +605,688 @@
*/
LRESULT
FASTCALL
-UserCallNextHookEx(
- PHOOK Hook,
- int Code,
- WPARAM wParam,
- LPARAM lParam,
- BOOL Ansi)
-{
- LRESULT lResult = 0;
- BOOL BadChk = FALSE;
-
-// Handle this one first.
- if ((Hook->HookId == WH_MOUSE) ||
- (Hook->HookId == WH_CBT && Code == HCBT_CLICKSKIPPED))
- {
- MOUSEHOOKSTRUCTEX Mouse;
- if (lParam)
- {
- _SEH2_TRY
- {
- ProbeForRead((PVOID)lParam,
- sizeof(MOUSEHOOKSTRUCTEX),
- 1);
- RtlCopyMemory( &Mouse,
- (PVOID)lParam,
- sizeof(MOUSEHOOKSTRUCTEX));
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- BadChk = TRUE;
- }
- _SEH2_END;
- if (BadChk)
- {
- DPRINT1("HOOK WH_MOUSE read from lParam ERROR!\n");
- }
- }
- if (!BadChk)
- {
- lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Mouse);
- }
- return lResult;
- }
-
- switch(Hook->HookId)
- {
- case WH_MOUSE_LL:
- {
- MSLLHOOKSTRUCT Mouse;
- if (lParam)
- {
+UserCallNextHookEx(PHOOK Hook,
+ int Code,
+ WPARAM wParam,
+ LPARAM lParam,
+ BOOL Ansi)
+{
+ LRESULT lResult = 0;
+ BOOL BadChk = FALSE;
+
+ /* Handle this one first. */
+ if ((Hook->HookId == WH_MOUSE) ||
+ (Hook->HookId == WH_CBT && Code == HCBT_CLICKSKIPPED))
+ {
+ MOUSEHOOKSTRUCTEX Mouse;
+ if (lParam)
+ {
_SEH2_TRY
{
ProbeForRead((PVOID)lParam,
- sizeof(MSLLHOOKSTRUCT),
+ sizeof(MOUSEHOOKSTRUCTEX),
+ 1);
+
+ RtlCopyMemory(&Mouse,
+ (PVOID)lParam,
+ sizeof(MOUSEHOOKSTRUCTEX));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ BadChk = TRUE;
+ }
+ _SEH2_END;
+
+ if (BadChk)
+ {
+ DPRINT1("HOOK WH_MOUSE read from lParam ERROR!\n");
+ }
+ }
+
+ if (!BadChk)
+ {
+ lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Mouse);
+ }
+
+ return lResult;
+ }
+
+ switch(Hook->HookId)
+ {
+ case WH_MOUSE_LL:
+ {
+ MSLLHOOKSTRUCT Mouse;
+
+ if (lParam)
+ {
+ _SEH2_TRY
+ {
+ ProbeForRead((PVOID)lParam,
+ sizeof(MSLLHOOKSTRUCT),
+ 1);
+
+ RtlCopyMemory(&Mouse,
+ (PVOID)lParam,
+ sizeof(MSLLHOOKSTRUCT));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ BadChk = TRUE;
+ }
+ _SEH2_END;
+
+ if (BadChk)
+ {
+ DPRINT1("HOOK WH_MOUSE_LL read from lParam ERROR!\n");
+ }
+ }
+
+ if (!BadChk)
+ {
+ lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Mouse);
+ }
+ break;
+ }
+
+ case WH_KEYBOARD_LL:
+ {
+ KBDLLHOOKSTRUCT Keyboard;
+
+ if (lParam)
+ {
+ _SEH2_TRY
+ {
+ ProbeForRead((PVOID)lParam,
+ sizeof(KBDLLHOOKSTRUCT),
+ 1);
+
+ RtlCopyMemory(&Keyboard,
+ (PVOID)lParam,
+ sizeof(KBDLLHOOKSTRUCT));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ BadChk = TRUE;
+ }
+ _SEH2_END;
+
+ if (BadChk)
+ {
+ DPRINT1("HOOK WH_KEYBORD_LL read from lParam ERROR!\n");
+ }
+ }
+
+ if (!BadChk)
+ {
+ lResult = co_HOOK_CallHookNext(Hook, Code, wParam,
(LPARAM)&Keyboard);
+ }
+ break;
+ }
+
+ case WH_MSGFILTER:
+ case WH_SYSMSGFILTER:
+ case WH_GETMESSAGE:
+ {
+ MSG Msg;
+
+ if (lParam)
+ {
+ _SEH2_TRY
+ {
+ ProbeForRead((PVOID)lParam,
+ sizeof(MSG),
+ 1);
+
+ RtlCopyMemory(&Msg,
+ (PVOID)lParam,
+ sizeof(MSG));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ BadChk = TRUE;
+ }
+ _SEH2_END;
+
+ if (BadChk)
+ {
+ DPRINT1("HOOK WH_XMESSAGEX read from lParam ERROR!\n");
+ }
+ }
+
+ if (!BadChk)
+ {
+ lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Msg);
+
+ if (lParam && (Hook->HookId == WH_GETMESSAGE))
+ {
+ _SEH2_TRY
+ {
+ ProbeForWrite((PVOID)lParam,
+ sizeof(MSG),
+ 1);
+
+ RtlCopyMemory((PVOID)lParam,
+ &Msg,
+ sizeof(MSG));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ BadChk = TRUE;
+ }
+ _SEH2_END;
+
+ if (BadChk)
+ {
+ DPRINT1("HOOK WH_GETMESSAGE write to lParam
ERROR!\n");
+ }
+ }
+ }
+ break;
+ }
+
+ case WH_CBT:
+ DPRINT1("HOOK WH_CBT!\n");
+ switch (Code)
+ {
+ case HCBT_CREATEWND: /* Use Ansi. */
+ DPRINT1("HOOK HCBT_CREATEWND\n");
+ /* lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam); */
+ break;
+
+ case HCBT_MOVESIZE:
+ {
+ RECTL rt;
+
+ DPRINT1("HOOK HCBT_MOVESIZE\n");
+
+ if (lParam)
+ {
+ _SEH2_TRY
+ {
+ ProbeForRead((PVOID)lParam,
+ sizeof(RECT),
1);
- RtlCopyMemory( &Mouse,
- (PVOID)lParam,
- sizeof(MSLLHOOKSTRUCT));
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- BadChk = TRUE;
- }
- _SEH2_END;
- if (BadChk)
- {
- DPRINT1("HOOK WH_MOUSE_LL read from lParam ERROR!\n");
- }
- }
- if (!BadChk)
- {
- lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Mouse);
- }
- break;
- }
-
- case WH_KEYBOARD_LL:
- {
- KBDLLHOOKSTRUCT Keyboard;
- if (lParam)
- {
- _SEH2_TRY
- {
- ProbeForRead((PVOID)lParam,
- sizeof(KBDLLHOOKSTRUCT),
+
+ RtlCopyMemory(&rt,
+ (PVOID)lParam,
+ sizeof(RECT));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ BadChk = TRUE;
+ }
+ _SEH2_END;
+
+ if (BadChk)
+ {
+ DPRINT1("HOOK HCBT_MOVESIZE read from lParam
ERROR!\n");
+ }
+ }
+
+ if (!BadChk)
+ {
+ lResult = co_HOOK_CallHookNext(Hook, Code, wParam,
(LPARAM)&rt);
+ }
+ break;
+ }
+
+ case HCBT_ACTIVATE:
+ {
+ CBTACTIVATESTRUCT CbAs;
+
+ DPRINT1("HOOK HCBT_ACTIVATE\n");
+ if (lParam)
+ {
+ _SEH2_TRY
+ {
+ ProbeForRead((PVOID)lParam,
+ sizeof(CBTACTIVATESTRUCT),
1);
- RtlCopyMemory( &Keyboard,
- (PVOID)lParam,
- sizeof(KBDLLHOOKSTRUCT));
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- BadChk = TRUE;
- }
- _SEH2_END;
- if (BadChk)
- {
- DPRINT1("HOOK WH_KEYBORD_LL read from lParam ERROR!\n");
- }
- }
- if (!BadChk)
- {
- lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Keyboard);
- }
- break;
- }
-
- case WH_MSGFILTER:
- case WH_SYSMSGFILTER:
- case WH_GETMESSAGE:
- {
- MSG Msg;
- if (lParam)
- {
- _SEH2_TRY
- {
- ProbeForRead((PVOID)lParam,
- sizeof(MSG),
- 1);
- RtlCopyMemory( &Msg,
- (PVOID)lParam,
- sizeof(MSG));
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- BadChk = TRUE;
- }
- _SEH2_END;
- if (BadChk)
- {
- DPRINT1("HOOK WH_XMESSAGEX read from lParam ERROR!\n");
- }
- }
- if (!BadChk)
- {
- lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Msg);
- if (lParam && (Hook->HookId == WH_GETMESSAGE))
- {
- _SEH2_TRY
- {
- ProbeForWrite((PVOID)lParam,
- sizeof(MSG),
- 1);
- RtlCopyMemory((PVOID)lParam,
- &Msg,
- sizeof(MSG));
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- BadChk = TRUE;
- }
- _SEH2_END;
- if (BadChk)
- {
- DPRINT1("HOOK WH_GETMESSAGE write to lParam ERROR!\n");
- }
- }
- }
- break;
- }
-
- case WH_CBT:
- DPRINT1("HOOK WH_CBT!\n");
- switch (Code)
- {
- case HCBT_CREATEWND: // Use Ansi.
- DPRINT1("HOOK HCBT_CREATEWND\n");
-// lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam);
- break;
-
- case HCBT_MOVESIZE:
- {
- RECTL rt;
- DPRINT1("HOOK HCBT_MOVESIZE\n");
- if (lParam)
- {
- _SEH2_TRY
- {
- ProbeForRead((PVOID)lParam,
- sizeof(RECT),
- 1);
- RtlCopyMemory( &rt,
- (PVOID)lParam,
- sizeof(RECT));
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- BadChk = TRUE;
- }
- _SEH2_END;
- if (BadChk)
- {
- DPRINT1("HOOK HCBT_MOVESIZE read from lParam ERROR!\n");
- }
- }
- if (!BadChk)
- {
- lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&rt);
- }
- break;
- }
-
- case HCBT_ACTIVATE:
- {
- CBTACTIVATESTRUCT CbAs;
- DPRINT1("HOOK HCBT_ACTIVATE\n");
- if (lParam)
- {
- _SEH2_TRY
- {
- ProbeForRead((PVOID)lParam,
- sizeof(CBTACTIVATESTRUCT),
- 1);
- RtlCopyMemory( &CbAs,
- (PVOID)lParam,
- sizeof(CBTACTIVATESTRUCT));
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- BadChk = TRUE;
- }
- _SEH2_END;
- if (BadChk)
- {
- DPRINT1("HOOK HCBT_ACTIVATE read from lParam ERROR!\n");
- }
- }
- if (!BadChk)
- {
- lResult = co_HOOK_CallHookNext(Hook, Code, wParam,
(LPARAM)&CbAs);
- }
- break;
- }
- /*
- The rest just use default.
- */
- default:
- DPRINT1("HOOK HCBT_ %d\n",Code);
- lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam);
- break;
- }
- break;
-
- case WH_JOURNALPLAYBACK:
- case WH_JOURNALRECORD:
- {
- EVENTMSG EventMsg;
- if (lParam)
- {
- _SEH2_TRY
- {
- ProbeForRead((PVOID)lParam,
- sizeof(EVENTMSG),
- 1);
- RtlCopyMemory( &EventMsg,
- (PVOID)lParam,
- sizeof(EVENTMSG));
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- BadChk = TRUE;
- }
- _SEH2_END;
- if (BadChk)
- {
- DPRINT1("HOOK WH_JOURNAL read from lParam ERROR!\n");
- }
- }
- if (!BadChk)
- {
- lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)(lParam ?
&EventMsg : NULL));
+
+ RtlCopyMemory(&CbAs,
+ (PVOID)lParam,
+ sizeof(CBTACTIVATESTRUCT));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ BadChk = TRUE;
+ }
+ _SEH2_END;
+
+ if (BadChk)
+ {
+ DPRINT1("HOOK HCBT_ACTIVATE read from lParam
ERROR!\n");
+ }
+ }
+
+ if (!BadChk)
+ {
+ lResult = co_HOOK_CallHookNext(Hook, Code, wParam,
(LPARAM)&CbAs);
+ }
+ break;
+ }
+
+ /* The rest just use default. */
+ default:
+ DPRINT1("HOOK HCBT_ %d\n",Code);
+ lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam);
+ break;
+ }
+ break;
+
+ case WH_JOURNALPLAYBACK:
+ case WH_JOURNALRECORD:
+ {
+ EVENTMSG EventMsg;
+
if (lParam)
{
- _SEH2_TRY
- {
- ProbeForWrite((PVOID)lParam,
- sizeof(EVENTMSG),
- 1);
- RtlCopyMemory((PVOID)lParam,
- &EventMsg,
+ _SEH2_TRY
+ {
+ ProbeForRead((PVOID)lParam,
+ sizeof(EVENTMSG),
+ 1);
+
+ RtlCopyMemory(&EventMsg,
+ (PVOID)lParam,
sizeof(EVENTMSG));
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- BadChk = TRUE;
- }
- _SEH2_END;
- if (BadChk)
- {
- DPRINT1("HOOK WH_JOURNAL write to lParam ERROR!\n");
- }
- }
- }
- break;
- }
-
- case WH_DEBUG:
- lResult = IntCallDebugHook(Hook, Code, wParam, lParam);
- break;
-/*
- Default the rest like, WH_FOREGROUNDIDLE, WH_KEYBOARD and WH_SHELL.
- */
- case WH_FOREGROUNDIDLE:
- case WH_KEYBOARD:
- case WH_SHELL:
- lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam);
- break;
-
- default:
- DPRINT1("Unsupported HOOK Id -> %d\n",Hook->HookId);
- break;
- }
- return lResult;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ BadChk = TRUE;
+ }
+ _SEH2_END;
+
+ if (BadChk)
+ {
+ DPRINT1("HOOK WH_JOURNAL read from lParam ERROR!\n");
+ }
+ }
+
+ if (!BadChk)
+ {
+ lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)(lParam ?
&EventMsg : NULL));
+
+ if (lParam)
+ {
+ _SEH2_TRY
+ {
+ ProbeForWrite((PVOID)lParam,
+ sizeof(EVENTMSG),
+ 1);
+
+ RtlCopyMemory((PVOID)lParam,
+ &EventMsg,
+ sizeof(EVENTMSG));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ BadChk = TRUE;
+ }
+ _SEH2_END;
+
+ if (BadChk)
+ {
+ DPRINT1("HOOK WH_JOURNAL write to lParam ERROR!\n");
+ }
+ }
+ }
+ break;
+ }
+
+ case WH_DEBUG:
+ lResult = IntCallDebugHook(Hook, Code, wParam, lParam);
+ break;
+
+ /*
+ * Default the rest like, WH_FOREGROUNDIDLE, WH_KEYBOARD and WH_SHELL.
+ */
+ case WH_FOREGROUNDIDLE:
+ case WH_KEYBOARD:
+ case WH_SHELL:
+ lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam);
+ break;
+
+ default:
+ DPRINT1("Unsupported HOOK Id -> %d\n",Hook->HookId);
+ break;
+ }
+
+ return lResult;
}
LRESULT
APIENTRY
-NtUserCallNextHookEx(
- int Code,
- WPARAM wParam,
- LPARAM lParam,
- BOOL Ansi)
-{
- PHOOK HookObj, NextObj;
- PCLIENTINFO ClientInfo;
- PWINSTATION_OBJECT WinStaObj;
- NTSTATUS Status;
- DECLARE_RETURN(LRESULT);
-
- DPRINT("Enter NtUserCallNextHookEx\n");
- UserEnterExclusive();
-
- Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
- KernelMode,
- 0,
- &WinStaObj);
- if (!NT_SUCCESS(Status))
- {
- SetLastNtError(Status);
- RETURN( 0);
- }
-
- ObDereferenceObject(WinStaObj);
-
- ClientInfo = GetWin32ClientInfo();
-
- if (!ClientInfo) RETURN( 0);
-
- HookObj = ClientInfo->phkCurrent;
-
- if (!HookObj) RETURN( 0);
-
- UserReferenceObject(HookObj);
-
- Ansi = HookObj->Ansi;
-
- if (NULL != HookObj->Thread && (HookObj->Thread !=
PsGetCurrentThread()))
- {
- DPRINT1("Thread mismatch\n");
- UserDereferenceObject(HookObj);
- SetLastWin32Error(ERROR_INVALID_HANDLE);
- RETURN( 0);
- }
+NtUserCallNextHookEx(int Code,
+ WPARAM wParam,
+ LPARAM lParam,
+ BOOL Ansi)
+{
+ PHOOK HookObj, NextObj;
+ PCLIENTINFO ClientInfo;
+ PWINSTATION_OBJECT WinStaObj;
+ NTSTATUS Status;
+ DECLARE_RETURN(LRESULT);
+
+ DPRINT("Enter NtUserCallNextHookEx\n");
+ UserEnterExclusive();
+
+ Status =
IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
+ KernelMode,
+ 0,
+ &WinStaObj);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ RETURN( 0);
+ }
+
+ ObDereferenceObject(WinStaObj);
+
+ ClientInfo = GetWin32ClientInfo();
+
+ if (!ClientInfo) RETURN( 0);
+
+ HookObj = ClientInfo->phkCurrent;
+
+ if (!HookObj) RETURN( 0);
+
+ UserReferenceObject(HookObj);
+
+ Ansi = HookObj->Ansi;
+
+ if (NULL != HookObj->Thread && (HookObj->Thread !=
PsGetCurrentThread()))
+ {
+ DPRINT1("Thread mismatch\n");
+ UserDereferenceObject(HookObj);
+ SetLastWin32Error(ERROR_INVALID_HANDLE);
+ RETURN( 0);
+ }
- NextObj = IntGetNextHook(HookObj);
- ClientInfo->phkCurrent = NextObj; // Preset next hook from list.
- UserCallNextHookEx( HookObj, Code, wParam, lParam, Ansi);
- UserDereferenceObject(HookObj);
-
- RETURN( (LRESULT)NextObj);
+ NextObj = IntGetNextHook(HookObj);
+ ClientInfo->phkCurrent = NextObj; /* Preset next hook from list. */
+ UserCallNextHookEx( HookObj, Code, wParam, lParam, Ansi);
+ UserDereferenceObject(HookObj);
+
+ RETURN( (LRESULT)NextObj);
CLEANUP:
- DPRINT("Leave NtUserCallNextHookEx, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserCallNextHookEx, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}
HHOOK
APIENTRY
-NtUserSetWindowsHookAW(
- int idHook,
- HOOKPROC lpfn,
- BOOL Ansi)
-{
- UNICODE_STRING USModuleName;
- RtlInitUnicodeString(&USModuleName, NULL);
- return NtUserSetWindowsHookEx(NULL, &USModuleName, 0, idHook, lpfn, Ansi);
+NtUserSetWindowsHookAW(int idHook,
+ HOOKPROC lpfn,
+ BOOL Ansi)
+{
+ UNICODE_STRING USModuleName;
+
+ RtlInitUnicodeString(&USModuleName, NULL);
+
+ return NtUserSetWindowsHookEx(NULL, &USModuleName, 0, idHook, lpfn, Ansi);
}
HHOOK
APIENTRY
-NtUserSetWindowsHookEx(
- HINSTANCE Mod,
- PUNICODE_STRING UnsafeModuleName,
- DWORD ThreadId,
- int HookId,
- HOOKPROC HookProc,
- BOOL Ansi)
-{
- PWINSTATION_OBJECT WinStaObj;
- PCLIENTINFO ClientInfo;
- BOOLEAN Global;
- PETHREAD Thread;
- PHOOK Hook;
- UNICODE_STRING ModuleName;
- NTSTATUS Status;
- HHOOK Handle;
- BOOLEAN ThreadReferenced = FALSE;
- DECLARE_RETURN(HHOOK);
-
- DPRINT("Enter NtUserSetWindowsHookEx\n");
- UserEnterExclusive();
-
- if (HookId < WH_MINHOOK || WH_MAXHOOK < HookId )
- {
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
- RETURN( NULL);
- }
-
- if (!HookProc)
- {
- SetLastWin32Error(ERROR_INVALID_FILTER_PROC);
- RETURN( NULL);
- }
-
- ClientInfo = GetWin32ClientInfo();
-
- if (ThreadId) /* thread-local hook */
- {
- if (HookId == WH_JOURNALRECORD ||
+NtUserSetWindowsHookEx(HINSTANCE Mod,
+ PUNICODE_STRING UnsafeModuleName,
+ DWORD ThreadId,
+ int HookId,
+ HOOKPROC HookProc,
+ BOOL Ansi)
+{
+ PWINSTATION_OBJECT WinStaObj;
+ PCLIENTINFO ClientInfo;
+ BOOLEAN Global;
+ PETHREAD Thread;
+ PHOOK Hook;
+ UNICODE_STRING ModuleName;
+ NTSTATUS Status;
+ HHOOK Handle;
+ BOOLEAN ThreadReferenced = FALSE;
+ DECLARE_RETURN(HHOOK);
+
+ DPRINT("Enter NtUserSetWindowsHookEx\n");
+ UserEnterExclusive();
+
+ if (HookId < WH_MINHOOK || WH_MAXHOOK < HookId )
+ {
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ RETURN( NULL);
+ }
+
+ if (!HookProc)
+ {
+ SetLastWin32Error(ERROR_INVALID_FILTER_PROC);
+ RETURN( NULL);
+ }
+
+ ClientInfo = GetWin32ClientInfo();
+
+ if (ThreadId) /* thread-local hook */
+ {
+ if (HookId == WH_JOURNALRECORD ||
HookId == WH_JOURNALPLAYBACK ||
HookId == WH_KEYBOARD_LL ||
HookId == WH_MOUSE_LL ||
HookId == WH_SYSMSGFILTER)
- {
- /* these can only be global */
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
- RETURN( NULL);
- }
- Mod = NULL;
- Global = FALSE;
- if (! NT_SUCCESS(PsLookupThreadByThreadId((HANDLE) ThreadId, &Thread)))
- {
- DPRINT1("Invalid thread id 0x%x\n", ThreadId);
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
- RETURN( NULL);
- }
- /* Thread was referenced */
- ThreadReferenced = TRUE;
- if (Thread->ThreadsProcess != PsGetCurrentProcess())
- {
- ObDereferenceObject(Thread);
- DPRINT1("Can't specify thread belonging to another process\n");
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
- RETURN( NULL);
- }
- }
- else /* system-global hook */
- {
- if (HookId == WH_KEYBOARD_LL || HookId == WH_MOUSE_LL)
- {
- Mod = NULL;
- Thread = PsGetCurrentThread();
- Status = ObReferenceObjectByPointer(Thread,
- THREAD_ALL_ACCESS,
- PsThreadType,
- KernelMode);
-
- if (! NT_SUCCESS(Status))
- {
- SetLastNtError(Status);
- RETURN( (HANDLE) NULL);
- }
-
- /* Thread was referenced */
- ThreadReferenced = TRUE;
- }
- else if (NULL == Mod)
- {
- SetLastWin32Error(ERROR_HOOK_NEEDS_HMOD);
- RETURN( NULL);
- }
- else
- {
- Thread = NULL;
- }
- Global = TRUE;
- }
-
- if ( ( Global && (HookId != WH_KEYBOARD_LL && HookId != WH_MOUSE_LL) )
||
+ {
+ /* these can only be global */
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ RETURN( NULL);
+ }
+
+ Mod = NULL;
+ Global = FALSE;
+
+ if (!NT_SUCCESS(PsLookupThreadByThreadId((HANDLE) ThreadId, &Thread)))
+ {
+ DPRINT1("Invalid thread id 0x%x\n", ThreadId);
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ RETURN( NULL);
+ }
+
+ /* Thread was referenced */
+ ThreadReferenced = TRUE;
+ if (Thread->ThreadsProcess != PsGetCurrentProcess())
+ {
+ ObDereferenceObject(Thread);
+ DPRINT1("Can't specify thread belonging to another
process\n");
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ RETURN( NULL);
+ }
+ }
+ else /* system-global hook */
+ {
+ if (HookId == WH_KEYBOARD_LL || HookId == WH_MOUSE_LL)
+ {
+ Mod = NULL;
+ Thread = PsGetCurrentThread();
+
+ Status = ObReferenceObjectByPointer(Thread,
+ THREAD_ALL_ACCESS,
+ PsThreadType,
+ KernelMode);
+
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ RETURN( (HANDLE) NULL);
+ }
+
+ /* Thread was referenced */
+ ThreadReferenced = TRUE;
+ }
+ else if (NULL == Mod)
+ {
+ SetLastWin32Error(ERROR_HOOK_NEEDS_HMOD);
+ RETURN( NULL);
+ }
+ else
+ {
+ Thread = NULL;
+ }
+ Global = TRUE;
+ }
+
+ if ((Global && (HookId != WH_KEYBOARD_LL && HookId != WH_MOUSE_LL))
||
WH_DEBUG == HookId ||
WH_JOURNALPLAYBACK == HookId ||
WH_JOURNALRECORD == HookId)
- {
+ {
#if 0 /* Removed to get winEmbed working again */
- UNIMPLEMENTED
+ UNIMPLEMENTED
#else
- DPRINT1("Not implemented: HookId %d Global %s\n", HookId, Global ?
"TRUE" : "FALSE");
+ DPRINT1("Not implemented: HookId %d Global %s\n", HookId, Global ?
"TRUE" : "FALSE");
#endif
- /* Dereference thread if needed */
- if (ThreadReferenced) ObDereferenceObject(Thread);
- SetLastWin32Error(ERROR_NOT_SUPPORTED);
- RETURN( NULL);
- }
-
- Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
- KernelMode,
- 0,
- &WinStaObj);
-
- if (! NT_SUCCESS(Status))
- {
- /* Dereference thread if needed */
- if (ThreadReferenced) ObDereferenceObject(Thread);
- SetLastNtError(Status);
- RETURN( (HANDLE) NULL);
- }
-
- Hook = IntAddHook(Thread, HookId, Global, WinStaObj);
- if (NULL == Hook)
- {
- /* Dereference thread if needed */
- if (ThreadReferenced) ObDereferenceObject(Thread);
- ObDereferenceObject(WinStaObj);
- RETURN( NULL);
- }
-
- /* Let IntFreeHook now that this thread needs a dereference */
- if (ThreadReferenced)
- {
- Hook->Flags |= HOOK_THREAD_REFERENCED;
- }
-
- if (NULL != Mod)
- {
- Status = MmCopyFromCaller(&ModuleName, UnsafeModuleName,
sizeof(UNICODE_STRING));
- if (! NT_SUCCESS(Status))
- {
- UserDereferenceObject(Hook);
- IntRemoveHook(Hook, WinStaObj, FALSE);
- ObDereferenceObject(WinStaObj);
- SetLastNtError(Status);
- RETURN( NULL);
- }
- Hook->ModuleName.Buffer = ExAllocatePoolWithTag(PagedPool,
- ModuleName.MaximumLength,
- TAG_HOOK);
- if (NULL == Hook->ModuleName.Buffer)
- {
- UserDereferenceObject(Hook);
- IntRemoveHook(Hook, WinStaObj, FALSE);
- ObDereferenceObject(WinStaObj);
- SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
- RETURN( NULL);
- }
- Hook->ModuleName.MaximumLength = ModuleName.MaximumLength;
- Status = MmCopyFromCaller(Hook->ModuleName.Buffer,
- ModuleName.Buffer,
- ModuleName.MaximumLength);
- if (! NT_SUCCESS(Status))
- {
- ExFreePoolWithTag(Hook->ModuleName.Buffer, TAG_HOOK);
- UserDereferenceObject(Hook);
- IntRemoveHook(Hook, WinStaObj, FALSE);
- ObDereferenceObject(WinStaObj);
- SetLastNtError(Status);
- RETURN( NULL);
- }
- Hook->ModuleName.Length = ModuleName.Length;
- /* make proc relative to the module base */
- Hook->Proc = (void *)((char *)HookProc - (char *)Mod);
- }
- else
- Hook->Proc = HookProc;
-
- Hook->Ansi = Ansi;
- Handle = Hook->Self;
-
-// Clear the client threads next hook.
- ClientInfo->phkCurrent = 0;
-
- UserDereferenceObject(Hook);
-
- ObDereferenceObject(WinStaObj);
-
- RETURN( Handle);
+ /* Dereference thread if needed */
+ if (ThreadReferenced) ObDereferenceObject(Thread);
+ SetLastWin32Error(ERROR_NOT_SUPPORTED);
+ RETURN( NULL);
+ }
+
+ Status =
IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
+ KernelMode,
+ 0,
+ &WinStaObj);
+
+ if (!NT_SUCCESS(Status))
+ {
+ /* Dereference thread if needed */
+ if (ThreadReferenced) ObDereferenceObject(Thread);
+ SetLastNtError(Status);
+ RETURN( (HANDLE) NULL);
+ }
+
+ Hook = IntAddHook(Thread, HookId, Global, WinStaObj);
+ if (NULL == Hook)
+ {
+ /* Dereference thread if needed */
+ if (ThreadReferenced) ObDereferenceObject(Thread);
+ ObDereferenceObject(WinStaObj);
+ RETURN( NULL);
+ }
+
+ /* Let IntFreeHook now that this thread needs a dereference */
+ if (ThreadReferenced)
+ {
+ Hook->Flags |= HOOK_THREAD_REFERENCED;
+ }
+
+ if (NULL != Mod)
+ {
+ Status = MmCopyFromCaller(&ModuleName, UnsafeModuleName,
sizeof(UNICODE_STRING));
+ if (!NT_SUCCESS(Status))
+ {
+ UserDereferenceObject(Hook);
+ IntRemoveHook(Hook, WinStaObj, FALSE);
+ ObDereferenceObject(WinStaObj);
+ SetLastNtError(Status);
+ RETURN( NULL);
+ }
+
+ Hook->ModuleName.Buffer = ExAllocatePoolWithTag(PagedPool,
+ ModuleName.MaximumLength,
+ TAG_HOOK);
+ if (NULL == Hook->ModuleName.Buffer)
+ {
+ UserDereferenceObject(Hook);
+ IntRemoveHook(Hook, WinStaObj, FALSE);
+ ObDereferenceObject(WinStaObj);
+ SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
+ RETURN( NULL);
+ }
+
+ Hook->ModuleName.MaximumLength = ModuleName.MaximumLength;
+ Status = MmCopyFromCaller(Hook->ModuleName.Buffer,
+ ModuleName.Buffer,
+ ModuleName.MaximumLength);
+ if (!NT_SUCCESS(Status))
+ {
+ ExFreePoolWithTag(Hook->ModuleName.Buffer, TAG_HOOK);
+ UserDereferenceObject(Hook);
+ IntRemoveHook(Hook, WinStaObj, FALSE);
+ ObDereferenceObject(WinStaObj);
+ SetLastNtError(Status);
+ RETURN( NULL);
+ }
+
+ Hook->ModuleName.Length = ModuleName.Length;
+ /* make proc relative to the module base */
+ Hook->Proc = (void *)((char *)HookProc - (char *)Mod);
+ }
+ else
+ Hook->Proc = HookProc;
+
+ Hook->Ansi = Ansi;
+ Handle = Hook->Self;
+
+ /* Clear the client threads next hook. */
+ ClientInfo->phkCurrent = 0;
+
+ UserDereferenceObject(Hook);
+
+ ObDereferenceObject(WinStaObj);
+
+ RETURN( Handle);
CLEANUP:
- DPRINT("Leave NtUserSetWindowsHookEx, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserSetWindowsHookEx, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}
BOOL
APIENTRY
-NtUserUnhookWindowsHookEx(
- HHOOK Hook)
-{
- PWINSTATION_OBJECT WinStaObj;
- PHOOK HookObj;
- NTSTATUS Status;
- DECLARE_RETURN(BOOL);
-
- DPRINT("Enter NtUserUnhookWindowsHookEx\n");
- UserEnterExclusive();
-
- Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
- KernelMode,
- 0,
- &WinStaObj);
-
- if (! NT_SUCCESS(Status))
- {
- SetLastNtError(Status);
- RETURN( FALSE);
- }
-
- // Status = UserReferenceObjectByHandle(gHandleTable, Hook,
- // otHookProc, (PVOID *) &HookObj);
- if (!(HookObj = IntGetHookObject(Hook)))
- {
- DPRINT1("Invalid handle passed to NtUserUnhookWindowsHookEx\n");
- ObDereferenceObject(WinStaObj);
- // SetLastNtError(Status);
- RETURN( FALSE);
- }
- ASSERT(Hook == HookObj->Self);
-
- IntRemoveHook(HookObj, WinStaObj, FALSE);
-
- UserDereferenceObject(HookObj);
- ObDereferenceObject(WinStaObj);
-
- RETURN( TRUE);
+NtUserUnhookWindowsHookEx(HHOOK Hook)
+{
+ PWINSTATION_OBJECT WinStaObj;
+ PHOOK HookObj;
+ NTSTATUS Status;
+ DECLARE_RETURN(BOOL);
+
+ DPRINT("Enter NtUserUnhookWindowsHookEx\n");
+ UserEnterExclusive();
+
+ Status =
IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
+ KernelMode,
+ 0,
+ &WinStaObj);
+
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ RETURN( FALSE);
+ }
+
+ /* Status = UserReferenceObjectByHandle(gHandleTable, Hook,
+ otHookProc, (PVOID *) &HookObj); */
+ if (!(HookObj = IntGetHookObject(Hook)))
+ {
+ DPRINT1("Invalid handle passed to NtUserUnhookWindowsHookEx\n");
+ ObDereferenceObject(WinStaObj);
+ /* SetLastNtError(Status); */
+ RETURN( FALSE);
+ }
+
+ ASSERT(Hook == HookObj->Self);
+
+ IntRemoveHook(HookObj, WinStaObj, FALSE);
+
+ UserDereferenceObject(HookObj);
+ ObDereferenceObject(WinStaObj);
+
+ RETURN( TRUE);
CLEANUP:
- DPRINT("Leave NtUserUnhookWindowsHookEx, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserUnhookWindowsHookEx, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}
/* EOF */