diff --git a/reactos/subsys/win32k/include/msgqueue.h b/reactos/subsys/win32k/include/msgqueue.h index e0c35d48059..ea7a032bd47 100644 --- a/reactos/subsys/win32k/include/msgqueue.h +++ b/reactos/subsys/win32k/include/msgqueue.h @@ -50,7 +50,7 @@ typedef struct _USER_MESSAGE_QUEUE /* Queue for hardware messages for the queue. */ LIST_ENTRY HardwareMessagesListHead; /* Lock for the hardware message list. */ - FAST_MUTEX HardwareLock; + KMUTEX HardwareLock; /* Lock for the queue. */ FAST_MUTEX Lock; /* Pointer to the current WM_MOUSEMOVE message */ @@ -189,10 +189,10 @@ LPARAM FASTCALL MsqGetMessageExtraInfo(VOID); ExReleaseFastMutex(&MsgQueue->Lock) #define IntLockHardwareMessageQueue(MsgQueue) \ - ExAcquireFastMutex(&MsgQueue->HardwareLock) + KeWaitForMutexObject(&MsgQueue->HardwareLock, UserRequest, KernelMode, FALSE, NULL) #define IntUnLockHardwareMessageQueue(MsgQueue) \ - ExReleaseFastMutex(&MsgQueue->HardwareLock) + KeReleaseMutex(&MsgQueue->HardwareLock, FALSE) /* check the queue status */ #define MsqIsSignaled(MsgQueue) \ diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 597f4ab719c..d87b4f771d0 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: msgqueue.c,v 1.80 2004/03/31 19:44:34 weiden Exp $ +/* $Id: msgqueue.c,v 1.81 2004/04/07 21:12:08 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -906,6 +906,7 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, LRESULT Result; PUSER_MESSAGE_QUEUE ThreadQueue; LARGE_INTEGER Timeout; + PLIST_ENTRY Entry; KeInitializeEvent(&CompletionEvent, NotificationEvent, FALSE); @@ -944,7 +945,21 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, WaitStatus = KeWaitForMultipleObjects(2, WaitObjects, WaitAny, UserRequest, UserMode, FALSE, (uTimeout ? &Timeout : NULL), NULL); if(WaitStatus == STATUS_TIMEOUT) - {DbgPrint("MsqSendMessage timed out\n"); + { + IntLockMessageQueue(MessageQueue); + Entry = MessageQueue->SentMessagesListHead.Flink; + while (Entry != &MessageQueue->SentMessagesListHead) + { + if ((PUSER_SENT_MESSAGE) CONTAINING_RECORD(Entry, USER_SENT_MESSAGE, ListEntry) + == Message) + { + Message->CompletionEvent = NULL; + break; + } + Entry = Entry->Flink; + } + IntUnLockMessageQueue(MessageQueue); + DbgPrint("MsqSendMessage timed out\n"); break; } while (MsqDispatchOneSentMessage(ThreadQueue)) @@ -1066,7 +1081,7 @@ MsqInitializeMessageQueue(struct _ETHREAD *Thread, PUSER_MESSAGE_QUEUE MessageQu InitializeListHead(&MessageQueue->PostedMessagesListHead); InitializeListHead(&MessageQueue->SentMessagesListHead); InitializeListHead(&MessageQueue->HardwareMessagesListHead); - ExInitializeFastMutex(&MessageQueue->HardwareLock); + KeInitializeMutex(&MessageQueue->HardwareLock, 0); ExInitializeFastMutex(&MessageQueue->Lock); MessageQueue->QuitPosted = FALSE; MessageQueue->QuitExitCode = 0;