From 74a36d7889f43c9f2f0a5b5f0cfe4781faeb2e09 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 8 Nov 2013 02:17:05 +0000 Subject: [PATCH] [Win32k] - Add support for receiving message thread death, no real tests are available at this time. svn path=/trunk/; revision=60883 --- reactos/win32ss/user/ntuser/msgqueue.c | 38 ++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/reactos/win32ss/user/ntuser/msgqueue.c b/reactos/win32ss/user/ntuser/msgqueue.c index c4e677ddf69..deff6fad9aa 100644 --- a/reactos/win32ss/user/ntuser/msgqueue.c +++ b/reactos/win32ss/user/ntuser/msgqueue.c @@ -1102,15 +1102,19 @@ co_MsqSendMessage(PTHREADINFO ptirec, } else { - PVOID WaitObjects[2]; + PVOID WaitObjects[3]; + + ObReferenceObject(ptirec->pEThread); + + WaitObjects[0] = &CompletionEvent; // Wait 0 + WaitObjects[1] = pti->pEventQueueServer; // Wait 1 + WaitObjects[2] = ptirec->pEThread; // Wait 2 - WaitObjects[0] = &CompletionEvent; - WaitObjects[1] = pti->pEventQueueServer; do { UserLeaveCo(); - WaitStatus = KeWaitForMultipleObjects(2, WaitObjects, WaitAny, UserRequest, + WaitStatus = KeWaitForMultipleObjects(3, WaitObjects, WaitAny, UserRequest, UserMode, FALSE, (uTimeout ? &Timeout : NULL), NULL); UserEnterCo(); @@ -1158,10 +1162,34 @@ co_MsqSendMessage(PTHREADINFO ptirec, TRACE("MsqSendMessage timed out 2\n"); break; } + /*if (WaitStatus == STATUS_WAIT_1) + { + ERR("Event hit\n"); + }*/ + // Receiving thread passed on and left us hanging with issues still pending. + if (WaitStatus == STATUS_WAIT_2) + { + ERR("Thread woken up dead!\n"); + Entry = pti->DispatchingMessagesHead.Flink; + while (Entry != &pti->DispatchingMessagesHead) + { + if ((PUSER_SENT_MESSAGE) CONTAINING_RECORD(Entry, USER_SENT_MESSAGE, DispatchingListEntry) + == Message) + { + Message->CompletionEvent = NULL; + Message->Result = NULL; + RemoveEntryList(&Message->DispatchingListEntry); + Message->DispatchingListEntry.Flink = NULL; + break; + } + Entry = Entry->Flink; + } + } while (co_MsqDispatchOneSentMessage(pti)) ; } - while (NT_SUCCESS(WaitStatus) && STATUS_WAIT_0 != WaitStatus); + while (NT_SUCCESS(WaitStatus) && WaitStatus == STATUS_WAIT_1); + ObDereferenceObject(ptirec->pEThread); } if(WaitStatus != STATUS_TIMEOUT)