mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 12:23:31 +00:00
- 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
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user