diff --git a/reactos/lib/rpcrt4/rpc_message.c b/reactos/lib/rpcrt4/rpc_message.c index 119af8cfab3..d10e56c9ab4 100644 --- a/reactos/lib/rpcrt4/rpc_message.c +++ b/reactos/lib/rpcrt4/rpc_message.c @@ -265,10 +265,15 @@ RPC_STATUS RPCRT4_Send(RpcConnection *Connection, RpcPktHdr *Header, } /* transmit packet header */ - if (!WriteFile(Connection->conn, Header, hdr_size, &count, NULL)) { + ResetEvent(Connection->ovl.hEvent); + if (!WriteFile(Connection->conn, Header, hdr_size, &count, &Connection->ovl)) { WARN("WriteFile failed with error %ld\n", GetLastError()); return GetLastError(); } + if (!GetOverlappedResult(Connection->conn, &Connection->ovl, &count, TRUE)) { + WARN("GetOverlappedResult failed with error %ld\n", GetLastError()); + return GetLastError(); + } /* fragment consisted of header only and is the last one */ if (hdr_size == Header->common.frag_len && @@ -277,10 +282,15 @@ RPC_STATUS RPCRT4_Send(RpcConnection *Connection, RpcPktHdr *Header, } /* send the fragment data */ - if (!WriteFile(Connection->conn, buffer_pos, Header->common.frag_len - hdr_size, &count, NULL)) { + ResetEvent(Connection->ovl.hEvent); + if (!WriteFile(Connection->conn, buffer_pos, Header->common.frag_len - hdr_size, &count, &Connection->ovl)) { WARN("WriteFile failed with error %ld\n", GetLastError()); return GetLastError(); } + if (!GetOverlappedResult(Connection->conn, &Connection->ovl, &count, TRUE)) { + WARN("GetOverlappedResult failed with error %ld\n", GetLastError()); + return GetLastError(); + } Header->common.flags &= ~RPC_FLG_FIRST; } @@ -309,9 +319,15 @@ RPC_STATUS RPCRT4_Receive(RpcConnection *Connection, RpcPktHdr **Header, TRACE("(%p, %p, %p)\n", Connection, Header, pMsg); /* read packet common header */ - if (!ReadFile(Connection->conn, &common_hdr, sizeof(common_hdr), &dwRead, NULL)) { + ResetEvent(Connection->ovl.hEvent); + if (!ReadFile(Connection->conn, &common_hdr, sizeof(common_hdr), &dwRead, &Connection->ovl)) { + WARN("ReadFile failed with error %ld\n", GetLastError()); + status = RPC_S_PROTOCOL_ERROR; + goto fail; + } + if (!GetOverlappedResult(Connection->conn, &Connection->ovl, &dwRead, TRUE)) { if (GetLastError() != ERROR_MORE_DATA) { - WARN("ReadFile failed with error %ld\n", GetLastError()); + WARN("GetOverlappedResult failed with error %ld\n", GetLastError()); status = RPC_S_PROTOCOL_ERROR; goto fail; } @@ -339,10 +355,16 @@ RPC_STATUS RPCRT4_Receive(RpcConnection *Connection, RpcPktHdr **Header, memcpy(*Header, &common_hdr, sizeof(common_hdr)); /* read the rest of packet header */ + ResetEvent(Connection->ovl.hEvent); if (!ReadFile(Connection->conn, &(*Header)->common + 1, - hdr_length - sizeof(common_hdr), &dwRead, NULL)) { + hdr_length - sizeof(common_hdr), &dwRead, &Connection->ovl)) { + WARN("ReadFile failed with error %ld\n", GetLastError()); + status = RPC_S_PROTOCOL_ERROR; + goto fail; + } + if (!GetOverlappedResult(Connection->conn, &Connection->ovl, &dwRead, TRUE)) { if (GetLastError() != ERROR_MORE_DATA) { - WARN("ReadFile failed with error %ld\n", GetLastError()); + WARN("GetOverlappedResult failed with error %ld\n", GetLastError()); status = RPC_S_PROTOCOL_ERROR; goto fail; } @@ -352,6 +374,7 @@ RPC_STATUS RPCRT4_Receive(RpcConnection *Connection, RpcPktHdr **Header, goto fail; } + /* read packet body */ switch (common_hdr.ptype) { case PKT_RESPONSE: @@ -379,13 +402,20 @@ RPC_STATUS RPCRT4_Receive(RpcConnection *Connection, RpcPktHdr **Header, goto fail; } - if (data_length == 0) dwRead = 0; else - if (!ReadFile(Connection->conn, buffer_ptr, data_length, &dwRead, NULL)) { - if (GetLastError() != ERROR_MORE_DATA) { + if (data_length == 0) dwRead = 0; else { + ResetEvent(Connection->ovl.hEvent); + if (!ReadFile(Connection->conn, buffer_ptr, data_length, &dwRead, &Connection->ovl)) { WARN("ReadFile failed with error %ld\n", GetLastError()); status = RPC_S_PROTOCOL_ERROR; goto fail; } + if (!GetOverlappedResult(Connection->conn, &Connection->ovl, &dwRead, TRUE)) { + if (GetLastError() != ERROR_MORE_DATA) { + WARN("GetOverlappedResult failed with error %ld\n", GetLastError()); + status = RPC_S_PROTOCOL_ERROR; + goto fail; + } + } } if (dwRead != data_length) { status = RPC_S_PROTOCOL_ERROR; @@ -403,10 +433,16 @@ RPC_STATUS RPCRT4_Receive(RpcConnection *Connection, RpcPktHdr **Header, TRACE("next header\n"); /* read the header of next packet */ - if (!ReadFile(Connection->conn, *Header, hdr_length, &dwRead, NULL)) { + ResetEvent(Connection->ovl.hEvent); + if (!ReadFile(Connection->conn, *Header, hdr_length, &dwRead, &Connection->ovl)) { + WARN("ReadFile failed with error %ld\n", GetLastError()); + status = GetLastError(); + goto fail; + } + if (!GetOverlappedResult(Connection->conn, &Connection->ovl, &dwRead, TRUE)) { if (GetLastError() != ERROR_MORE_DATA) { - WARN("ReadFile failed with error %ld\n", GetLastError()); - status = GetLastError(); + WARN("GetOverlappedResult failed with error %ld\n", GetLastError()); + status = RPC_S_PROTOCOL_ERROR; goto fail; } }