- 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:
James Tabor 2010-11-16 04:52:53 +00:00
parent 7a5f137974
commit 3d573b97a6
2 changed files with 38 additions and 61 deletions

View file

@ -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);

View file

@ -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;
} }
@ -108,8 +94,8 @@ IntCallLowLevelHook( PHOOK Hook,
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,15 +956,21 @@ 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
{ {
pdo = pti->rpdesk; pdo = pti->rpdesk;
} }
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);