From 0868fdb45d4cd447a8f534575a370c955940f1f6 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 22 Jul 2008 23:46:31 +0000 Subject: [PATCH] - Fixed CallNextHookEx, now we do make the callback. Q, how to reload it at the end of the list? Fix for bug 3549. - Tested with Opera 9.51(still breaks when getting the page see bug 3465), FF, Seamonkey, Abiword, and the rest of our applications. svn path=/trunk/; revision=34691 --- reactos/dll/win32/user32/windows/hook.c | 16 ++++----- .../subsystems/win32/win32k/ntuser/callback.c | 2 +- reactos/subsystems/win32/win32k/ntuser/hook.c | 35 ++++++++++++------- .../subsystems/win32/win32k/ntuser/message.c | 4 +-- 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/reactos/dll/win32/user32/windows/hook.c b/reactos/dll/win32/user32/windows/hook.c index ae1fb21aa9d..d54eb5a2f53 100644 --- a/reactos/dll/win32/user32/windows/hook.c +++ b/reactos/dll/win32/user32/windows/hook.c @@ -183,30 +183,28 @@ CallMsgFilterW( /* - * @unimplemented + * @implemented */ LRESULT STDCALL CallNextHookEx( - HHOOK Hook, + HHOOK Hook, // Windows NT/XP/2003: Ignored. int Code, WPARAM wParam, LPARAM lParam) { PW32CLIENTINFO ClientInfo; - PHOOK pHook; DWORD Flags, Save; + PHOOK pHook; LRESULT lResult = 0; GetConnected(); ClientInfo = GetWin32ClientInfo(); - pHook = ValidateHandle(Hook, VALIDATE_TYPE_HOOK); - - if (!pHook) return 0; - - ClientInfo->phkCurrent = (PHOOK)pHook->Self; // Pass this over to the kernel. + if (!ClientInfo->phkCurrent) return 0; + + pHook = SharedPtrToUser(ClientInfo->phkCurrent); if (pHook->HookId == WH_CALLWNDPROC || pHook->HookId == WH_CALLWNDPROCRET) { @@ -508,7 +506,7 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) case WH_SYSMSGFILTER: case WH_GETMESSAGE: Msg = (PMSG)((PCHAR) Common + Common->lParam); - FIXME("UHOOK Memory: %x: %x\n",Common, Msg); +// FIXME("UHOOK Memory: %x: %x\n",Common, Msg); Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) Msg); break; default: diff --git a/reactos/subsystems/win32/win32k/ntuser/callback.c b/reactos/subsystems/win32/win32k/ntuser/callback.c index b57fffd3283..362bc406f83 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callback.c +++ b/reactos/subsystems/win32/win32k/ntuser/callback.c @@ -449,7 +449,7 @@ co_IntCallHookProc(INT HookId, case WH_GETMESSAGE: RtlCopyMemory(Extra, (PVOID) lParam, sizeof(MSG)); Common->lParam = (LPARAM) (Extra - (PCHAR) Common); - DPRINT1("KHOOK Memory: %x\n",Common); +// DPRINT1("KHOOK Memory: %x\n",Common); break; // case WH_SHELL: // Extra = lParam; diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index bc890d79c32..8562260314e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -731,7 +731,6 @@ NtUserCallNextHookEx( LPARAM lParam, BOOL Ansi) { - HHOOK Hook; PHOOK HookObj, NextObj; PW32CLIENTINFO ClientInfo; PWINSTATION_OBJECT WinStaObj; @@ -758,14 +757,7 @@ NtUserCallNextHookEx( ClientInfo = GetWin32ClientInfo(); - Hook = (HHOOK)ClientInfo->phkCurrent; - - if (!(HookObj = IntGetHookObject(Hook))) - { - RETURN(0); - } - - ASSERT(Hook == HookObj->Self); + HookObj = ClientInfo->phkCurrent; // Use this one set from SetWindowHook. HookId = HookObj->HookId; Ansi = HookObj->Ansi; @@ -784,9 +776,12 @@ NtUserCallNextHookEx( { lResult = UserCallNextHookEx( HookId, Code, wParam, lParam, Ansi); + ClientInfo->phkCurrent = NextObj; + if (lResult == 0) RETURN( 0); RETURN( (LRESULT)NextObj); } + ClientInfo->phkCurrent = NextObj; RETURN( 0); @@ -819,6 +814,7 @@ NtUserSetWindowsHookEx( BOOL Ansi) { PWINSTATION_OBJECT WinStaObj; + PW32CLIENTINFO ClientInfo; BOOLEAN Global; PETHREAD Thread; PHOOK Hook; @@ -836,6 +832,8 @@ NtUserSetWindowsHookEx( RETURN( NULL); } + ClientInfo = GetWin32ClientInfo(); + if (ThreadId) /* thread-local hook */ { if (HookId == WH_JOURNALRECORD || @@ -894,9 +892,19 @@ NtUserSetWindowsHookEx( } /* We only (partially) support local WH_CBT hooks and - * WH_KEYBOARD_LL/WH_MOUSE_LL hooks for now */ - if ((WH_CBT != HookId || Global) - && WH_KEYBOARD_LL != HookId && WH_MOUSE_LL != HookId && WH_GETMESSAGE != HookId) + * WH_KEYBOARD_LL, WH_MOUSE_LL and WH_GETMESSAGE hooks for now + */ + if (WH_CALLWNDPROC == HookId && + WH_CALLWNDPROCRET == HookId && + WH_DEBUG == HookId && + WH_JOURNALPLAYBACK == HookId && + WH_JOURNALRECORD == HookId && + WH_FOREGROUNDIDLE == HookId && + WH_KEYBOARD == HookId && + WH_MOUSE == HookId && + WH_MSGFILTER == HookId && + WH_SYSMSGFILTER == HookId && + WH_SHELL == HookId) { #if 0 /* Removed to get winEmbed working again */ UNIMPLEMENTED @@ -997,6 +1005,9 @@ NtUserSetWindowsHookEx( Hook->Ansi = Ansi; Handle = Hook->Self; +// Set the client threads next hook based on the hooks type. + ClientInfo->phkCurrent = IntGetNextHook( Hook); + UserDereferenceObject(Hook); ObDereferenceObject(WinStaObj); diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index deefa47cc28..159d12788cd 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -818,8 +818,8 @@ MsgExit: // be returned by the GetMessage or PeekMessage function. if(ISITHOOKED(WH_GETMESSAGE)) { - DPRINT1("Peek WH_GETMESSAGE -> %x\n",&Msg); - co_HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, RemoveMsg & PM_REMOVE, (LPARAM)&Msg); + //DPRINT1("Peek WH_GETMESSAGE -> %x\n",&Msg); + co_HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, RemoveMsg & PM_REMOVE, (LPARAM)&Msg->Msg); } return TRUE; }