diff --git a/reactos/dll/win32/user32/windows/hook.c b/reactos/dll/win32/user32/windows/hook.c index 2cb8c84cddb..1bba40d9161 100644 --- a/reactos/dll/win32/user32/windows/hook.c +++ b/reactos/dll/win32/user32/windows/hook.c @@ -423,6 +423,8 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) PMSLLHOOKSTRUCT MouseLlData; PMSG Msg; PMOUSEHOOKSTRUCT MHook; + PCWPSTRUCT CWP; + PCWPRETSTRUCT CWPR; Common = (PHOOKPROC_CALLBACK_ARGUMENTS) Arguments; @@ -507,6 +509,14 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) MHook = (PMOUSEHOOKSTRUCT)((PCHAR) Common + Common->lParam); Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) MHook); break; + case WH_CALLWNDPROC: + CWP = (PCWPSTRUCT)((PCHAR) Common + Common->lParam); + Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) CWP); + break; + case WH_CALLWNDPROCRET: + CWPR = (PCWPRETSTRUCT)((PCHAR) Common + Common->lParam); + Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) CWPR); + break; case WH_MSGFILTER: case WH_SYSMSGFILTER: case WH_GETMESSAGE: diff --git a/reactos/include/psdk/winuser.h b/reactos/include/psdk/winuser.h index bb87c61f3d5..13f41756ad0 100644 --- a/reactos/include/psdk/winuser.h +++ b/reactos/include/psdk/winuser.h @@ -1170,6 +1170,12 @@ extern "C" { #define SMTO_ABORTIFHUNG 2 #define SMTO_BLOCK 1 #define SMTO_NORMAL 0 +#if (WINVER >= 0x0500) +#define SMTO_NOTIMEOUTIFNOTHUNG 8 +#endif +#if (WINVER >= 0x0600) +#define SMTO_ERRORONEXIT 32 +#endif #define SIF_ALL 23 #define SIF_PAGE 2 #define SIF_POS 4 diff --git a/reactos/subsystems/win32/win32k/ntuser/callback.c b/reactos/subsystems/win32/win32k/ntuser/callback.c index 30510e3bb79..fbb2f856e3e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callback.c +++ b/reactos/subsystems/win32/win32k/ntuser/callback.c @@ -382,6 +382,12 @@ co_IntCallHookProc(INT HookId, case WH_MOUSE: ArgumentLength += sizeof(MOUSEHOOKSTRUCT); break; + case WH_CALLWNDPROC: + ArgumentLength += sizeof(CWPSTRUCT); + break; + case WH_CALLWNDPROCRET: + ArgumentLength += sizeof(CWPRETSTRUCT); + break; case WH_MSGFILTER: case WH_SYSMSGFILTER: case WH_GETMESSAGE: @@ -452,6 +458,14 @@ co_IntCallHookProc(INT HookId, RtlCopyMemory(Extra, (PVOID) lParam, sizeof(MOUSEHOOKSTRUCT)); Common->lParam = (LPARAM) (Extra - (PCHAR) Common); break; + case WH_CALLWNDPROC: + RtlCopyMemory(Extra, (PVOID) lParam, sizeof(CWPSTRUCT)); + Common->lParam = (LPARAM) (Extra - (PCHAR) Common); + break; + case WH_CALLWNDPROCRET: + RtlCopyMemory(Extra, (PVOID) lParam, sizeof(CWPRETSTRUCT)); + Common->lParam = (LPARAM) (Extra - (PCHAR) Common); + break; case WH_MSGFILTER: case WH_SYSMSGFILTER: case WH_GETMESSAGE: diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 6dde2968b99..abb3e4129c6 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1388,6 +1388,7 @@ co_IntSendMessageTimeoutSingle(HWND hWnd, PW32THREAD Win32Thread; DECLARE_RETURN(LRESULT); USER_REFERENCE_ENTRY Ref; + BOOL SameThread = FALSE; /* FIXME: Call hooks. */ if (!(Window = UserGetWindowObject(hWnd))) @@ -1398,7 +1399,7 @@ co_IntSendMessageTimeoutSingle(HWND hWnd, UserRefObjectCo(Window, &Ref); Win32Thread = PsGetCurrentThreadWin32Thread(); - + if (NULL != Win32Thread && Window->MessageQueue == Win32Thread->MessageQueue) { @@ -1425,6 +1426,20 @@ co_IntSendMessageTimeoutSingle(HWND hWnd, RETURN( FALSE); } + if (Window->ti == Win32Thread->ThreadInfo) + SameThread = TRUE; + + if ((!SameThread && (Window->ti->Hooks & HOOKID_TO_FLAG(WH_CALLWNDPROC))) || + (SameThread && ISITHOOKED(WH_CALLWNDPROC)) ) + { + CWPSTRUCT CWP; + CWP.hwnd = hWnd; + CWP.message = Msg; + CWP.wParam = wParam; + CWP.lParam = lParam; + co_HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, SameThread, (LPARAM)&CWP ); + } + Result = (ULONG_PTR)co_IntCallWindowProc(Window->Wnd->WndProc, !Window->Wnd->Unicode, hWnd, Msg, wParam, lParamPacked,lParamBufferSize); @@ -1432,6 +1447,18 @@ co_IntSendMessageTimeoutSingle(HWND hWnd, { *uResult = Result; } + + if ((!SameThread && (Window->ti->Hooks & HOOKID_TO_FLAG(WH_CALLWNDPROC))) || + (SameThread && ISITHOOKED(WH_CALLWNDPROCRET)) ) + { + CWPRETSTRUCT CWPR; + CWPR.hwnd = hWnd; + CWPR.message = Msg; + CWPR.wParam = wParam; + CWPR.lParam = lParam; + CWPR.lResult = Result; + co_HOOK_CallHooks( WH_CALLWNDPROCRET, HC_ACTION, SameThread, (LPARAM)&CWPR ); + } if (! NT_SUCCESS(UnpackParam(lParamPacked, Msg, wParam, lParam))) { @@ -1957,7 +1984,6 @@ NtUserMessageCall( } else if (parm->flags & BSF_NOTIMEOUTIFNOTHUNG) { -#define SMTO_NOTIMEOUTIFNOTHUNG 0x0008 co_IntSendMessageTimeout( HWND_BROADCAST, Msg, wParam,