mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 16:36:07 +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;
|
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:
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue