mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 17:03:02 +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 */
|
/* 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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue