Fixed bug that could cause SendMessage to return too early in certain
cases.

diff --git a/dlls/user/message.c b/dlls/user/message.c
index 2c2b96a..21dccae 100644
--- a/dlls/user/message.c
+++ b/dlls/user/message.c
@@ -1026,6 +1026,7 @@
 
     SERVER_START_REQ( reply_message )
     {
+        req->type   = info->type;
         req->result = result;
         req->remove = remove;
         for (i = 0; i < data.count; i++) wine_server_add_data( req, data.data[i], data.size[i] );
@@ -1407,6 +1408,7 @@
      */
     SERVER_START_REQ( reply_message )
     {
+        req->type   = MSG_HARDWARE;
         req->result = 0;
         req->remove = remove || !ret;
         wine_server_call( req );
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 931ae58..1364d91 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -2237,6 +2237,7 @@
 struct reply_message_request
 {
     struct request_header __header;
+    int             type;
     unsigned int    result;
     int             remove;
     /* VARARG(data,bytes); */
@@ -3555,6 +3556,6 @@
     struct get_next_hook_reply get_next_hook_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 100
+#define SERVER_PROTOCOL_VERSION 101
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/protocol.def b/server/protocol.def
index f1a4edb..3c27b38 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -1589,6 +1589,7 @@
 
 /* Reply to a sent message */
 @REQ(reply_message)
+    int             type;      /* type of original message */
     unsigned int    result;    /* message result */
     int             remove;    /* should we remove the message? */
     VARARG(data,bytes);        /* message data for sent messages */
diff --git a/server/queue.c b/server/queue.c
index a441fdb..5315886 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -1380,15 +1380,15 @@
         set_error( STATUS_ACCESS_DENIED );
         return;
     }
-    if (current->queue->recv_result)
-        reply_message( current->queue, req->result, 0, req->remove,
-                       get_req_data(), get_req_data_size() );
-    else
+    if (req->type == MSG_HARDWARE)
     {
         struct thread_input *input = current->queue->input;
         if (input->msg_thread == current) release_hardware_message( current, req->remove );
         else set_error( STATUS_ACCESS_DENIED );
     }
+    else if (current->queue->recv_result)
+        reply_message( current->queue, req->result, 0, req->remove,
+                       get_req_data(), get_req_data_size() );
 }
 
 
diff --git a/server/trace.c b/server/trace.c
index b9c6f1c..33a93a1 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -1835,6 +1835,7 @@
 
 static void dump_reply_message_request( const struct reply_message_request *req )
 {
+    fprintf( stderr, " type=%d,", req->type );
     fprintf( stderr, " result=%08x,", req->result );
     fprintf( stderr, " remove=%d,", req->remove );
     fprintf( stderr, " data=" );