From 6301753d1df770e0aecea05f247b3e6bd597f071 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sat, 9 Apr 2011 07:19:31 +0000 Subject: [PATCH] [Win32k] - 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 --- .../subsystems/win32/win32k/ntuser/message.c | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index f2f5dae891d..ed7c718eea8 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -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;