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;