From d0884129e598fa81fffa248b72c75c2d18a780a6 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 12 Apr 2008 20:53:08 +0000 Subject: [PATCH] More hook implementations. svn path=/trunk/; revision=32931 --- reactos/dll/win32/user32/windows/hook.c | 49 +++++++++++++++- reactos/include/reactos/win32k/ntuser.h | 18 ++++-- reactos/subsystems/win32/win32k/ntuser/hook.c | 58 ++++++++++++++++--- 3 files changed, 109 insertions(+), 16 deletions(-) diff --git a/reactos/dll/win32/user32/windows/hook.c b/reactos/dll/win32/user32/windows/hook.c index 329c9ac8135..19c49b7b486 100644 --- a/reactos/dll/win32/user32/windows/hook.c +++ b/reactos/dll/win32/user32/windows/hook.c @@ -34,6 +34,44 @@ WINE_DEFAULT_DEBUG_CHANNEL(user32); +DWORD Bogus_SrvEventActivity = 0; // Fixme, need to ref to share data. + +/* PRIVATE FUNCTIONS *********************************************************/ + +static +DWORD +FASTCALL +GetMaskFromEvent(DWORD Event) +{ + DWORD Ret = 0; + + if ( Event > EVENT_OBJECT_STATECHANGE ) + { + if ( Event == EVENT_OBJECT_LOCATIONCHANGE ) return SRV_EVENT_LOCATIONCHANGE; + if ( Event == EVENT_OBJECT_NAMECHANGE ) return SRV_EVENT_NAMECHANGE; + if ( Event == EVENT_OBJECT_VALUECHANGE ) return SRV_EVENT_VALUECHANGE; + return SRV_EVENT_CREATE; + } + + if ( Event == EVENT_OBJECT_STATECHANGE ) return SRV_EVENT_STATECHANGE; + + Ret = SRV_EVENT_RUNNING; + + if ( Event < EVENT_SYSTEM_MENUSTART ) return SRV_EVENT_CREATE; + + if ( Event <= EVENT_SYSTEM_MENUPOPUPEND ) + { + Ret = SRV_EVENT_MENU; + } + else + { + if ( Event <= EVENT_CONSOLE_CARET-1 ) return SRV_EVENT_CREATE; + if ( Event <= EVENT_CONSOLE_END_APPLICATION ) return SRV_EVENT_END_APPLICATION; + if ( Event != EVENT_OBJECT_FOCUS ) return SRV_EVENT_CREATE; + } + return Ret; +} + /* FUNCTIONS *****************************************************************/ /* @@ -221,7 +259,7 @@ UnhookWindowsHook ( int nCode, HOOKPROC pfnFilterProc ) } /* - * @unimplemented + * @implemented */ VOID STDCALL @@ -232,7 +270,11 @@ NotifyWinEvent( LONG idChild ) { - NtUserNotifyWinEvent(event, hwnd, idObject, idChild); +// "Servers call NotifyWinEvent to announce the event to the system after the +// event has occurred; they must never notify the system of an event before +// the event has occurred." msdn on NotifyWinEvent. + if (Bogus_SrvEventActivity & GetMaskFromEvent(event)) // Check to see. + NtUserNotifyWinEvent(event, hwnd, idObject, idChild); } /* @@ -277,7 +319,7 @@ SetWinEventHook( } /* - * @unimplemented + * @implemented */ BOOL STDCALL @@ -286,6 +328,7 @@ IsWinEventHookInstalled( { if ((PW32THREADINFO)NtCurrentTeb()->Win32ThreadInfo) { + return (Bogus_SrvEventActivity & GetMaskFromEvent(event)) != 0; } return FALSE; } diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index cf9b1d366c6..2ddeac5f138 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -242,6 +242,16 @@ typedef struct _W32CLIENTINFO #define GetWin32ClientInfo() (PW32CLIENTINFO)(NtCurrentTeb()->Win32ClientInfo) +// Server event activity bits. +#define SRV_EVENT_MENU 0x0001 +#define SRV_EVENT_END_APPLICATION 0x0002 +#define SRV_EVENT_RUNNING 0x0004 +#define SRV_EVENT_NAMECHANGE 0x0008 +#define SRV_EVENT_VALUECHANGE 0x0010 +#define SRV_EVENT_STATECHANGE 0x0020 +#define SRV_EVENT_LOCATIONCHANGE 0x0040 +#define SRV_EVENT_CREATE 0x8000 + PW32THREADINFO GetW32ThreadInfo(VOID); PW32PROCESSINFO GetW32ProcessInfo(VOID); @@ -2205,12 +2215,12 @@ NtUserSetWindowRgn( HRGN hRgn, BOOL bRedraw); -DWORD +HHOOK NTAPI NtUserSetWindowsHookAW( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2); + int idHook, + HOOKPROC lpfn, + BOOL Ansi); HHOOK NTAPI diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index 9be66f5ae27..315ca644237 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -16,8 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id$ - * +/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * PURPOSE: Window hooks @@ -38,6 +37,44 @@ #define HOOKID_TO_FLAG(HookId) (1 << ((HookId) + 1)) static PHOOKTABLE GlobalHooks; +DWORD Bogus_SrvEventActivity = 0; + + +/* PRIVATE FUNCTIONS *********************************************************/ + +static +DWORD +FASTCALL +GetMaskFromEvent(DWORD Event) +{ + DWORD Ret = 0; + + if ( Event > EVENT_OBJECT_STATECHANGE ) + { + if ( Event == EVENT_OBJECT_LOCATIONCHANGE ) return SRV_EVENT_LOCATIONCHANGE; + if ( Event == EVENT_OBJECT_NAMECHANGE ) return SRV_EVENT_NAMECHANGE; + if ( Event == EVENT_OBJECT_VALUECHANGE ) return SRV_EVENT_VALUECHANGE; + return SRV_EVENT_CREATE; + } + + if ( Event == EVENT_OBJECT_STATECHANGE ) return SRV_EVENT_STATECHANGE; + + Ret = SRV_EVENT_RUNNING; + + if ( Event < EVENT_SYSTEM_MENUSTART ) return SRV_EVENT_CREATE; + + if ( Event <= EVENT_SYSTEM_MENUPOPUPEND ) + { + Ret = SRV_EVENT_MENU; + } + else + { + if ( Event <= EVENT_CONSOLE_CARET-1 ) return SRV_EVENT_CREATE; + if ( Event <= EVENT_CONSOLE_END_APPLICATION ) return SRV_EVENT_END_APPLICATION; + if ( Event != EVENT_OBJECT_FOCUS ) return SRV_EVENT_CREATE; + } + return Ret; +} /* create a new hook table */ static PHOOKTABLE @@ -485,16 +522,16 @@ CLEANUP: END_CLEANUP; } -DWORD +HHOOK STDCALL NtUserSetWindowsHookAW( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2) + int idHook, + HOOKPROC lpfn, + BOOL Ansi) { - UNIMPLEMENTED - - return 0; + UNICODE_STRING USModuleName; + RtlInitUnicodeString(&USModuleName, NULL); + return NtUserSetWindowsHookEx(NULL, &USModuleName, 0, idHook, lpfn, Ansi); } HHOOK @@ -709,6 +746,9 @@ NtUserSetWinEventHook( DWORD idThread, UINT dwflags) { + + Bogus_SrvEventActivity |= GetMaskFromEvent(eventMin); // Fake it out for now. + Bogus_SrvEventActivity &= ~GetMaskFromEvent(eventMin); UNIMPLEMENTED return 0;