mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 06:15:52 +00:00
[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:
parent
851c1c1742
commit
f605d2c596
3 changed files with 31 additions and 23 deletions
|
@ -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:
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue