[Win32k|User32]

- Fix for DosBOX. See bug 5670 for more details. Added more data copies in user32 hook.c.

svn path=/trunk/; revision=49301
This commit is contained in:
James Tabor 2010-10-27 01:56:56 +00:00
parent 851c1c1742
commit f605d2c596
3 changed files with 31 additions and 23 deletions

View file

@ -452,12 +452,12 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
CREATESTRUCTW Csw; CREATESTRUCTW Csw;
CBT_CREATEWNDW CbtCreatewndw; CBT_CREATEWNDW CbtCreatewndw;
PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra = NULL; PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra = NULL;
PKBDLLHOOKSTRUCT pKeyboardLlData; KBDLLHOOKSTRUCT KeyboardLlData, *pKeyboardLlData;
PMSLLHOOKSTRUCT pMouseLlData; MSLLHOOKSTRUCT MouseLlData, *pMouseLlData;
PMSG pMsg; MSG Msg, *pMsg;
PMOUSEHOOKSTRUCT pMHook; PMOUSEHOOKSTRUCT pMHook;
PCWPSTRUCT pCWP; CWPSTRUCT CWP, *pCWP;
PCWPRETSTRUCT pCWPR; CWPRETSTRUCT CWPR, *pCWPR;
PRECTL prl; PRECTL prl;
LPCBTACTIVATESTRUCT pcbtas; LPCBTACTIVATESTRUCT pcbtas;
WPARAM wParam = 0; WPARAM wParam = 0;
@ -541,11 +541,13 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
case WH_KEYBOARD_LL: case WH_KEYBOARD_LL:
ERR("WH_KEYBOARD_LL: Code %d, wParam %d\n",Common->Code,Common->wParam); ERR("WH_KEYBOARD_LL: Code %d, wParam %d\n",Common->Code,Common->wParam);
pKeyboardLlData = (PKBDLLHOOKSTRUCT)((PCHAR) Common + Common->lParam); pKeyboardLlData = (PKBDLLHOOKSTRUCT)((PCHAR) Common + Common->lParam);
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) pKeyboardLlData); RtlCopyMemory(&KeyboardLlData, pKeyboardLlData, sizeof(KBDLLHOOKSTRUCT));
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) &KeyboardLlData);
break; break;
case WH_MOUSE_LL: case WH_MOUSE_LL:
pMouseLlData = (PMSLLHOOKSTRUCT)((PCHAR) Common + Common->lParam); pMouseLlData = (PMSLLHOOKSTRUCT)((PCHAR) Common + Common->lParam);
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) pMouseLlData); RtlCopyMemory(&MouseLlData, pMouseLlData, sizeof(MSLLHOOKSTRUCT));
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) &MouseLlData);
break; break;
case WH_MOUSE: /* SEH support */ case WH_MOUSE: /* SEH support */
pMHook = (PMOUSEHOOKSTRUCT)((PCHAR) Common + Common->lParam); pMHook = (PMOUSEHOOKSTRUCT)((PCHAR) Common + Common->lParam);
@ -560,26 +562,33 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
_SEH2_END; _SEH2_END;
break; break;
case WH_CALLWNDPROC: case WH_CALLWNDPROC:
ERR("WH_CALLWNDPROC: Code %d, wParam %d\n",Common->Code,Common->wParam);
pCWP = (PCWPSTRUCT)((PCHAR) Common + Common->lParam); pCWP = (PCWPSTRUCT)((PCHAR) Common + Common->lParam);
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) pCWP); RtlCopyMemory(&CWP, pCWP, sizeof(CWPSTRUCT));
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) &CWP);
break; break;
case WH_CALLWNDPROCRET: case WH_CALLWNDPROCRET:
pCWPR = (PCWPRETSTRUCT)((PCHAR) Common + Common->lParam); pCWPR = (PCWPRETSTRUCT)((PCHAR) Common + Common->lParam);
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) pCWPR); RtlCopyMemory(&CWPR, pCWPR, sizeof(CWPRETSTRUCT));
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) &CWPR);
break; break;
case WH_MSGFILTER: /* All SEH support */ case WH_MSGFILTER: /* All SEH support */
ERR("WH_MSGFILTER: Code %d, wParam %d\n",Common->Code,Common->wParam);
case WH_SYSMSGFILTER: case WH_SYSMSGFILTER:
case WH_GETMESSAGE: case WH_GETMESSAGE:
pMsg = (PMSG)((PCHAR) Common + Common->lParam); pMsg = (PMSG)((PCHAR) Common + Common->lParam);
RtlCopyMemory(&Msg, pMsg, sizeof(MSG));
_SEH2_TRY _SEH2_TRY
{ {
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) pMsg); Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) &Msg);
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
Hit = TRUE; Hit = TRUE;
} }
_SEH2_END; _SEH2_END;
if (!Hit && Common->HookId == WH_GETMESSAGE)
RtlCopyMemory(pMsg, &Msg, sizeof(MSG));
break; break;
case WH_FOREGROUNDIDLE: /* <-- SEH support */ case WH_FOREGROUNDIDLE: /* <-- SEH support */
case WH_KEYBOARD: case WH_KEYBOARD:

View file

@ -726,7 +726,7 @@ IntGetNextHook(PHOOK Hook)
pti = PsGetCurrentThreadWin32Thread(); pti = PsGetCurrentThreadWin32Thread();
Elem = Hook->Chain.Flink; Elem = Hook->Chain.Flink;
if (Elem != &pti->pDeskInfo->aphkStart[HOOKID_TO_INDEX(HookId)]) if (Elem != &pti->rpdesk->pDeskInfo->aphkStart[HOOKID_TO_INDEX(HookId)])
return CONTAINING_RECORD(Elem, HOOK, Chain); return CONTAINING_RECORD(Elem, HOOK, Chain);
} }
return NULL; return NULL;
@ -785,10 +785,11 @@ IntRemoveHook(PHOOK Hook)
pti = PsGetCurrentThreadWin32Thread(); pti = PsGetCurrentThreadWin32Thread();
if ( pti->pDeskInfo && if ( pti->rpdesk &&
IsListEmpty(&pti->pDeskInfo->aphkStart[HOOKID_TO_INDEX(HookId)]) ) pti->rpdesk->pDeskInfo &&
IsListEmpty(&pti->rpdesk->pDeskInfo->aphkStart[HOOKID_TO_INDEX(HookId)]) )
{ {
pti->pDeskInfo->fsHooks &= ~HOOKID_TO_FLAG(HookId); pti->rpdesk->pDeskInfo->fsHooks &= ~HOOKID_TO_FLAG(HookId);
return TRUE; return TRUE;
} }
} }
@ -830,7 +831,7 @@ HOOK_DestroyThreadHooks(PETHREAD Thread)
pti->fsHooks = 0; pti->fsHooks = 0;
} }
// Global search based on Thread and cleanup. // Global search based on Thread and cleanup.
if (pti->pDeskInfo->fsHooks) if (pti->rpdesk->pDeskInfo->fsHooks)
{ {
for (HookId = WH_MINHOOK; HookId <= WH_MAXHOOK; HookId++) for (HookId = WH_MINHOOK; HookId <= WH_MAXHOOK; HookId++)
{ {
@ -876,7 +877,7 @@ co_HOOK_CallHooks( INT HookId,
ASSERT(WH_MINHOOK <= HookId && HookId <= WH_MAXHOOK); ASSERT(WH_MINHOOK <= HookId && HookId <= WH_MAXHOOK);
pti = PsGetCurrentThreadWin32Thread(); pti = PsGetCurrentThreadWin32Thread();
if (!pti || !pti->pDeskInfo) if (!pti || !pti->rpdesk || !pti->rpdesk->pDeskInfo)
goto Exit; // Must have a desktop running for hooks. goto Exit; // Must have a desktop running for hooks.
if ( pti->TIF_flags & TIF_INCLEANUP) if ( pti->TIF_flags & TIF_INCLEANUP)
@ -888,7 +889,7 @@ co_HOOK_CallHooks( INT HookId,
Local = TRUE; Local = TRUE;
} }
if ( pti->pDeskInfo->fsHooks & HOOKID_TO_FLAG(HookId) ) if ( pti->rpdesk->pDeskInfo->fsHooks & HOOKID_TO_FLAG(HookId) )
{ {
DPRINT("Global Hooker %d\n", HookId); DPRINT("Global Hooker %d\n", HookId);
Global = TRUE; Global = TRUE;
@ -897,7 +898,7 @@ co_HOOK_CallHooks( INT HookId,
if ( !Local && !Global ) goto Exit; // No work! if ( !Local && !Global ) goto Exit; // No work!
pLLE = &pti->aphkStart[HOOKID_TO_INDEX(HookId)]; pLLE = &pti->aphkStart[HOOKID_TO_INDEX(HookId)];
pGLE = &pti->pDeskInfo->aphkStart[HOOKID_TO_INDEX(HookId)]; pGLE = &pti->rpdesk->pDeskInfo->aphkStart[HOOKID_TO_INDEX(HookId)];
Hook = NULL; Hook = NULL;
/* SetWindowHookEx sorts out the Thread issue by placing the Hook to /* SetWindowHookEx sorts out the Thread issue by placing the Hook to
@ -987,14 +988,12 @@ co_HOOK_CallHooks( INT HookId,
ObReferenceObject(ptiHook->pEThread); ObReferenceObject(ptiHook->pEThread);
if (ptiHook != pti ) if (ptiHook != pti )
{ {
if (HookId == WH_KEYBOARD_LL){ DPRINT("\nGlobal Hook posting to another Thread! %d\n",HookId );
DPRINT1("\nGlobal Hook posting to another Thread! %d\n",HookId );}
Result = IntCallLowLevelHook(Hook, Code, wParam, lParam); Result = IntCallLowLevelHook(Hook, Code, wParam, lParam);
} }
else else
{ /* Make the direct call. */ { /* Make the direct call. */
if (HookId == WH_KEYBOARD_LL){ DPRINT("\nLocal Hook calling to Thread! %d\n",HookId );
DPRINT1("\nLocal Hook calling to Thread! %d\n",HookId );}
Result = co_IntCallHookProc( HookId, Result = co_IntCallHookProc( HookId,
Code, Code,
wParam, wParam,

View file

@ -798,7 +798,7 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
KbdHookData.dwExtraInfo = 0; KbdHookData.dwExtraInfo = 0;
if (co_HOOK_CallHooks(WH_KEYBOARD_LL, HC_ACTION, Msg.message, (LPARAM) &KbdHookData)) if (co_HOOK_CallHooks(WH_KEYBOARD_LL, HC_ACTION, Msg.message, (LPARAM) &KbdHookData))
{ {
DPRINT("Kbd msg %d wParam %d lParam 0x%08x dropped by WH_KEYBOARD_LL hook\n", DPRINT1("Kbd msg %d wParam %d lParam 0x%08x dropped by WH_KEYBOARD_LL hook\n",
Msg.message, Msg.wParam, Msg.lParam); Msg.message, Msg.wParam, Msg.lParam);
if (Entered) UserLeave(); if (Entered) UserLeave();
return; return;