Call EVENT_Pending() to flush X11 output queue before blocking in
MsgWaitForMultipleObjects().
Don't call EVENT_WaitNetEvent in MSG_PeekHardwareMsg.
Protect system queue access in hardware_event().

diff --git a/windows/message.c b/windows/message.c
index f4e92e8..acb89ff 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -502,10 +502,12 @@
 
     qmsg = sysMsgQueue->firstMsg;
     
+#if 0 
     /* If the queue is empty, attempt to fill it */
     if (!sysMsgQueue->msgCount && THREAD_IsWin16( THREAD_Current() )
                                && EVENT_Pending())
         EVENT_WaitNetEvent( FALSE, FALSE );
+#endif
 
     for ( kbd_msg = 0; qmsg; qmsg = nextqmsg)
     {
@@ -1820,6 +1822,8 @@
 	handles[i] = pHandles[i];
     handles[nCount] = msgQueue->hEvent;
 
+    EVENT_Pending();
+
     ret = WaitForMultipleObjects( nCount+1, handles, fWaitAll, dwMilliseconds );
     } 
 
diff --git a/windows/queue.c b/windows/queue.c
index 125b18b..5ead0ce 100644
--- a/windows/queue.c
+++ b/windows/queue.c
@@ -1146,12 +1146,15 @@
 		     int xPos, int yPos, DWORD time, DWORD extraInfo )
 {
     MSG *msg;
-    QMSG  *qmsg = sysMsgQueue->lastMsg;
+    QMSG  *qmsg;
     int  mergeMsg = 0;
 
     if (!sysMsgQueue) return;
 
-      /* Merge with previous event if possible */
+    EnterCriticalSection( &sysMsgQueue->cSection );
+
+    /* Merge with previous event if possible */
+    qmsg = sysMsgQueue->lastMsg;
 
     if ((message == WM_MOUSEMOVE) && sysMsgQueue->lastMsg)
     {
@@ -1173,7 +1176,10 @@
         /* Don't merge allocate a new msg in the global heap */
         
         if (!(qmsg = (QMSG *) HeapAlloc( SystemHeap, 0, sizeof(QMSG) ) ))
-        return;
+        {
+            LeaveCriticalSection( &sysMsgQueue->cSection );
+            return;
+        }
         
         /* put message at the end of the linked list */
         qmsg->nextMsg = 0;
@@ -1201,6 +1207,8 @@
     msg->pt.y    = yPos;
     qmsg->extraInfo = extraInfo;
 
+    LeaveCriticalSection( &sysMsgQueue->cSection );
+
     QUEUE_WakeSomeone( message );
 }