- 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
This commit is contained in:
Michael Martin 2011-04-09 07:19:31 +00:00
parent f78f9456fb
commit 6301753d1d

View 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;