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=" );