- 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,
0,
(LPARAM)pEP,
5000,
300,
TRUE,
MSQ_ISEVENT,
&uResult);

View file

@ -38,6 +38,8 @@ IntCallLowLevelHook( PHOOK Hook,
PTHREADINFO pti;
PHOOKPACK pHP;
INT Size;
UINT uTimeout = 300;
BOOL Block = FALSE;
ULONG_PTR uResult = 0;
if (Hook->Thread)
@ -53,25 +55,13 @@ IntCallLowLevelHook( PHOOK Hook,
pHP->pHookStructs = NULL;
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)
{
case WH_CBT:
switch(Code)
{
case HCBT_CREATEWND:
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;
}
case WH_JOURNALPLAYBACK:
case WH_JOURNALRECORD:
uTimeout = 0;
Size = sizeof(EVENTMSG);
break;
case WH_KEYBOARD_LL:
Size = sizeof(KBDLLHOOKSTRUCT);
@ -80,18 +70,14 @@ IntCallLowLevelHook( PHOOK Hook,
Size = sizeof(MSLLHOOKSTRUCT);
break;
case WH_MOUSE:
uTimeout = 200;
Block = TRUE;
Size = sizeof(MOUSEHOOKSTRUCT);
break;
case WH_CALLWNDPROC:
Size = sizeof(CWPSTRUCT);
break;
case WH_CALLWNDPROCRET:
Size = sizeof(CWPRETSTRUCT);
break;
case WH_MSGFILTER:
case WH_SYSMSGFILTER:
case WH_GETMESSAGE:
Size = sizeof(MSG);
case WH_KEYBOARD:
uTimeout = 200;
Block = TRUE;
Size = sizeof(KBDLLHOOKSTRUCT);
break;
}
@ -108,8 +94,8 @@ IntCallLowLevelHook( PHOOK Hook,
Hook->HookId, // Msg
wParam,
(LPARAM)pHP,
5000,
TRUE,
uTimeout,
Block,
MSQ_ISHOOK,
&uResult);
if (!NT_SUCCESS(Status))
@ -141,25 +127,12 @@ co_CallHook( INT HookId,
switch(HookId)
{
case WH_CBT:
switch(Code)
{
case HCBT_CREATEWND:
case HCBT_MOVESIZE:
case HCBT_ACTIVATE:
case HCBT_CLICKSKIPPED:
lParam = (LPARAM)pHP->pHookStructs;
break;
}
break;
case WH_JOURNALPLAYBACK:
case WH_JOURNALRECORD:
case WH_KEYBOARD:
case WH_KEYBOARD_LL:
case WH_MOUSE_LL:
case WH_MOUSE:
case WH_CALLWNDPROC:
case WH_CALLWNDPROCRET:
case WH_MSGFILTER:
case WH_SYSMSGFILTER:
case WH_GETMESSAGE:
lParam = (LPARAM)pHP->pHookStructs;
break;
}
@ -187,12 +160,6 @@ co_HOOK_CallHookNext( PHOOK Hook,
WPARAM wParam,
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);
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.
*/
if ( !pti || !pdo || (!(HookId == WH_KEYBOARD_LL) && !(HookId == WH_MOUSE_LL)) )
{
DPRINT("No PDO %d\n", HookId);
goto Exit;
}
}
else
{
pdo = pti->rpdesk;
}
if ( pti->TIF_flags & (TIF_INCLEANUP|TIF_DISABLEHOOKS))
{
DPRINT("Hook Thread dead %d\n", HookId);
goto Exit;
}
if ( ISITHOOKED(HookId) )
{
@ -1104,11 +1077,13 @@ co_HOOK_CallHooks( INT HookId,
// Lockup the thread while this links through user world.
ObReferenceObject(ptiHook->pEThread);
if (ptiHook != pti )
{
/* This fixed the ros regtest. Wine does this too. Need more time
to investigate this. MSDN "Hooks Overview" can't be wrong?
*/
if (HookId == WH_KEYBOARD_LL || HookId == WH_MOUSE_LL)
{ // Block | TimeOut
if ( HookId == WH_JOURNALPLAYBACK || // 1 | 0
HookId == WH_JOURNALRECORD || // 1 | 0
HookId == WH_KEYBOARD || // 1 | 200
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 );
Result = IntCallLowLevelHook(Hook, Code, wParam, lParam);
@ -1281,7 +1256,7 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
DPRINT("Enter NtUserSetWindowsHookEx\n");
UserEnterExclusive();
ptiCurrent = GetW32ThreadInfo();
ptiCurrent = PsGetCurrentThreadWin32Thread();
if (HookId < WH_MINHOOK || WH_MAXHOOK < HookId )
{
@ -1422,7 +1397,7 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
_SEH2_TRY
{
pti->pClientInfo->fsHooks = pti->fsHooks;
pti->pClientInfo->phkCurrent = 0;
pti->pClientInfo->phkCurrent = NULL;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
@ -1440,7 +1415,7 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
_SEH2_TRY
{
pti->pClientInfo->fsHooks = pti->fsHooks;
pti->pClientInfo->phkCurrent = 0;
pti->pClientInfo->phkCurrent = NULL;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
@ -1461,6 +1436,8 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
Hook->ptiHooked = NULL;
//gptiCurrent->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);