[Win32k]
authorMichael Martin <michael.martin@reactos.org>
Sat, 9 Apr 2011 07:19:31 +0000 (07:19 +0000)
committerMichael Martin <michael.martin@reactos.org>
Sat, 9 Apr 2011 07:19:31 +0000 (07:19 +0000)
- Only call hooks and check if Win32Thread is in cleanup if the windows procedure is being called.
- Set DispatchingListEntry.Flink to NULL. The real fix for bug 5580. This bug may be the cause of other crashes experienced by users just before loading desktop. Found by rafalh.

svn path=/trunk/; revision=51291

reactos/subsystems/win32/win32k/ntuser/message.c

index f2f5dae..ed7c718 100644 (file)
@@ -1403,17 +1403,8 @@ co_IntSendMessageWithCallBack( HWND hWnd,
 
     Win32Thread = PsGetCurrentThreadWin32Thread();
 
-    IntCallWndProc( Window, hWnd, Msg, wParam, lParam);
-
     if (Win32Thread == NULL)
     {
-        ASSERT(FALSE);
-        RETURN(FALSE);
-    }
-
-    if (Win32Thread->TIF_flags & TIF_INCLEANUP)
-    {
-        /* Never send messages to exiting threads */
         RETURN(FALSE);
     }
 
@@ -1437,6 +1428,15 @@ co_IntSendMessageWithCallBack( HWND hWnd,
     /* If this is not a callback and it can be sent now, then send it. */
     if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL))
     {
+        if (Win32Thread->TIF_flags & TIF_INCLEANUP)
+        {
+            UnpackParam(lParamPacked, Msg, wParam, lParam, FALSE);
+            /* Never send messages to exiting threads */
+            RETURN(FALSE);
+        }
+
+        IntCallWndProc( Window, hWnd, Msg, wParam, lParam);
+
         ObReferenceObject(Win32Thread->pEThread);
         Result = (ULONG_PTR)co_IntCallWindowProc( Window->lpfnWndProc,
                                                   !Window->Unicode,
@@ -1450,9 +1450,11 @@ co_IntSendMessageWithCallBack( HWND hWnd,
             *uResult = Result;
         }
         ObDereferenceObject(Win32Thread->pEThread);
+
+        IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult);
     }
 
-    IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult);
+
 
     if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL))
     {
@@ -1479,7 +1481,8 @@ co_IntSendMessageWithCallBack( HWND hWnd,
     Message->QS_Flags = 0;
     Message->SenderQueue = NULL; // mjmartin, you are right! This is null.
     Message->CallBackSenderQueue = Win32Thread->MessageQueue;
-
+    Message->DispatchingListEntry.Flink = NULL;
+    
     IntReferenceMessageQueue(Window->head.pti->MessageQueue);
     Message->CompletionCallback = CompletionCallback;
     Message->CompletionCallbackContext = CompletionCallbackContext;