Hartmut Birr wrote:
Possible that is not correct. I see debug messages from
read and write
request at the same time. I see also that the written length from write
request is shown as result for a read request. I've add a local
overlapped structure in RPCRT4_Send. This does fix this problem.
Forgot to add the diff.
- Hartmut
Index: lib/rpcrt4/rpc_message.c
===================================================================
--- lib/rpcrt4/rpc_message.c (revision 14297)
+++ lib/rpcrt4/rpc_message.c (working copy)
@@ -44,6 +44,12 @@
WINE_DEFAULT_DEBUG_CHANNEL(ole);
+#undef WARN
+#define WARN DPRINT1
+
+#undef TRACE
+#define TRACE DPRINT1
+
DWORD RPCRT4_GetHeaderSize(RpcPktHdr *Header)
{
static const DWORD header_sizes[] = {
@@ -247,7 +253,14 @@
{
PUCHAR buffer_pos;
DWORD hdr_size, count;
+ OVERLAPPED ovl;
+ RPC_STATUS status;
+ memset(&ovl, 0, sizeof(OVERLAPPED));
+ ovl.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+ TRACE("%x %x %x %d\n", Connection, Header, Buffer, BufferLength);
+
buffer_pos = Buffer;
/* The packet building functions save the packet header size, so we can use it. */
hdr_size = Header->common.frag_len;
@@ -265,35 +278,45 @@
}
/* transmit packet header */
- if (!WriteFile(Connection->conn, Header, hdr_size, &count,
&Connection->ovl)) {
+ if (!WriteFile(Connection->conn, Header, hdr_size, &count,
&/*Connection->*/ovl) &&
+ ERROR_IO_PENDING != GetLastError()) {
WARN("WriteFile failed with error %ld\n", GetLastError());
- return GetLastError();
+ status = GetLastError();
+ goto done;
}
- if (!GetOverlappedResult(Connection->conn, &Connection->ovl, &count,
TRUE)) {
+ if (!GetOverlappedResult(Connection->conn, &/*Connection->*/ovl,
&count, TRUE)) {
WARN("GetOverlappedResult failed with error %ld\n", GetLastError());
- return GetLastError();
+ status = GetLastError();
+ goto done;
}
/* fragment consisted of header only and is the last one */
if (hdr_size == Header->common.frag_len &&
Header->common.flags & RPC_FLG_LAST) {
- return RPC_S_OK;
+ status =RPC_S_OK;
+ goto done;
}
/* send the fragment data */
- if (!WriteFile(Connection->conn, buffer_pos, Header->common.frag_len -
hdr_size, &count, &Connection->ovl)) {
+ if (!WriteFile(Connection->conn, buffer_pos, Header->common.frag_len -
hdr_size, &count, &/*Connection->*/ovl) &&
+ ERROR_IO_PENDING != GetLastError()) {
WARN("WriteFile failed with error %ld\n", GetLastError());
- return GetLastError();
+ status = GetLastError();
+ goto done;
}
- if (!GetOverlappedResult(Connection->conn, &Connection->ovl, &count,
TRUE)) {
+ if (!GetOverlappedResult(Connection->conn, &/*Connection->*/ovl,
&count, TRUE)) {
WARN("GetOverlappedResult failed with error %ld\n", GetLastError());
- return GetLastError();
+ status = GetLastError();
+ goto done;
}
Header->common.flags &= ~RPC_FLG_FIRST;
}
- return RPC_S_OK;
+ status = RPC_S_OK;
+done:
+ CloseHandle(ovl.hEvent);
+ return status;
}
/***********************************************************************
@@ -317,7 +340,8 @@
TRACE("(%p, %p, %p)\n", Connection, Header, pMsg);
/* read packet common header */
- if (!ReadFile(Connection->conn, &common_hdr, sizeof(common_hdr), &dwRead,
&Connection->ovl)) {
+ if (!ReadFile(Connection->conn, &common_hdr, sizeof(common_hdr), &dwRead,
&Connection->ovl) &&
+ ERROR_IO_PENDING != GetLastError()) {
WARN("ReadFile failed with error %ld\n", GetLastError());
status = RPC_S_PROTOCOL_ERROR;
goto fail;
@@ -355,7 +379,8 @@
/* read the rest of packet header */
if (!ReadFile(Connection->conn, &(*Header)->common + 1,
- hdr_length - sizeof(common_hdr), &dwRead, &Connection->ovl))
{
+ hdr_length - sizeof(common_hdr), &dwRead, &Connection->ovl)
&&
+ ERROR_IO_PENDING != GetLastError()) {
WARN("ReadFile failed with error %ld\n", GetLastError());
status = RPC_S_PROTOCOL_ERROR;
goto fail;
@@ -405,7 +430,8 @@
}
if (data_length == 0) dwRead = 0; else {
- if (!ReadFile(Connection->conn, buffer_ptr, data_length, &dwRead,
&Connection->ovl)) {
+ if (!ReadFile(Connection->conn, buffer_ptr, data_length, &dwRead,
&Connection->ovl) &&
+ ERROR_IO_PENDING != GetLastError()) {
WARN("ReadFile failed with error %ld\n", GetLastError());
status = RPC_S_PROTOCOL_ERROR;
goto fail;
@@ -437,7 +463,8 @@
TRACE("next header\n");
/* read the header of next packet */
- if (!ReadFile(Connection->conn, *Header, hdr_length, &dwRead,
&Connection->ovl)) {
+ if (!ReadFile(Connection->conn, *Header, hdr_length, &dwRead,
&Connection->ovl) &&
+ ERROR_IO_PENDING != GetLastError()) {
WARN("ReadFile failed with error %ld\n", GetLastError());
status = GetLastError();
goto fail;