mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 22:02:58 +00:00
- Formatting fix. No code change
svn path=/trunk/; revision=41042
This commit is contained in:
parent
90e41cf673
commit
5826eb2c18
1 changed files with 1023 additions and 945 deletions
|
@ -22,7 +22,8 @@ static PHOOKTABLE GlobalHooks;
|
|||
|
||||
|
||||
/* create a new hook table */
|
||||
static PHOOKTABLE
|
||||
static
|
||||
PHOOKTABLE
|
||||
IntAllocHookTable(void)
|
||||
{
|
||||
PHOOKTABLE Table;
|
||||
|
@ -42,7 +43,9 @@ IntAllocHookTable(void)
|
|||
}
|
||||
|
||||
|
||||
PHOOK FASTCALL IntGetHookObject(HHOOK hHook)
|
||||
PHOOK
|
||||
FASTCALL
|
||||
IntGetHookObject(HHOOK hHook)
|
||||
{
|
||||
PHOOK Hook;
|
||||
|
||||
|
@ -69,7 +72,8 @@ PHOOK FASTCALL IntGetHookObject(HHOOK hHook)
|
|||
|
||||
|
||||
/* 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;
|
||||
|
@ -124,7 +128,9 @@ IntAddHook(PETHREAD Thread, int HookId, BOOLEAN Global, PWINSTATION_OBJECT WinSt
|
|||
}
|
||||
|
||||
/* 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 ||
|
||||
|
@ -137,22 +143,28 @@ IntGetTable(PHOOK Hook)
|
|||
}
|
||||
|
||||
/* 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);
|
||||
}
|
||||
|
||||
/* 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;
|
||||
|
@ -191,7 +203,9 @@ IntGetNextHook(PHOOK Hook)
|
|||
}
|
||||
|
||||
/* 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);
|
||||
|
@ -208,7 +222,8 @@ IntFreeHook(PHOOKTABLE Table, PHOOK Hook, PWINSTATION_OBJECT WinStaObj)
|
|||
}
|
||||
|
||||
/* 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;
|
||||
|
@ -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 */
|
||||
static VOID FASTCALL
|
||||
static
|
||||
VOID
|
||||
FASTCALL
|
||||
IntReleaseHookChain(PHOOKTABLE Table, int HookId, PWINSTATION_OBJECT WinStaObj)
|
||||
{
|
||||
PLIST_ENTRY Elem;
|
||||
|
@ -253,17 +270,21 @@ IntReleaseHookChain(PHOOKTABLE Table, int HookId, PWINSTATION_OBJECT WinStaObj)
|
|||
|
||||
/* 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);
|
||||
|
@ -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)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
|
@ -281,7 +304,7 @@ IntCallLowLevelHook(PHOOK Hook, INT Code, WPARAM wParam, LPARAM lParam)
|
|||
/* FIXME should get timeout from
|
||||
* HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */
|
||||
Status = co_MsqSendMessage(((PTHREADINFO)Hook->Thread->Tcb.Win32Thread)->MessageQueue,
|
||||
(HWND) Code,
|
||||
(HWND)Code,
|
||||
Hook->HookId,
|
||||
wParam,
|
||||
lParam,
|
||||
|
@ -332,7 +355,7 @@ co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
|
|||
|
||||
if ((Hook->Thread != PsGetCurrentThread()) && (Hook->Thread != NULL))
|
||||
{
|
||||
// Post it in message queue.
|
||||
/* Post it in message queue. */
|
||||
return IntCallLowLevelHook(Hook, Code, wParam, lParam);
|
||||
}
|
||||
|
||||
|
@ -344,9 +367,9 @@ co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
|
|||
|
||||
ClientInfo = GetWin32ClientInfo();
|
||||
SaveHook = ClientInfo->phkCurrent;
|
||||
ClientInfo->phkCurrent = Hook; // Load the call.
|
||||
ClientInfo->phkCurrent = Hook; /* Load the call. */
|
||||
|
||||
Result = co_IntCallHookProc( HookId,
|
||||
Result = co_IntCallHookProc(HookId,
|
||||
Code,
|
||||
wParam,
|
||||
lParam,
|
||||
|
@ -361,7 +384,7 @@ co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
|
|||
0,
|
||||
&WinStaObj);
|
||||
|
||||
if (! NT_SUCCESS(Status))
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Invalid window station????\n");
|
||||
}
|
||||
|
@ -375,7 +398,8 @@ co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
|
|||
return Result;
|
||||
}
|
||||
|
||||
VOID FASTCALL
|
||||
VOID
|
||||
FASTCALL
|
||||
HOOK_DestroyThreadHooks(PETHREAD Thread)
|
||||
{
|
||||
int HookId;
|
||||
|
@ -391,7 +415,7 @@ HOOK_DestroyThreadHooks(PETHREAD Thread)
|
|||
0,
|
||||
&WinStaObj);
|
||||
|
||||
if (! NT_SUCCESS(Status))
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Invalid window station????\n");
|
||||
return;
|
||||
|
@ -405,10 +429,12 @@ HOOK_DestroyThreadHooks(PETHREAD Thread)
|
|||
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);
|
||||
|
@ -420,16 +446,19 @@ HOOK_DestroyThreadHooks(PETHREAD Thread)
|
|||
}
|
||||
}
|
||||
|
||||
static LRESULT
|
||||
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);
|
||||
DPRINT1("CALLING HOOK from another Thread. %d\n", Hook->HookId);
|
||||
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,
|
||||
Code,
|
||||
wParam,
|
||||
|
@ -442,8 +471,7 @@ co_HOOK_CallHookNext(PHOOK Hook, INT Code, WPARAM wParam, LPARAM lParam)
|
|||
|
||||
LRESULT
|
||||
FASTCALL
|
||||
IntCallDebugHook(
|
||||
PHOOK Hook,
|
||||
IntCallDebugHook(PHOOK Hook,
|
||||
int Code,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
|
@ -461,7 +489,8 @@ IntCallDebugHook(
|
|||
ProbeForRead((PVOID)lParam,
|
||||
sizeof(DEBUGHOOKINFO),
|
||||
1);
|
||||
RtlCopyMemory( &Debug,
|
||||
|
||||
RtlCopyMemory(&Debug,
|
||||
(PVOID)lParam,
|
||||
sizeof(DEBUGHOOKINFO));
|
||||
}
|
||||
|
@ -470,6 +499,7 @@ IntCallDebugHook(
|
|||
BadChk = TRUE;
|
||||
}
|
||||
_SEH2_END;
|
||||
|
||||
if (BadChk)
|
||||
{
|
||||
DPRINT1("HOOK WH_DEBUG read from lParam ERROR!\n");
|
||||
|
@ -477,7 +507,7 @@ IntCallDebugHook(
|
|||
}
|
||||
}
|
||||
else
|
||||
return lResult; // Need lParam!
|
||||
return lResult; /* Need lParam! */
|
||||
|
||||
switch (wParam)
|
||||
{
|
||||
|
@ -488,16 +518,20 @@ IntCallDebugHook(
|
|||
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?
|
||||
|
||||
case HCBT_CREATEWND: /* Handle Ansi? */
|
||||
Size = sizeof(CBT_CREATEWND);
|
||||
// What shall we do? Size += sizeof(CREATESTRUCTEX);
|
||||
/* What shall we do? Size += sizeof(CREATESTRUCTEX); */
|
||||
break;
|
||||
|
||||
default:
|
||||
Size = sizeof(LPARAM);
|
||||
}
|
||||
|
@ -540,7 +574,8 @@ IntCallDebugHook(
|
|||
ProbeForRead((PVOID)Debug.lParam,
|
||||
Size,
|
||||
1);
|
||||
RtlCopyMemory( HooklParam,
|
||||
|
||||
RtlCopyMemory(HooklParam,
|
||||
(PVOID)Debug.lParam,
|
||||
Size);
|
||||
}
|
||||
|
@ -549,6 +584,7 @@ IntCallDebugHook(
|
|||
BadChk = TRUE;
|
||||
}
|
||||
_SEH2_END;
|
||||
|
||||
if (BadChk)
|
||||
{
|
||||
DPRINT1("HOOK WH_DEBUG read from Debug.lParam ERROR!\n");
|
||||
|
@ -560,6 +596,7 @@ IntCallDebugHook(
|
|||
if (HooklParam) Debug.lParam = (LPARAM)HooklParam;
|
||||
lResult = co_HOOK_CallHookNext(Hook, Code, wParam, (LPARAM)&Debug);
|
||||
if (HooklParam) ExFreePoolWithTag(HooklParam, TAG_HOOK);
|
||||
|
||||
return lResult;
|
||||
}
|
||||
|
||||
|
@ -568,8 +605,7 @@ IntCallDebugHook(
|
|||
*/
|
||||
LRESULT
|
||||
FASTCALL
|
||||
UserCallNextHookEx(
|
||||
PHOOK Hook,
|
||||
UserCallNextHookEx(PHOOK Hook,
|
||||
int Code,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam,
|
||||
|
@ -578,7 +614,7 @@ UserCallNextHookEx(
|
|||
LRESULT lResult = 0;
|
||||
BOOL BadChk = FALSE;
|
||||
|
||||
// Handle this one first.
|
||||
/* Handle this one first. */
|
||||
if ((Hook->HookId == WH_MOUSE) ||
|
||||
(Hook->HookId == WH_CBT && Code == HCBT_CLICKSKIPPED))
|
||||
{
|
||||
|
@ -590,7 +626,8 @@ UserCallNextHookEx(
|
|||
ProbeForRead((PVOID)lParam,
|
||||
sizeof(MOUSEHOOKSTRUCTEX),
|
||||
1);
|
||||
RtlCopyMemory( &Mouse,
|
||||
|
||||
RtlCopyMemory(&Mouse,
|
||||
(PVOID)lParam,
|
||||
sizeof(MOUSEHOOKSTRUCTEX));
|
||||
}
|
||||
|
@ -599,15 +636,18 @@ UserCallNextHookEx(
|
|||
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;
|
||||
}
|
||||
|
||||
|
@ -616,6 +656,7 @@ UserCallNextHookEx(
|
|||
case WH_MOUSE_LL:
|
||||
{
|
||||
MSLLHOOKSTRUCT Mouse;
|
||||
|
||||
if (lParam)
|
||||
{
|
||||
_SEH2_TRY
|
||||
|
@ -623,7 +664,8 @@ UserCallNextHookEx(
|
|||
ProbeForRead((PVOID)lParam,
|
||||
sizeof(MSLLHOOKSTRUCT),
|
||||
1);
|
||||
RtlCopyMemory( &Mouse,
|
||||
|
||||
RtlCopyMemory(&Mouse,
|
||||
(PVOID)lParam,
|
||||
sizeof(MSLLHOOKSTRUCT));
|
||||
}
|
||||
|
@ -632,11 +674,13 @@ UserCallNextHookEx(
|
|||
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);
|
||||
|
@ -647,6 +691,7 @@ UserCallNextHookEx(
|
|||
case WH_KEYBOARD_LL:
|
||||
{
|
||||
KBDLLHOOKSTRUCT Keyboard;
|
||||
|
||||
if (lParam)
|
||||
{
|
||||
_SEH2_TRY
|
||||
|
@ -654,7 +699,8 @@ UserCallNextHookEx(
|
|||
ProbeForRead((PVOID)lParam,
|
||||
sizeof(KBDLLHOOKSTRUCT),
|
||||
1);
|
||||
RtlCopyMemory( &Keyboard,
|
||||
|
||||
RtlCopyMemory(&Keyboard,
|
||||
(PVOID)lParam,
|
||||
sizeof(KBDLLHOOKSTRUCT));
|
||||
}
|
||||
|
@ -663,11 +709,13 @@ UserCallNextHookEx(
|
|||
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);
|
||||
|
@ -680,6 +728,7 @@ UserCallNextHookEx(
|
|||
case WH_GETMESSAGE:
|
||||
{
|
||||
MSG Msg;
|
||||
|
||||
if (lParam)
|
||||
{
|
||||
_SEH2_TRY
|
||||
|
@ -687,7 +736,8 @@ UserCallNextHookEx(
|
|||
ProbeForRead((PVOID)lParam,
|
||||
sizeof(MSG),
|
||||
1);
|
||||
RtlCopyMemory( &Msg,
|
||||
|
||||
RtlCopyMemory(&Msg,
|
||||
(PVOID)lParam,
|
||||
sizeof(MSG));
|
||||
}
|
||||
|
@ -696,14 +746,17 @@ UserCallNextHookEx(
|
|||
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
|
||||
|
@ -711,6 +764,7 @@ UserCallNextHookEx(
|
|||
ProbeForWrite((PVOID)lParam,
|
||||
sizeof(MSG),
|
||||
1);
|
||||
|
||||
RtlCopyMemory((PVOID)lParam,
|
||||
&Msg,
|
||||
sizeof(MSG));
|
||||
|
@ -720,6 +774,7 @@ UserCallNextHookEx(
|
|||
BadChk = TRUE;
|
||||
}
|
||||
_SEH2_END;
|
||||
|
||||
if (BadChk)
|
||||
{
|
||||
DPRINT1("HOOK WH_GETMESSAGE write to lParam ERROR!\n");
|
||||
|
@ -733,15 +788,17 @@ UserCallNextHookEx(
|
|||
DPRINT1("HOOK WH_CBT!\n");
|
||||
switch (Code)
|
||||
{
|
||||
case HCBT_CREATEWND: // Use Ansi.
|
||||
case HCBT_CREATEWND: /* Use Ansi. */
|
||||
DPRINT1("HOOK HCBT_CREATEWND\n");
|
||||
// lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam);
|
||||
/* lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam); */
|
||||
break;
|
||||
|
||||
case HCBT_MOVESIZE:
|
||||
{
|
||||
RECTL rt;
|
||||
|
||||
DPRINT1("HOOK HCBT_MOVESIZE\n");
|
||||
|
||||
if (lParam)
|
||||
{
|
||||
_SEH2_TRY
|
||||
|
@ -749,7 +806,8 @@ UserCallNextHookEx(
|
|||
ProbeForRead((PVOID)lParam,
|
||||
sizeof(RECT),
|
||||
1);
|
||||
RtlCopyMemory( &rt,
|
||||
|
||||
RtlCopyMemory(&rt,
|
||||
(PVOID)lParam,
|
||||
sizeof(RECT));
|
||||
}
|
||||
|
@ -758,11 +816,13 @@ UserCallNextHookEx(
|
|||
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);
|
||||
|
@ -773,6 +833,7 @@ UserCallNextHookEx(
|
|||
case HCBT_ACTIVATE:
|
||||
{
|
||||
CBTACTIVATESTRUCT CbAs;
|
||||
|
||||
DPRINT1("HOOK HCBT_ACTIVATE\n");
|
||||
if (lParam)
|
||||
{
|
||||
|
@ -781,7 +842,8 @@ UserCallNextHookEx(
|
|||
ProbeForRead((PVOID)lParam,
|
||||
sizeof(CBTACTIVATESTRUCT),
|
||||
1);
|
||||
RtlCopyMemory( &CbAs,
|
||||
|
||||
RtlCopyMemory(&CbAs,
|
||||
(PVOID)lParam,
|
||||
sizeof(CBTACTIVATESTRUCT));
|
||||
}
|
||||
|
@ -790,20 +852,21 @@ UserCallNextHookEx(
|
|||
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.
|
||||
*/
|
||||
|
||||
/* The rest just use default. */
|
||||
default:
|
||||
DPRINT1("HOOK HCBT_ %d\n",Code);
|
||||
lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam);
|
||||
|
@ -815,6 +878,7 @@ UserCallNextHookEx(
|
|||
case WH_JOURNALRECORD:
|
||||
{
|
||||
EVENTMSG EventMsg;
|
||||
|
||||
if (lParam)
|
||||
{
|
||||
_SEH2_TRY
|
||||
|
@ -822,7 +886,8 @@ UserCallNextHookEx(
|
|||
ProbeForRead((PVOID)lParam,
|
||||
sizeof(EVENTMSG),
|
||||
1);
|
||||
RtlCopyMemory( &EventMsg,
|
||||
|
||||
RtlCopyMemory(&EventMsg,
|
||||
(PVOID)lParam,
|
||||
sizeof(EVENTMSG));
|
||||
}
|
||||
|
@ -831,14 +896,17 @@ UserCallNextHookEx(
|
|||
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
|
||||
|
@ -846,6 +914,7 @@ UserCallNextHookEx(
|
|||
ProbeForWrite((PVOID)lParam,
|
||||
sizeof(EVENTMSG),
|
||||
1);
|
||||
|
||||
RtlCopyMemory((PVOID)lParam,
|
||||
&EventMsg,
|
||||
sizeof(EVENTMSG));
|
||||
|
@ -855,6 +924,7 @@ UserCallNextHookEx(
|
|||
BadChk = TRUE;
|
||||
}
|
||||
_SEH2_END;
|
||||
|
||||
if (BadChk)
|
||||
{
|
||||
DPRINT1("HOOK WH_JOURNAL write to lParam ERROR!\n");
|
||||
|
@ -867,8 +937,9 @@ UserCallNextHookEx(
|
|||
case WH_DEBUG:
|
||||
lResult = IntCallDebugHook(Hook, Code, wParam, lParam);
|
||||
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_KEYBOARD:
|
||||
|
@ -880,13 +951,13 @@ UserCallNextHookEx(
|
|||
DPRINT1("Unsupported HOOK Id -> %d\n",Hook->HookId);
|
||||
break;
|
||||
}
|
||||
|
||||
return lResult;
|
||||
}
|
||||
|
||||
LRESULT
|
||||
APIENTRY
|
||||
NtUserCallNextHookEx(
|
||||
int Code,
|
||||
NtUserCallNextHookEx(int Code,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam,
|
||||
BOOL Ansi)
|
||||
|
@ -933,7 +1004,7 @@ NtUserCallNextHookEx(
|
|||
}
|
||||
|
||||
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);
|
||||
UserDereferenceObject(HookObj);
|
||||
|
||||
|
@ -947,20 +1018,20 @@ CLEANUP:
|
|||
|
||||
HHOOK
|
||||
APIENTRY
|
||||
NtUserSetWindowsHookAW(
|
||||
int idHook,
|
||||
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,
|
||||
NtUserSetWindowsHookEx(HINSTANCE Mod,
|
||||
PUNICODE_STRING UnsafeModuleName,
|
||||
DWORD ThreadId,
|
||||
int HookId,
|
||||
|
@ -1007,14 +1078,17 @@ NtUserSetWindowsHookEx(
|
|||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
||||
RETURN( NULL);
|
||||
}
|
||||
|
||||
Mod = NULL;
|
||||
Global = FALSE;
|
||||
if (! NT_SUCCESS(PsLookupThreadByThreadId((HANDLE) ThreadId, &Thread)))
|
||||
|
||||
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())
|
||||
|
@ -1031,12 +1105,13 @@ NtUserSetWindowsHookEx(
|
|||
{
|
||||
Mod = NULL;
|
||||
Thread = PsGetCurrentThread();
|
||||
|
||||
Status = ObReferenceObjectByPointer(Thread,
|
||||
THREAD_ALL_ACCESS,
|
||||
PsThreadType,
|
||||
KernelMode);
|
||||
|
||||
if (! NT_SUCCESS(Status))
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastNtError(Status);
|
||||
RETURN( (HANDLE) NULL);
|
||||
|
@ -1057,7 +1132,7 @@ NtUserSetWindowsHookEx(
|
|||
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_JOURNALPLAYBACK == HookId ||
|
||||
WH_JOURNALRECORD == HookId)
|
||||
|
@ -1079,7 +1154,7 @@ NtUserSetWindowsHookEx(
|
|||
0,
|
||||
&WinStaObj);
|
||||
|
||||
if (! NT_SUCCESS(Status))
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Dereference thread if needed */
|
||||
if (ThreadReferenced) ObDereferenceObject(Thread);
|
||||
|
@ -1105,7 +1180,7 @@ NtUserSetWindowsHookEx(
|
|||
if (NULL != Mod)
|
||||
{
|
||||
Status = MmCopyFromCaller(&ModuleName, UnsafeModuleName, sizeof(UNICODE_STRING));
|
||||
if (! NT_SUCCESS(Status))
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
UserDereferenceObject(Hook);
|
||||
IntRemoveHook(Hook, WinStaObj, FALSE);
|
||||
|
@ -1113,6 +1188,7 @@ NtUserSetWindowsHookEx(
|
|||
SetLastNtError(Status);
|
||||
RETURN( NULL);
|
||||
}
|
||||
|
||||
Hook->ModuleName.Buffer = ExAllocatePoolWithTag(PagedPool,
|
||||
ModuleName.MaximumLength,
|
||||
TAG_HOOK);
|
||||
|
@ -1124,11 +1200,12 @@ NtUserSetWindowsHookEx(
|
|||
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))
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ExFreePoolWithTag(Hook->ModuleName.Buffer, TAG_HOOK);
|
||||
UserDereferenceObject(Hook);
|
||||
|
@ -1137,6 +1214,7 @@ NtUserSetWindowsHookEx(
|
|||
SetLastNtError(Status);
|
||||
RETURN( NULL);
|
||||
}
|
||||
|
||||
Hook->ModuleName.Length = ModuleName.Length;
|
||||
/* make proc relative to the module base */
|
||||
Hook->Proc = (void *)((char *)HookProc - (char *)Mod);
|
||||
|
@ -1147,7 +1225,7 @@ NtUserSetWindowsHookEx(
|
|||
Hook->Ansi = Ansi;
|
||||
Handle = Hook->Self;
|
||||
|
||||
// Clear the client threads next hook.
|
||||
/* Clear the client threads next hook. */
|
||||
ClientInfo->phkCurrent = 0;
|
||||
|
||||
UserDereferenceObject(Hook);
|
||||
|
@ -1165,8 +1243,7 @@ CLEANUP:
|
|||
|
||||
BOOL
|
||||
APIENTRY
|
||||
NtUserUnhookWindowsHookEx(
|
||||
HHOOK Hook)
|
||||
NtUserUnhookWindowsHookEx(HHOOK Hook)
|
||||
{
|
||||
PWINSTATION_OBJECT WinStaObj;
|
||||
PHOOK HookObj;
|
||||
|
@ -1181,21 +1258,22 @@ NtUserUnhookWindowsHookEx(
|
|||
0,
|
||||
&WinStaObj);
|
||||
|
||||
if (! NT_SUCCESS(Status))
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastNtError(Status);
|
||||
RETURN( FALSE);
|
||||
}
|
||||
|
||||
// Status = UserReferenceObjectByHandle(gHandleTable, Hook,
|
||||
// otHookProc, (PVOID *) &HookObj);
|
||||
/* Status = UserReferenceObjectByHandle(gHandleTable, Hook,
|
||||
otHookProc, (PVOID *) &HookObj); */
|
||||
if (!(HookObj = IntGetHookObject(Hook)))
|
||||
{
|
||||
DPRINT1("Invalid handle passed to NtUserUnhookWindowsHookEx\n");
|
||||
ObDereferenceObject(WinStaObj);
|
||||
// SetLastNtError(Status);
|
||||
/* SetLastNtError(Status); */
|
||||
RETURN( FALSE);
|
||||
}
|
||||
|
||||
ASSERT(Hook == HookObj->Self);
|
||||
|
||||
IntRemoveHook(HookObj, WinStaObj, FALSE);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue