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