- Add call window proc hooks.

svn path=/trunk/; revision=34766
This commit is contained in:
James Tabor 2008-07-25 01:02:17 +00:00
parent fc15d06386
commit c688d08ea3
4 changed files with 58 additions and 2 deletions

View file

@ -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:

View file

@ -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

View file

@ -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:

View file

@ -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,