The problem with NtFsControlFile(FSCTL_PIPE_PEEK) is that it happily returns STATUS_SUCCESS with 0 bytes of data available. That makes the client think that the server already sent a reply and try to read the reply data, which hangs. A solution to this is call NtReadFile() with zero sized buffer, which has correct behaviour: just waits for incoming data to appear without mangling the data in the pipe.
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/rpcrt4/rpc_transport.c | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-)
diff --git a/dlls/rpcrt4/rpc_transport.c b/dlls/rpcrt4/rpc_transport.c index 12d15f8654..243c4780bf 100644 --- a/dlls/rpcrt4/rpc_transport.c +++ b/dlls/rpcrt4/rpc_transport.c @@ -465,31 +465,7 @@ static void rpcrt4_conn_np_cancel_call(RpcConnection *conn)
static int rpcrt4_conn_np_wait_for_incoming_data(RpcConnection *conn) { - RpcConnection_np *connection = (RpcConnection_np *)conn; - FILE_PIPE_PEEK_BUFFER buf; - HANDLE event; - NTSTATUS status; - int ret; - - event = get_np_event(connection); - if (!event) return -1; - - status = NtFsControlFile(connection->pipe, event, NULL, NULL, &connection->io_status, FSCTL_PIPE_PEEK, NULL, 0, &buf, sizeof(buf)); - if (status == STATUS_SUCCESS) - ret = 0; - else if (status == STATUS_PENDING) - { - WaitForSingleObject(event, INFINITE); - ret = 0; - } - else - { - WARN("NtFsControlFile error %08x\n", status); - ret = -1; - } - - release_np_event(connection, event); - return ret; + return rpcrt4_conn_np_read(conn, NULL, 0); }
static size_t rpcrt4_ncacn_np_get_top_of_tower(unsigned char *tower_data,