- Made the message queue access to be thread safe. (Using two new
  functions to access the message queue, QUEUE_Lock(), QUEUE_Unlock()
  instead of GlobalLock16()).
- Fixed QUEUE_DumpQueue (used by "info queue <handle>" with the
  wine-debugger).

diff --git a/windows/hook.c b/windows/hook.c
index 5aac94e..c4336cc 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -827,9 +827,11 @@
     MESSAGEQUEUE *queue;
     HANDLE16 hook = 0;
 
-    if ((queue = (MESSAGEQUEUE *)GlobalLock16( hQueue )) != NULL)
+    if ((queue = (MESSAGEQUEUE *)QUEUE_Lock( hQueue )) != NULL)
         hook = queue->hooks[id - WH_MINHOOK];
     if (!hook) hook = HOOK_systemHooks[id - WH_MINHOOK];
+
+    QUEUE_Unlock( queue );
     return hook;
 }
 
@@ -878,9 +880,10 @@
 
     if (hQueue)
     {
-        MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16( hQueue );
+        MESSAGEQUEUE *queue = (MESSAGEQUEUE *)QUEUE_Lock( hQueue );
         data->next = queue->hooks[id - WH_MINHOOK];
         queue->hooks[id - WH_MINHOOK] = handle;
+        QUEUE_Unlock( queue );
     }
     else
     {
@@ -921,9 +924,10 @@
 
     if (data->ownerQueue)
     {
-        MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16( data->ownerQueue );
+        MESSAGEQUEUE *queue = (MESSAGEQUEUE *)QUEUE_Lock( data->ownerQueue );
         if (!queue) return FALSE;
         prevHook = &queue->hooks[data->id - WH_MINHOOK];
+        QUEUE_Unlock( queue );
     }
     else prevHook = &HOOK_systemHooks[data->id - WH_MINHOOK];
 
@@ -979,7 +983,7 @@
 
     /* Now call it */
 
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetFastQueue() ))) return 0;
+    if (!(queue = (MESSAGEQUEUE *)QUEUE_Lock( GetFastQueue() ))) return 0;
     prevHook = queue->hCurHook;
     queue->hCurHook = hook;
     data->flags |= HOOK_INUSE;
@@ -994,6 +998,8 @@
     data->flags &= ~HOOK_INUSE;
     queue->hCurHook = prevHook;
 
+    QUEUE_Unlock( queue );
+
     if (UnMapFunc)
       UnMapFunc( data->id, code, wParamOrig, lParamOrig, wParam, lParam );
 
@@ -1089,7 +1095,7 @@
 {
     MESSAGEQUEUE *queue;
 
-    if ((queue = (MESSAGEQUEUE *)GlobalLock16( hQueue )) != NULL)
+    if ((queue = (MESSAGEQUEUE *)QUEUE_Lock( hQueue )) != NULL)
     {
 	HOOKDATA*	data;
 	HHOOK		hook;
@@ -1106,6 +1112,8 @@
 		} else break;
 	    }
 	}
+
+        QUEUE_Unlock( queue );
     }
 }
 
@@ -1329,9 +1337,12 @@
     /* Note: the *hhook parameter is never used, since we rely on the
      * current hook value from the task queue to find the next hook. */
     MESSAGEQUEUE *queue;
+    LRESULT ret;
 
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetFastQueue() ))) return 0;
-    return CallNextHookEx16( queue->hCurHook, code, wParam, lParam );
+    if (!(queue = (MESSAGEQUEUE *)QUEUE_Lock( GetFastQueue() ))) return 0;
+    ret = CallNextHookEx16( queue->hCurHook, code, wParam, lParam );
+    QUEUE_Unlock( queue );
+    return ret;
 }