[ros-diffs] [jimtabor] 49605: [Win32k] - Tweaks to hook and event timeouts. Increase performance with DOSBox when using mouse and keyboard.

jimtabor at svn.reactos.org jimtabor at svn.reactos.org
Tue Nov 16 04:52:54 UTC 2010


Author: jimtabor
Date: Tue Nov 16 04:52:53 2010
New Revision: 49605

URL: http://svn.reactos.org/svn/reactos?rev=49605&view=rev
Log:
[Win32k]
- Tweaks to hook and event timeouts. Increase performance with DOSBox when using mouse and keyboard.

Modified:
    trunk/reactos/subsystems/win32/win32k/ntuser/event.c
    trunk/reactos/subsystems/win32/win32k/ntuser/hook.c

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/event.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/event.c?rev=49605&r1=49604&r2=49605&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/event.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/event.c [iso-8859-1] Tue Nov 16 04:52:53 2010
@@ -120,7 +120,7 @@
                                event,
                                0,
                               (LPARAM)pEP,
-                               5000,
+                               300,
                                TRUE,
                                MSQ_ISEVENT,
                               &uResult);

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/hook.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/hook.c?rev=49605&r1=49604&r2=49605&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/hook.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/hook.c [iso-8859-1] Tue Nov 16 04:52:53 2010
@@ -38,6 +38,8 @@
     PTHREADINFO pti;
     PHOOKPACK pHP;
     INT Size;
+    UINT uTimeout = 300;
+    BOOL Block = FALSE;
     ULONG_PTR uResult = 0;
 
     if (Hook->Thread)
@@ -53,25 +55,13 @@
     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 @@
           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;
     }
 
@@ -107,9 +93,9 @@
                                 IntToPtr(Code), // hWnd
                                 Hook->HookId,   // Msg
                                 wParam,
-                                (LPARAM)pHP,
-                                5000,
-                                TRUE,
+                               (LPARAM)pHP,
+                                uTimeout,
+                                Block,
                                 MSQ_ISHOOK,
                                &uResult);
     if (!NT_SUCCESS(Status))
@@ -141,25 +127,12 @@
 
     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 @@
                       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,7 +956,10 @@
        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
     {
@@ -997,7 +967,10 @@
     }
 
     if ( pti->TIF_flags & (TIF_INCLEANUP|TIF_DISABLEHOOKS))
+    {
+       DPRINT("Hook Thread dead %d\n", HookId);
        goto Exit;
+    }
 
     if ( ISITHOOKED(HookId) )
     {
@@ -1104,11 +1077,13 @@
           // 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 @@
     DPRINT("Enter NtUserSetWindowsHookEx\n");
     UserEnterExclusive();
 
-    ptiCurrent = GetW32ThreadInfo();
+    ptiCurrent = PsGetCurrentThreadWin32Thread();
 
     if (HookId < WH_MINHOOK || WH_MAXHOOK < HookId )
     {
@@ -1422,7 +1397,7 @@
              _SEH2_TRY
              {
                 pti->pClientInfo->fsHooks = pti->fsHooks;
-                pti->pClientInfo->phkCurrent = 0;
+                pti->pClientInfo->phkCurrent = NULL;
              }
              _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
              {
@@ -1440,7 +1415,7 @@
              _SEH2_TRY
              {
                 pti->pClientInfo->fsHooks = pti->fsHooks;
-                pti->pClientInfo->phkCurrent = 0;
+                pti->pClientInfo->phkCurrent = NULL;
              }
              _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
              {
@@ -1461,6 +1436,8 @@
        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);




More information about the Ros-diffs mailing list