Fix some thread-safeness problem when accessing the system message
queue.

diff --git a/windows/message.c b/windows/message.c
index 9a19c72..1f799f1 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -466,11 +466,15 @@
     DWORD status = SYSQ_MSG_ACCEPT;
     MESSAGEQUEUE *sysMsgQueue = QUEUE_GetSysQueue();
     int kbd_msg;
-    QMSG *nextqmsg, *qmsg = sysMsgQueue->firstMsg;
+    QMSG *nextqmsg, *qmsg = 0;
 
     /* FIXME: there has to be a better way to do this */
     joySendMessages();
 
+    EnterCriticalSection(&sysMsgQueue->cSection);
+
+    qmsg = sysMsgQueue->firstMsg;
+    
     /* If the queue is empty, attempt to fill it */
     if (!sysMsgQueue->msgCount && THREAD_IsWin16( THREAD_Current() )
                                && EVENT_Pending())
@@ -557,6 +561,7 @@
 		continue;
 
 	   case SYSQ_MSG_ABANDON: 
+               LeaveCriticalSection(&sysMsgQueue->cSection);
 		return FALSE;
 	}
 
@@ -565,8 +570,10 @@
             if (HOOK_IsHooked( WH_JOURNALRECORD )) MSG_JournalRecordMsg( msg );
             QUEUE_RemoveMsg( sysMsgQueue, qmsg );
         }
+        LeaveCriticalSection(&sysMsgQueue->cSection);
         return TRUE;
     }
+    LeaveCriticalSection(&sysMsgQueue->cSection);
     return FALSE;
 }