mirror of
https://github.com/reactos/reactos.git
synced 2025-04-20 20:36:35 +00:00
[Win32k]
- Tweaks to hook and event timeouts. Increase performance with DOSBox when using mouse and keyboard. svn path=/trunk/; revision=49605
This commit is contained in:
parent
7a5f137974
commit
3d573b97a6
2 changed files with 38 additions and 61 deletions
|
@ -120,7 +120,7 @@ IntCallLowLevelEvent( PEVENTHOOK pEH,
|
||||||
event,
|
event,
|
||||||
0,
|
0,
|
||||||
(LPARAM)pEP,
|
(LPARAM)pEP,
|
||||||
5000,
|
300,
|
||||||
TRUE,
|
TRUE,
|
||||||
MSQ_ISEVENT,
|
MSQ_ISEVENT,
|
||||||
&uResult);
|
&uResult);
|
||||||
|
|
|
@ -38,6 +38,8 @@ IntCallLowLevelHook( PHOOK Hook,
|
||||||
PTHREADINFO pti;
|
PTHREADINFO pti;
|
||||||
PHOOKPACK pHP;
|
PHOOKPACK pHP;
|
||||||
INT Size;
|
INT Size;
|
||||||
|
UINT uTimeout = 300;
|
||||||
|
BOOL Block = FALSE;
|
||||||
ULONG_PTR uResult = 0;
|
ULONG_PTR uResult = 0;
|
||||||
|
|
||||||
if (Hook->Thread)
|
if (Hook->Thread)
|
||||||
|
@ -53,25 +55,13 @@ IntCallLowLevelHook( PHOOK Hook,
|
||||||
pHP->pHookStructs = NULL;
|
pHP->pHookStructs = NULL;
|
||||||
Size = 0;
|
Size = 0;
|
||||||
|
|
||||||
// Once the rest is enabled again, This prevents stack corruption from the caller.
|
// This prevents stack corruption from the caller.
|
||||||
switch(Hook->HookId)
|
switch(Hook->HookId)
|
||||||
{
|
{
|
||||||
case WH_CBT:
|
case WH_JOURNALPLAYBACK:
|
||||||
switch(Code)
|
case WH_JOURNALRECORD:
|
||||||
{
|
uTimeout = 0;
|
||||||
case HCBT_CREATEWND:
|
Size = sizeof(EVENTMSG);
|
||||||
Size = sizeof(CBT_CREATEWNDW);
|
|
||||||
break;
|
|
||||||
case HCBT_MOVESIZE:
|
|
||||||
Size = sizeof(RECTL);
|
|
||||||
break;
|
|
||||||
case HCBT_ACTIVATE:
|
|
||||||
Size = sizeof(CBTACTIVATESTRUCT);
|
|
||||||
break;
|
|
||||||
case HCBT_CLICKSKIPPED:
|
|
||||||
Size = sizeof(MOUSEHOOKSTRUCT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case WH_KEYBOARD_LL:
|
case WH_KEYBOARD_LL:
|
||||||
Size = sizeof(KBDLLHOOKSTRUCT);
|
Size = sizeof(KBDLLHOOKSTRUCT);
|
||||||
|
@ -80,18 +70,14 @@ IntCallLowLevelHook( PHOOK Hook,
|
||||||
Size = sizeof(MSLLHOOKSTRUCT);
|
Size = sizeof(MSLLHOOKSTRUCT);
|
||||||
break;
|
break;
|
||||||
case WH_MOUSE:
|
case WH_MOUSE:
|
||||||
|
uTimeout = 200;
|
||||||
|
Block = TRUE;
|
||||||
Size = sizeof(MOUSEHOOKSTRUCT);
|
Size = sizeof(MOUSEHOOKSTRUCT);
|
||||||
break;
|
break;
|
||||||
case WH_CALLWNDPROC:
|
case WH_KEYBOARD:
|
||||||
Size = sizeof(CWPSTRUCT);
|
uTimeout = 200;
|
||||||
break;
|
Block = TRUE;
|
||||||
case WH_CALLWNDPROCRET:
|
Size = sizeof(KBDLLHOOKSTRUCT);
|
||||||
Size = sizeof(CWPRETSTRUCT);
|
|
||||||
break;
|
|
||||||
case WH_MSGFILTER:
|
|
||||||
case WH_SYSMSGFILTER:
|
|
||||||
case WH_GETMESSAGE:
|
|
||||||
Size = sizeof(MSG);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,9 +93,9 @@ IntCallLowLevelHook( PHOOK Hook,
|
||||||
IntToPtr(Code), // hWnd
|
IntToPtr(Code), // hWnd
|
||||||
Hook->HookId, // Msg
|
Hook->HookId, // Msg
|
||||||
wParam,
|
wParam,
|
||||||
(LPARAM)pHP,
|
(LPARAM)pHP,
|
||||||
5000,
|
uTimeout,
|
||||||
TRUE,
|
Block,
|
||||||
MSQ_ISHOOK,
|
MSQ_ISHOOK,
|
||||||
&uResult);
|
&uResult);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
@ -141,25 +127,12 @@ co_CallHook( INT HookId,
|
||||||
|
|
||||||
switch(HookId)
|
switch(HookId)
|
||||||
{
|
{
|
||||||
case WH_CBT:
|
case WH_JOURNALPLAYBACK:
|
||||||
switch(Code)
|
case WH_JOURNALRECORD:
|
||||||
{
|
case WH_KEYBOARD:
|
||||||
case HCBT_CREATEWND:
|
|
||||||
case HCBT_MOVESIZE:
|
|
||||||
case HCBT_ACTIVATE:
|
|
||||||
case HCBT_CLICKSKIPPED:
|
|
||||||
lParam = (LPARAM)pHP->pHookStructs;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WH_KEYBOARD_LL:
|
case WH_KEYBOARD_LL:
|
||||||
case WH_MOUSE_LL:
|
case WH_MOUSE_LL:
|
||||||
case WH_MOUSE:
|
case WH_MOUSE:
|
||||||
case WH_CALLWNDPROC:
|
|
||||||
case WH_CALLWNDPROCRET:
|
|
||||||
case WH_MSGFILTER:
|
|
||||||
case WH_SYSMSGFILTER:
|
|
||||||
case WH_GETMESSAGE:
|
|
||||||
lParam = (LPARAM)pHP->pHookStructs;
|
lParam = (LPARAM)pHP->pHookStructs;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -187,12 +160,6 @@ co_HOOK_CallHookNext( PHOOK Hook,
|
||||||
WPARAM wParam,
|
WPARAM wParam,
|
||||||
LPARAM lParam)
|
LPARAM lParam)
|
||||||
{
|
{
|
||||||
if ( (Hook->Thread != PsGetCurrentThread()) && (Hook->Thread != NULL) )
|
|
||||||
{
|
|
||||||
DPRINT1("Calling Next HOOK from another Thread. %d\n", Hook->HookId);
|
|
||||||
return IntCallLowLevelHook(Hook, Code, wParam, lParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
DPRINT("Calling Next HOOK %d\n", Hook->HookId);
|
DPRINT("Calling Next HOOK %d\n", Hook->HookId);
|
||||||
|
|
||||||
return co_IntCallHookProc( Hook->HookId,
|
return co_IntCallHookProc( Hook->HookId,
|
||||||
|
@ -989,7 +956,10 @@ co_HOOK_CallHooks( INT HookId,
|
||||||
pti->fsHooks most likely, is zero. So process KbT & MsT to "send" the message.
|
pti->fsHooks most likely, is zero. So process KbT & MsT to "send" the message.
|
||||||
*/
|
*/
|
||||||
if ( !pti || !pdo || (!(HookId == WH_KEYBOARD_LL) && !(HookId == WH_MOUSE_LL)) )
|
if ( !pti || !pdo || (!(HookId == WH_KEYBOARD_LL) && !(HookId == WH_MOUSE_LL)) )
|
||||||
|
{
|
||||||
|
DPRINT("No PDO %d\n", HookId);
|
||||||
goto Exit;
|
goto Exit;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -997,7 +967,10 @@ co_HOOK_CallHooks( INT HookId,
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( pti->TIF_flags & (TIF_INCLEANUP|TIF_DISABLEHOOKS))
|
if ( pti->TIF_flags & (TIF_INCLEANUP|TIF_DISABLEHOOKS))
|
||||||
|
{
|
||||||
|
DPRINT("Hook Thread dead %d\n", HookId);
|
||||||
goto Exit;
|
goto Exit;
|
||||||
|
}
|
||||||
|
|
||||||
if ( ISITHOOKED(HookId) )
|
if ( ISITHOOKED(HookId) )
|
||||||
{
|
{
|
||||||
|
@ -1104,11 +1077,13 @@ co_HOOK_CallHooks( INT HookId,
|
||||||
// Lockup the thread while this links through user world.
|
// Lockup the thread while this links through user world.
|
||||||
ObReferenceObject(ptiHook->pEThread);
|
ObReferenceObject(ptiHook->pEThread);
|
||||||
if (ptiHook != pti )
|
if (ptiHook != pti )
|
||||||
{
|
{ // Block | TimeOut
|
||||||
/* This fixed the ros regtest. Wine does this too. Need more time
|
if ( HookId == WH_JOURNALPLAYBACK || // 1 | 0
|
||||||
to investigate this. MSDN "Hooks Overview" can't be wrong?
|
HookId == WH_JOURNALRECORD || // 1 | 0
|
||||||
*/
|
HookId == WH_KEYBOARD || // 1 | 200
|
||||||
if (HookId == WH_KEYBOARD_LL || HookId == WH_MOUSE_LL)
|
HookId == WH_MOUSE || // 1 | 200
|
||||||
|
HookId == WH_KEYBOARD_LL || // 0 | 300
|
||||||
|
HookId == WH_MOUSE_LL ) // 0 | 300
|
||||||
{
|
{
|
||||||
DPRINT("\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);
|
Result = IntCallLowLevelHook(Hook, Code, wParam, lParam);
|
||||||
|
@ -1281,7 +1256,7 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
|
||||||
DPRINT("Enter NtUserSetWindowsHookEx\n");
|
DPRINT("Enter NtUserSetWindowsHookEx\n");
|
||||||
UserEnterExclusive();
|
UserEnterExclusive();
|
||||||
|
|
||||||
ptiCurrent = GetW32ThreadInfo();
|
ptiCurrent = PsGetCurrentThreadWin32Thread();
|
||||||
|
|
||||||
if (HookId < WH_MINHOOK || WH_MAXHOOK < HookId )
|
if (HookId < WH_MINHOOK || WH_MAXHOOK < HookId )
|
||||||
{
|
{
|
||||||
|
@ -1422,7 +1397,7 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
pti->pClientInfo->fsHooks = pti->fsHooks;
|
pti->pClientInfo->fsHooks = pti->fsHooks;
|
||||||
pti->pClientInfo->phkCurrent = 0;
|
pti->pClientInfo->phkCurrent = NULL;
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
|
@ -1440,7 +1415,7 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
pti->pClientInfo->fsHooks = pti->fsHooks;
|
pti->pClientInfo->fsHooks = pti->fsHooks;
|
||||||
pti->pClientInfo->phkCurrent = 0;
|
pti->pClientInfo->phkCurrent = NULL;
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
|
@ -1461,6 +1436,8 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
|
||||||
Hook->ptiHooked = NULL;
|
Hook->ptiHooked = NULL;
|
||||||
//gptiCurrent->pDeskInfo->fsHooks |= HOOKID_TO_FLAG(HookId);
|
//gptiCurrent->pDeskInfo->fsHooks |= HOOKID_TO_FLAG(HookId);
|
||||||
pti->rpdesk->pDeskInfo->fsHooks |= HOOKID_TO_FLAG(HookId);
|
pti->rpdesk->pDeskInfo->fsHooks |= HOOKID_TO_FLAG(HookId);
|
||||||
|
pti->sphkCurrent = NULL;
|
||||||
|
pti->pClientInfo->phkCurrent = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
RtlInitUnicodeString(&Hook->ModuleName, NULL);
|
RtlInitUnicodeString(&Hook->ModuleName, NULL);
|
||||||
|
|
Loading…
Reference in a new issue