- Formatting fix. No code change

svn path=/trunk/; revision=41042
This commit is contained in:
Dmitry Chapyshev 2009-05-22 12:50:31 +00:00
parent 90e41cf673
commit 5826eb2c18

View file

@ -22,7 +22,8 @@ static PHOOKTABLE GlobalHooks;
/* create a new hook table */ /* create a new hook table */
static PHOOKTABLE static
PHOOKTABLE
IntAllocHookTable(void) IntAllocHookTable(void)
{ {
PHOOKTABLE Table; PHOOKTABLE Table;
@ -42,7 +43,9 @@ IntAllocHookTable(void)
} }
PHOOK FASTCALL IntGetHookObject(HHOOK hHook) PHOOK
FASTCALL
IntGetHookObject(HHOOK hHook)
{ {
PHOOK Hook; PHOOK Hook;
@ -69,7 +72,8 @@ PHOOK FASTCALL IntGetHookObject(HHOOK hHook)
/* create a new hook and add it to the specified table */ /* 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) IntAddHook(PETHREAD Thread, int HookId, BOOLEAN Global, PWINSTATION_OBJECT WinStaObj)
{ {
PTHREADINFO W32Thread; PTHREADINFO W32Thread;
@ -124,7 +128,9 @@ IntAddHook(PETHREAD Thread, int HookId, BOOLEAN Global, PWINSTATION_OBJECT WinSt
} }
/* get the hook table that a given hook belongs to */ /* get the hook table that a given hook belongs to */
static PHOOKTABLE FASTCALL static
PHOOKTABLE
FASTCALL
IntGetTable(PHOOK Hook) IntGetTable(PHOOK Hook)
{ {
if (NULL == Hook->Thread || WH_KEYBOARD_LL == Hook->HookId || if (NULL == Hook->Thread || WH_KEYBOARD_LL == Hook->HookId ||
@ -137,22 +143,28 @@ IntGetTable(PHOOK Hook)
} }
/* get the first hook in the chain */ /* get the first hook in the chain */
static PHOOK FASTCALL static
PHOOK
FASTCALL
IntGetFirstHook(PHOOKTABLE Table, int HookId) IntGetFirstHook(PHOOKTABLE Table, int HookId)
{ {
PLIST_ENTRY Elem = Table->Hooks[HOOKID_TO_INDEX(HookId)].Flink; PLIST_ENTRY Elem = Table->Hooks[HOOKID_TO_INDEX(HookId)].Flink;
return Elem == &Table->Hooks[HOOKID_TO_INDEX(HookId)] return Elem == &Table->Hooks[HOOKID_TO_INDEX(HookId)]
? NULL : CONTAINING_RECORD(Elem, HOOK, Chain); ? NULL : CONTAINING_RECORD(Elem, HOOK, Chain);
} }
/* find the first non-deleted hook in the chain */ /* find the first non-deleted hook in the chain */
static PHOOK FASTCALL static
PHOOK
FASTCALL
IntGetFirstValidHook(PHOOKTABLE Table, int HookId) IntGetFirstValidHook(PHOOKTABLE Table, int HookId)
{ {
PHOOK Hook; PHOOK Hook;
PLIST_ENTRY Elem; PLIST_ENTRY Elem;
Hook = IntGetFirstHook(Table, HookId); Hook = IntGetFirstHook(Table, HookId);
while (NULL != Hook && NULL == Hook->Proc) while (NULL != Hook && NULL == Hook->Proc)
{ {
Elem = Hook->Chain.Flink; Elem = Hook->Chain.Flink;
@ -191,7 +203,9 @@ IntGetNextHook(PHOOK Hook)
} }
/* free a hook, removing it from its chain */ /* free a hook, removing it from its chain */
static VOID FASTCALL static
VOID
FASTCALL
IntFreeHook(PHOOKTABLE Table, PHOOK Hook, PWINSTATION_OBJECT WinStaObj) IntFreeHook(PHOOKTABLE Table, PHOOK Hook, PWINSTATION_OBJECT WinStaObj)
{ {
RemoveEntryList(&Hook->Chain); RemoveEntryList(&Hook->Chain);
@ -208,7 +222,8 @@ IntFreeHook(PHOOKTABLE Table, PHOOK Hook, PWINSTATION_OBJECT WinStaObj)
} }
/* remove a hook, freeing it if the chain is not in use */ /* remove a hook, freeing it if the chain is not in use */
static VOID static
VOID
IntRemoveHook(PHOOK Hook, PWINSTATION_OBJECT WinStaObj, BOOL TableAlreadyLocked) IntRemoveHook(PHOOK Hook, PWINSTATION_OBJECT WinStaObj, BOOL TableAlreadyLocked)
{ {
PTHREADINFO W32Thread; PTHREADINFO W32Thread;
@ -240,7 +255,9 @@ IntRemoveHook(PHOOK Hook, PWINSTATION_OBJECT WinStaObj, BOOL TableAlreadyLocked)
} }
/* release a hook chain, removing deleted hooks if the use count drops to 0 */ /* 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) IntReleaseHookChain(PHOOKTABLE Table, int HookId, PWINSTATION_OBJECT WinStaObj)
{ {
PLIST_ENTRY Elem; PLIST_ENTRY Elem;
@ -253,17 +270,21 @@ IntReleaseHookChain(PHOOKTABLE Table, int HookId, PWINSTATION_OBJECT WinStaObj)
/* use count shouldn't already be 0 */ /* use count shouldn't already be 0 */
ASSERT(0 != Table->Counts[HOOKID_TO_INDEX(HookId)]); ASSERT(0 != Table->Counts[HOOKID_TO_INDEX(HookId)]);
if (0 == Table->Counts[HOOKID_TO_INDEX(HookId)]) if (0 == Table->Counts[HOOKID_TO_INDEX(HookId)])
{ {
return; return;
} }
if (0 == --Table->Counts[HOOKID_TO_INDEX(HookId)]) if (0 == --Table->Counts[HOOKID_TO_INDEX(HookId)])
{ {
Elem = Table->Hooks[HOOKID_TO_INDEX(HookId)].Flink; Elem = Table->Hooks[HOOKID_TO_INDEX(HookId)].Flink;
while (Elem != &Table->Hooks[HOOKID_TO_INDEX(HookId)]) while (Elem != &Table->Hooks[HOOKID_TO_INDEX(HookId)])
{ {
HookObj = CONTAINING_RECORD(Elem, HOOK, Chain); HookObj = CONTAINING_RECORD(Elem, HOOK, Chain);
Elem = Elem->Flink; Elem = Elem->Flink;
if (NULL == HookObj->Proc) if (NULL == HookObj->Proc)
{ {
IntFreeHook(Table, HookObj, WinStaObj); IntFreeHook(Table, HookObj, WinStaObj);
@ -272,7 +293,9 @@ IntReleaseHookChain(PHOOKTABLE Table, int HookId, PWINSTATION_OBJECT WinStaObj)
} }
} }
static LRESULT FASTCALL static
LRESULT
FASTCALL
IntCallLowLevelHook(PHOOK Hook, INT Code, WPARAM wParam, LPARAM lParam) IntCallLowLevelHook(PHOOK Hook, INT Code, WPARAM wParam, LPARAM lParam)
{ {
NTSTATUS Status; NTSTATUS Status;
@ -281,7 +304,7 @@ IntCallLowLevelHook(PHOOK Hook, INT Code, WPARAM wParam, LPARAM lParam)
/* FIXME should get timeout from /* FIXME should get timeout from
* HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */ * HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */
Status = co_MsqSendMessage(((PTHREADINFO)Hook->Thread->Tcb.Win32Thread)->MessageQueue, Status = co_MsqSendMessage(((PTHREADINFO)Hook->Thread->Tcb.Win32Thread)->MessageQueue,
(HWND) Code, (HWND)Code,
Hook->HookId, Hook->HookId,
wParam, wParam,
lParam, lParam,
@ -332,7 +355,7 @@ co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
if ((Hook->Thread != PsGetCurrentThread()) && (Hook->Thread != NULL)) if ((Hook->Thread != PsGetCurrentThread()) && (Hook->Thread != NULL))
{ {
// Post it in message queue. /* Post it in message queue. */
return IntCallLowLevelHook(Hook, Code, wParam, lParam); return IntCallLowLevelHook(Hook, Code, wParam, lParam);
} }
@ -344,9 +367,9 @@ co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
ClientInfo = GetWin32ClientInfo(); ClientInfo = GetWin32ClientInfo();
SaveHook = ClientInfo->phkCurrent; SaveHook = ClientInfo->phkCurrent;
ClientInfo->phkCurrent = Hook; // Load the call. ClientInfo->phkCurrent = Hook; /* Load the call. */
Result = co_IntCallHookProc( HookId, Result = co_IntCallHookProc(HookId,
Code, Code,
wParam, wParam,
lParam, lParam,
@ -361,7 +384,7 @@ co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
0, 0,
&WinStaObj); &WinStaObj);
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("Invalid window station????\n"); DPRINT1("Invalid window station????\n");
} }
@ -375,7 +398,8 @@ co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
return Result; return Result;
} }
VOID FASTCALL VOID
FASTCALL
HOOK_DestroyThreadHooks(PETHREAD Thread) HOOK_DestroyThreadHooks(PETHREAD Thread)
{ {
int HookId; int HookId;
@ -391,7 +415,7 @@ HOOK_DestroyThreadHooks(PETHREAD Thread)
0, 0,
&WinStaObj); &WinStaObj);
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("Invalid window station????\n"); DPRINT1("Invalid window station????\n");
return; return;
@ -405,10 +429,12 @@ HOOK_DestroyThreadHooks(PETHREAD Thread)
case WH_KEYBOARD_LL: case WH_KEYBOARD_LL:
case WH_MOUSE_LL: case WH_MOUSE_LL:
Elem = GlobalHooks->Hooks[HOOKID_TO_INDEX(HookId)].Flink; Elem = GlobalHooks->Hooks[HOOKID_TO_INDEX(HookId)].Flink;
while (Elem != &GlobalHooks->Hooks[HOOKID_TO_INDEX(HookId)]) while (Elem != &GlobalHooks->Hooks[HOOKID_TO_INDEX(HookId)])
{ {
HookObj = CONTAINING_RECORD(Elem, HOOK, Chain); HookObj = CONTAINING_RECORD(Elem, HOOK, Chain);
Elem = Elem->Flink; Elem = Elem->Flink;
if (HookObj->Thread == Thread) if (HookObj->Thread == Thread)
{ {
IntRemoveHook(HookObj, WinStaObj, TRUE); IntRemoveHook(HookObj, WinStaObj, TRUE);
@ -420,16 +446,19 @@ HOOK_DestroyThreadHooks(PETHREAD Thread)
} }
} }
static LRESULT static
LRESULT
FASTCALL FASTCALL
co_HOOK_CallHookNext(PHOOK Hook, INT Code, WPARAM wParam, LPARAM lParam) co_HOOK_CallHookNext(PHOOK Hook, INT Code, WPARAM wParam, LPARAM lParam)
{ {
if ((Hook->Thread != PsGetCurrentThread()) && (Hook->Thread != NULL)) if ((Hook->Thread != PsGetCurrentThread()) && (Hook->Thread != NULL))
{ {
DPRINT1("CALLING HOOK from another Thread. %d\n",Hook->HookId); DPRINT1("CALLING HOOK from another Thread. %d\n", Hook->HookId);
return IntCallLowLevelHook(Hook, Code, wParam, lParam); return IntCallLowLevelHook(Hook, Code, wParam, lParam);
} }
DPRINT("CALLING HOOK %d\n",Hook->HookId);
DPRINT("CALLING HOOK %d\n", Hook->HookId);
return co_IntCallHookProc(Hook->HookId, return co_IntCallHookProc(Hook->HookId,
Code, Code,
wParam, wParam,
@ -442,8 +471,7 @@ co_HOOK_CallHookNext(PHOOK Hook, INT Code, WPARAM wParam, LPARAM lParam)
LRESULT LRESULT
FASTCALL FASTCALL
IntCallDebugHook( IntCallDebugHook(PHOOK Hook,
PHOOK Hook,
int Code, int Code,
WPARAM wParam, WPARAM wParam,
LPARAM lParam) LPARAM lParam)
@ -461,7 +489,8 @@ IntCallDebugHook(
ProbeForRead((PVOID)lParam, ProbeForRead((PVOID)lParam,
sizeof(DEBUGHOOKINFO), sizeof(DEBUGHOOKINFO),
1); 1);
RtlCopyMemory( &Debug,
RtlCopyMemory(&Debug,
(PVOID)lParam, (PVOID)lParam,
sizeof(DEBUGHOOKINFO)); sizeof(DEBUGHOOKINFO));
} }
@ -470,6 +499,7 @@ IntCallDebugHook(
BadChk = TRUE; BadChk = TRUE;
} }
_SEH2_END; _SEH2_END;
if (BadChk) if (BadChk)
{ {
DPRINT1("HOOK WH_DEBUG read from lParam ERROR!\n"); DPRINT1("HOOK WH_DEBUG read from lParam ERROR!\n");
@ -477,7 +507,7 @@ IntCallDebugHook(
} }
} }
else else
return lResult; // Need lParam! return lResult; /* Need lParam! */
switch (wParam) switch (wParam)
{ {
@ -488,16 +518,20 @@ IntCallDebugHook(
case HCBT_CLICKSKIPPED: case HCBT_CLICKSKIPPED:
Size = sizeof(MOUSEHOOKSTRUCTEX); Size = sizeof(MOUSEHOOKSTRUCTEX);
break; break;
case HCBT_MOVESIZE: case HCBT_MOVESIZE:
Size = sizeof(RECT); Size = sizeof(RECT);
break; break;
case HCBT_ACTIVATE: case HCBT_ACTIVATE:
Size = sizeof(CBTACTIVATESTRUCT); Size = sizeof(CBTACTIVATESTRUCT);
break; break;
case HCBT_CREATEWND: // Handle Ansi?
case HCBT_CREATEWND: /* Handle Ansi? */
Size = sizeof(CBT_CREATEWND); Size = sizeof(CBT_CREATEWND);
// What shall we do? Size += sizeof(CREATESTRUCTEX); /* What shall we do? Size += sizeof(CREATESTRUCTEX); */
break; break;
default: default:
Size = sizeof(LPARAM); Size = sizeof(LPARAM);
} }
@ -540,7 +574,8 @@ IntCallDebugHook(
ProbeForRead((PVOID)Debug.lParam, ProbeForRead((PVOID)Debug.lParam,
Size, Size,
1); 1);
RtlCopyMemory( HooklParam,
RtlCopyMemory(HooklParam,
(PVOID)Debug.lParam, (PVOID)Debug.lParam,
Size); Size);
} }
@ -549,6 +584,7 @@ IntCallDebugHook(
BadChk = TRUE; BadChk = TRUE;
} }
_SEH2_END; _SEH2_END;
if (BadChk) if (BadChk)
{ {
DPRINT1("HOOK WH_DEBUG read from Debug.lParam ERROR!\n"); DPRINT1("HOOK WH_DEBUG read from Debug.lParam ERROR!\n");
@ -560,6 +596,7 @@ IntCallDebugHook(
if (HooklParam) Debug.lParam = (LPARAM)HooklParam; if (HooklParam) Debug.lParam = (LPARAM)HooklParam;
lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Debug); lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Debug);
if (HooklParam) ExFreePoolWithTag(HooklParam, TAG_HOOK); if (HooklParam) ExFreePoolWithTag(HooklParam, TAG_HOOK);
return lResult; return lResult;
} }
@ -568,8 +605,7 @@ IntCallDebugHook(
*/ */
LRESULT LRESULT
FASTCALL FASTCALL
UserCallNextHookEx( UserCallNextHookEx(PHOOK Hook,
PHOOK Hook,
int Code, int Code,
WPARAM wParam, WPARAM wParam,
LPARAM lParam, LPARAM lParam,
@ -578,7 +614,7 @@ UserCallNextHookEx(
LRESULT lResult = 0; LRESULT lResult = 0;
BOOL BadChk = FALSE; BOOL BadChk = FALSE;
// Handle this one first. /* Handle this one first. */
if ((Hook->HookId == WH_MOUSE) || if ((Hook->HookId == WH_MOUSE) ||
(Hook->HookId == WH_CBT && Code == HCBT_CLICKSKIPPED)) (Hook->HookId == WH_CBT && Code == HCBT_CLICKSKIPPED))
{ {
@ -590,7 +626,8 @@ UserCallNextHookEx(
ProbeForRead((PVOID)lParam, ProbeForRead((PVOID)lParam,
sizeof(MOUSEHOOKSTRUCTEX), sizeof(MOUSEHOOKSTRUCTEX),
1); 1);
RtlCopyMemory( &Mouse,
RtlCopyMemory(&Mouse,
(PVOID)lParam, (PVOID)lParam,
sizeof(MOUSEHOOKSTRUCTEX)); sizeof(MOUSEHOOKSTRUCTEX));
} }
@ -599,15 +636,18 @@ UserCallNextHookEx(
BadChk = TRUE; BadChk = TRUE;
} }
_SEH2_END; _SEH2_END;
if (BadChk) if (BadChk)
{ {
DPRINT1("HOOK WH_MOUSE read from lParam ERROR!\n"); DPRINT1("HOOK WH_MOUSE read from lParam ERROR!\n");
} }
} }
if (!BadChk) if (!BadChk)
{ {
lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Mouse); lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Mouse);
} }
return lResult; return lResult;
} }
@ -616,6 +656,7 @@ UserCallNextHookEx(
case WH_MOUSE_LL: case WH_MOUSE_LL:
{ {
MSLLHOOKSTRUCT Mouse; MSLLHOOKSTRUCT Mouse;
if (lParam) if (lParam)
{ {
_SEH2_TRY _SEH2_TRY
@ -623,7 +664,8 @@ UserCallNextHookEx(
ProbeForRead((PVOID)lParam, ProbeForRead((PVOID)lParam,
sizeof(MSLLHOOKSTRUCT), sizeof(MSLLHOOKSTRUCT),
1); 1);
RtlCopyMemory( &Mouse,
RtlCopyMemory(&Mouse,
(PVOID)lParam, (PVOID)lParam,
sizeof(MSLLHOOKSTRUCT)); sizeof(MSLLHOOKSTRUCT));
} }
@ -632,11 +674,13 @@ UserCallNextHookEx(
BadChk = TRUE; BadChk = TRUE;
} }
_SEH2_END; _SEH2_END;
if (BadChk) if (BadChk)
{ {
DPRINT1("HOOK WH_MOUSE_LL read from lParam ERROR!\n"); DPRINT1("HOOK WH_MOUSE_LL read from lParam ERROR!\n");
} }
} }
if (!BadChk) if (!BadChk)
{ {
lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Mouse); lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Mouse);
@ -647,6 +691,7 @@ UserCallNextHookEx(
case WH_KEYBOARD_LL: case WH_KEYBOARD_LL:
{ {
KBDLLHOOKSTRUCT Keyboard; KBDLLHOOKSTRUCT Keyboard;
if (lParam) if (lParam)
{ {
_SEH2_TRY _SEH2_TRY
@ -654,7 +699,8 @@ UserCallNextHookEx(
ProbeForRead((PVOID)lParam, ProbeForRead((PVOID)lParam,
sizeof(KBDLLHOOKSTRUCT), sizeof(KBDLLHOOKSTRUCT),
1); 1);
RtlCopyMemory( &Keyboard,
RtlCopyMemory(&Keyboard,
(PVOID)lParam, (PVOID)lParam,
sizeof(KBDLLHOOKSTRUCT)); sizeof(KBDLLHOOKSTRUCT));
} }
@ -663,11 +709,13 @@ UserCallNextHookEx(
BadChk = TRUE; BadChk = TRUE;
} }
_SEH2_END; _SEH2_END;
if (BadChk) if (BadChk)
{ {
DPRINT1("HOOK WH_KEYBORD_LL read from lParam ERROR!\n"); DPRINT1("HOOK WH_KEYBORD_LL read from lParam ERROR!\n");
} }
} }
if (!BadChk) if (!BadChk)
{ {
lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Keyboard); lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Keyboard);
@ -680,6 +728,7 @@ UserCallNextHookEx(
case WH_GETMESSAGE: case WH_GETMESSAGE:
{ {
MSG Msg; MSG Msg;
if (lParam) if (lParam)
{ {
_SEH2_TRY _SEH2_TRY
@ -687,7 +736,8 @@ UserCallNextHookEx(
ProbeForRead((PVOID)lParam, ProbeForRead((PVOID)lParam,
sizeof(MSG), sizeof(MSG),
1); 1);
RtlCopyMemory( &Msg,
RtlCopyMemory(&Msg,
(PVOID)lParam, (PVOID)lParam,
sizeof(MSG)); sizeof(MSG));
} }
@ -696,14 +746,17 @@ UserCallNextHookEx(
BadChk = TRUE; BadChk = TRUE;
} }
_SEH2_END; _SEH2_END;
if (BadChk) if (BadChk)
{ {
DPRINT1("HOOK WH_XMESSAGEX read from lParam ERROR!\n"); DPRINT1("HOOK WH_XMESSAGEX read from lParam ERROR!\n");
} }
} }
if (!BadChk) if (!BadChk)
{ {
lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Msg); lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Msg);
if (lParam && (Hook->HookId == WH_GETMESSAGE)) if (lParam && (Hook->HookId == WH_GETMESSAGE))
{ {
_SEH2_TRY _SEH2_TRY
@ -711,6 +764,7 @@ UserCallNextHookEx(
ProbeForWrite((PVOID)lParam, ProbeForWrite((PVOID)lParam,
sizeof(MSG), sizeof(MSG),
1); 1);
RtlCopyMemory((PVOID)lParam, RtlCopyMemory((PVOID)lParam,
&Msg, &Msg,
sizeof(MSG)); sizeof(MSG));
@ -720,6 +774,7 @@ UserCallNextHookEx(
BadChk = TRUE; BadChk = TRUE;
} }
_SEH2_END; _SEH2_END;
if (BadChk) if (BadChk)
{ {
DPRINT1("HOOK WH_GETMESSAGE write to lParam ERROR!\n"); DPRINT1("HOOK WH_GETMESSAGE write to lParam ERROR!\n");
@ -733,15 +788,17 @@ UserCallNextHookEx(
DPRINT1("HOOK WH_CBT!\n"); DPRINT1("HOOK WH_CBT!\n");
switch (Code) switch (Code)
{ {
case HCBT_CREATEWND: // Use Ansi. case HCBT_CREATEWND: /* Use Ansi. */
DPRINT1("HOOK HCBT_CREATEWND\n"); DPRINT1("HOOK HCBT_CREATEWND\n");
// lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam); /* lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam); */
break; break;
case HCBT_MOVESIZE: case HCBT_MOVESIZE:
{ {
RECTL rt; RECTL rt;
DPRINT1("HOOK HCBT_MOVESIZE\n"); DPRINT1("HOOK HCBT_MOVESIZE\n");
if (lParam) if (lParam)
{ {
_SEH2_TRY _SEH2_TRY
@ -749,7 +806,8 @@ UserCallNextHookEx(
ProbeForRead((PVOID)lParam, ProbeForRead((PVOID)lParam,
sizeof(RECT), sizeof(RECT),
1); 1);
RtlCopyMemory( &rt,
RtlCopyMemory(&rt,
(PVOID)lParam, (PVOID)lParam,
sizeof(RECT)); sizeof(RECT));
} }
@ -758,11 +816,13 @@ UserCallNextHookEx(
BadChk = TRUE; BadChk = TRUE;
} }
_SEH2_END; _SEH2_END;
if (BadChk) if (BadChk)
{ {
DPRINT1("HOOK HCBT_MOVESIZE read from lParam ERROR!\n"); DPRINT1("HOOK HCBT_MOVESIZE read from lParam ERROR!\n");
} }
} }
if (!BadChk) if (!BadChk)
{ {
lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&rt); lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&rt);
@ -773,6 +833,7 @@ UserCallNextHookEx(
case HCBT_ACTIVATE: case HCBT_ACTIVATE:
{ {
CBTACTIVATESTRUCT CbAs; CBTACTIVATESTRUCT CbAs;
DPRINT1("HOOK HCBT_ACTIVATE\n"); DPRINT1("HOOK HCBT_ACTIVATE\n");
if (lParam) if (lParam)
{ {
@ -781,7 +842,8 @@ UserCallNextHookEx(
ProbeForRead((PVOID)lParam, ProbeForRead((PVOID)lParam,
sizeof(CBTACTIVATESTRUCT), sizeof(CBTACTIVATESTRUCT),
1); 1);
RtlCopyMemory( &CbAs,
RtlCopyMemory(&CbAs,
(PVOID)lParam, (PVOID)lParam,
sizeof(CBTACTIVATESTRUCT)); sizeof(CBTACTIVATESTRUCT));
} }
@ -790,20 +852,21 @@ UserCallNextHookEx(
BadChk = TRUE; BadChk = TRUE;
} }
_SEH2_END; _SEH2_END;
if (BadChk) if (BadChk)
{ {
DPRINT1("HOOK HCBT_ACTIVATE read from lParam ERROR!\n"); DPRINT1("HOOK HCBT_ACTIVATE read from lParam ERROR!\n");
} }
} }
if (!BadChk) if (!BadChk)
{ {
lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&CbAs); lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&CbAs);
} }
break; break;
} }
/*
The rest just use default. /* The rest just use default. */
*/
default: default:
DPRINT1("HOOK HCBT_ %d\n",Code); DPRINT1("HOOK HCBT_ %d\n",Code);
lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam); lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam);
@ -815,6 +878,7 @@ UserCallNextHookEx(
case WH_JOURNALRECORD: case WH_JOURNALRECORD:
{ {
EVENTMSG EventMsg; EVENTMSG EventMsg;
if (lParam) if (lParam)
{ {
_SEH2_TRY _SEH2_TRY
@ -822,7 +886,8 @@ UserCallNextHookEx(
ProbeForRead((PVOID)lParam, ProbeForRead((PVOID)lParam,
sizeof(EVENTMSG), sizeof(EVENTMSG),
1); 1);
RtlCopyMemory( &EventMsg,
RtlCopyMemory(&EventMsg,
(PVOID)lParam, (PVOID)lParam,
sizeof(EVENTMSG)); sizeof(EVENTMSG));
} }
@ -831,14 +896,17 @@ UserCallNextHookEx(
BadChk = TRUE; BadChk = TRUE;
} }
_SEH2_END; _SEH2_END;
if (BadChk) if (BadChk)
{ {
DPRINT1("HOOK WH_JOURNAL read from lParam ERROR!\n"); DPRINT1("HOOK WH_JOURNAL read from lParam ERROR!\n");
} }
} }
if (!BadChk) if (!BadChk)
{ {
lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)(lParam ? &EventMsg : NULL)); lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)(lParam ? &EventMsg : NULL));
if (lParam) if (lParam)
{ {
_SEH2_TRY _SEH2_TRY
@ -846,6 +914,7 @@ UserCallNextHookEx(
ProbeForWrite((PVOID)lParam, ProbeForWrite((PVOID)lParam,
sizeof(EVENTMSG), sizeof(EVENTMSG),
1); 1);
RtlCopyMemory((PVOID)lParam, RtlCopyMemory((PVOID)lParam,
&EventMsg, &EventMsg,
sizeof(EVENTMSG)); sizeof(EVENTMSG));
@ -855,6 +924,7 @@ UserCallNextHookEx(
BadChk = TRUE; BadChk = TRUE;
} }
_SEH2_END; _SEH2_END;
if (BadChk) if (BadChk)
{ {
DPRINT1("HOOK WH_JOURNAL write to lParam ERROR!\n"); DPRINT1("HOOK WH_JOURNAL write to lParam ERROR!\n");
@ -867,8 +937,9 @@ UserCallNextHookEx(
case WH_DEBUG: case WH_DEBUG:
lResult = IntCallDebugHook(Hook, Code, wParam, lParam); lResult = IntCallDebugHook(Hook, Code, wParam, lParam);
break; break;
/*
Default the rest like, WH_FOREGROUNDIDLE, WH_KEYBOARD and WH_SHELL. /*
* Default the rest like, WH_FOREGROUNDIDLE, WH_KEYBOARD and WH_SHELL.
*/ */
case WH_FOREGROUNDIDLE: case WH_FOREGROUNDIDLE:
case WH_KEYBOARD: case WH_KEYBOARD:
@ -880,13 +951,13 @@ UserCallNextHookEx(
DPRINT1("Unsupported HOOK Id -> %d\n",Hook->HookId); DPRINT1("Unsupported HOOK Id -> %d\n",Hook->HookId);
break; break;
} }
return lResult; return lResult;
} }
LRESULT LRESULT
APIENTRY APIENTRY
NtUserCallNextHookEx( NtUserCallNextHookEx(int Code,
int Code,
WPARAM wParam, WPARAM wParam,
LPARAM lParam, LPARAM lParam,
BOOL Ansi) BOOL Ansi)
@ -933,7 +1004,7 @@ NtUserCallNextHookEx(
} }
NextObj = IntGetNextHook(HookObj); NextObj = IntGetNextHook(HookObj);
ClientInfo->phkCurrent = NextObj; // Preset next hook from list. ClientInfo->phkCurrent = NextObj; /* Preset next hook from list. */
UserCallNextHookEx( HookObj, Code, wParam, lParam, Ansi); UserCallNextHookEx( HookObj, Code, wParam, lParam, Ansi);
UserDereferenceObject(HookObj); UserDereferenceObject(HookObj);
@ -947,20 +1018,20 @@ CLEANUP:
HHOOK HHOOK
APIENTRY APIENTRY
NtUserSetWindowsHookAW( NtUserSetWindowsHookAW(int idHook,
int idHook,
HOOKPROC lpfn, HOOKPROC lpfn,
BOOL Ansi) BOOL Ansi)
{ {
UNICODE_STRING USModuleName; UNICODE_STRING USModuleName;
RtlInitUnicodeString(&USModuleName, NULL); RtlInitUnicodeString(&USModuleName, NULL);
return NtUserSetWindowsHookEx(NULL, &USModuleName, 0, idHook, lpfn, Ansi); return NtUserSetWindowsHookEx(NULL, &USModuleName, 0, idHook, lpfn, Ansi);
} }
HHOOK HHOOK
APIENTRY APIENTRY
NtUserSetWindowsHookEx( NtUserSetWindowsHookEx(HINSTANCE Mod,
HINSTANCE Mod,
PUNICODE_STRING UnsafeModuleName, PUNICODE_STRING UnsafeModuleName,
DWORD ThreadId, DWORD ThreadId,
int HookId, int HookId,
@ -1007,14 +1078,17 @@ NtUserSetWindowsHookEx(
SetLastWin32Error(ERROR_INVALID_PARAMETER); SetLastWin32Error(ERROR_INVALID_PARAMETER);
RETURN( NULL); RETURN( NULL);
} }
Mod = NULL; Mod = NULL;
Global = FALSE; Global = FALSE;
if (! NT_SUCCESS(PsLookupThreadByThreadId((HANDLE) ThreadId, &Thread)))
if (!NT_SUCCESS(PsLookupThreadByThreadId((HANDLE) ThreadId, &Thread)))
{ {
DPRINT1("Invalid thread id 0x%x\n", ThreadId); DPRINT1("Invalid thread id 0x%x\n", ThreadId);
SetLastWin32Error(ERROR_INVALID_PARAMETER); SetLastWin32Error(ERROR_INVALID_PARAMETER);
RETURN( NULL); RETURN( NULL);
} }
/* Thread was referenced */ /* Thread was referenced */
ThreadReferenced = TRUE; ThreadReferenced = TRUE;
if (Thread->ThreadsProcess != PsGetCurrentProcess()) if (Thread->ThreadsProcess != PsGetCurrentProcess())
@ -1031,12 +1105,13 @@ NtUserSetWindowsHookEx(
{ {
Mod = NULL; Mod = NULL;
Thread = PsGetCurrentThread(); Thread = PsGetCurrentThread();
Status = ObReferenceObjectByPointer(Thread, Status = ObReferenceObjectByPointer(Thread,
THREAD_ALL_ACCESS, THREAD_ALL_ACCESS,
PsThreadType, PsThreadType,
KernelMode); KernelMode);
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
SetLastNtError(Status); SetLastNtError(Status);
RETURN( (HANDLE) NULL); RETURN( (HANDLE) NULL);
@ -1057,7 +1132,7 @@ NtUserSetWindowsHookEx(
Global = TRUE; Global = TRUE;
} }
if ( ( Global && (HookId != WH_KEYBOARD_LL && HookId != WH_MOUSE_LL) ) || if ((Global && (HookId != WH_KEYBOARD_LL && HookId != WH_MOUSE_LL)) ||
WH_DEBUG == HookId || WH_DEBUG == HookId ||
WH_JOURNALPLAYBACK == HookId || WH_JOURNALPLAYBACK == HookId ||
WH_JOURNALRECORD == HookId) WH_JOURNALRECORD == HookId)
@ -1079,7 +1154,7 @@ NtUserSetWindowsHookEx(
0, 0,
&WinStaObj); &WinStaObj);
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
/* Dereference thread if needed */ /* Dereference thread if needed */
if (ThreadReferenced) ObDereferenceObject(Thread); if (ThreadReferenced) ObDereferenceObject(Thread);
@ -1105,7 +1180,7 @@ NtUserSetWindowsHookEx(
if (NULL != Mod) if (NULL != Mod)
{ {
Status = MmCopyFromCaller(&ModuleName, UnsafeModuleName, sizeof(UNICODE_STRING)); Status = MmCopyFromCaller(&ModuleName, UnsafeModuleName, sizeof(UNICODE_STRING));
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
UserDereferenceObject(Hook); UserDereferenceObject(Hook);
IntRemoveHook(Hook, WinStaObj, FALSE); IntRemoveHook(Hook, WinStaObj, FALSE);
@ -1113,6 +1188,7 @@ NtUserSetWindowsHookEx(
SetLastNtError(Status); SetLastNtError(Status);
RETURN( NULL); RETURN( NULL);
} }
Hook->ModuleName.Buffer = ExAllocatePoolWithTag(PagedPool, Hook->ModuleName.Buffer = ExAllocatePoolWithTag(PagedPool,
ModuleName.MaximumLength, ModuleName.MaximumLength,
TAG_HOOK); TAG_HOOK);
@ -1124,11 +1200,12 @@ NtUserSetWindowsHookEx(
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
RETURN( NULL); RETURN( NULL);
} }
Hook->ModuleName.MaximumLength = ModuleName.MaximumLength; Hook->ModuleName.MaximumLength = ModuleName.MaximumLength;
Status = MmCopyFromCaller(Hook->ModuleName.Buffer, Status = MmCopyFromCaller(Hook->ModuleName.Buffer,
ModuleName.Buffer, ModuleName.Buffer,
ModuleName.MaximumLength); ModuleName.MaximumLength);
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
ExFreePoolWithTag(Hook->ModuleName.Buffer, TAG_HOOK); ExFreePoolWithTag(Hook->ModuleName.Buffer, TAG_HOOK);
UserDereferenceObject(Hook); UserDereferenceObject(Hook);
@ -1137,6 +1214,7 @@ NtUserSetWindowsHookEx(
SetLastNtError(Status); SetLastNtError(Status);
RETURN( NULL); RETURN( NULL);
} }
Hook->ModuleName.Length = ModuleName.Length; Hook->ModuleName.Length = ModuleName.Length;
/* make proc relative to the module base */ /* make proc relative to the module base */
Hook->Proc = (void *)((char *)HookProc - (char *)Mod); Hook->Proc = (void *)((char *)HookProc - (char *)Mod);
@ -1147,7 +1225,7 @@ NtUserSetWindowsHookEx(
Hook->Ansi = Ansi; Hook->Ansi = Ansi;
Handle = Hook->Self; Handle = Hook->Self;
// Clear the client threads next hook. /* Clear the client threads next hook. */
ClientInfo->phkCurrent = 0; ClientInfo->phkCurrent = 0;
UserDereferenceObject(Hook); UserDereferenceObject(Hook);
@ -1165,8 +1243,7 @@ CLEANUP:
BOOL BOOL
APIENTRY APIENTRY
NtUserUnhookWindowsHookEx( NtUserUnhookWindowsHookEx(HHOOK Hook)
HHOOK Hook)
{ {
PWINSTATION_OBJECT WinStaObj; PWINSTATION_OBJECT WinStaObj;
PHOOK HookObj; PHOOK HookObj;
@ -1181,21 +1258,22 @@ NtUserUnhookWindowsHookEx(
0, 0,
&WinStaObj); &WinStaObj);
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
SetLastNtError(Status); SetLastNtError(Status);
RETURN( FALSE); RETURN( FALSE);
} }
// Status = UserReferenceObjectByHandle(gHandleTable, Hook, /* Status = UserReferenceObjectByHandle(gHandleTable, Hook,
// otHookProc, (PVOID *) &HookObj); otHookProc, (PVOID *) &HookObj); */
if (!(HookObj = IntGetHookObject(Hook))) if (!(HookObj = IntGetHookObject(Hook)))
{ {
DPRINT1("Invalid handle passed to NtUserUnhookWindowsHookEx\n"); DPRINT1("Invalid handle passed to NtUserUnhookWindowsHookEx\n");
ObDereferenceObject(WinStaObj); ObDereferenceObject(WinStaObj);
// SetLastNtError(Status); /* SetLastNtError(Status); */
RETURN( FALSE); RETURN( FALSE);
} }
ASSERT(Hook == HookObj->Self); ASSERT(Hook == HookObj->Self);
IntRemoveHook(HookObj, WinStaObj, FALSE); IntRemoveHook(HookObj, WinStaObj, FALSE);