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

View file

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

View file

@ -798,7 +798,7 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
KbdHookData.dwExtraInfo = 0;
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);
if (Entered) UserLeave();
return;