Jacek Caban : rpcrt4: Use named pipe in overlapped mode.

Alexandre Julliard julliard at winehq.org
Mon May 22 15:54:04 CDT 2017


Module: wine
Branch: master
Commit: 4f4ac8c40ee5b7a0adc7d3589667b889556ffcb3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4f4ac8c40ee5b7a0adc7d3589667b889556ffcb3

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon May 22 16:04:15 2017 +0200

rpcrt4: Use named pipe in overlapped mode.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/rpcrt4/rpc_transport.c | 40 ++++++++++++++++++++++++++++++++++++----
 1 file changed, 36 insertions(+), 4 deletions(-)

diff --git a/dlls/rpcrt4/rpc_transport.c b/dlls/rpcrt4/rpc_transport.c
index 6fa1e60..98fa597 100644
--- a/dlls/rpcrt4/rpc_transport.c
+++ b/dlls/rpcrt4/rpc_transport.c
@@ -75,6 +75,16 @@ static RpcConnection *rpcrt4_conn_np_alloc(void)
   return &npc->common;
 }
 
+static HANDLE get_np_event(void)
+{
+    return CreateEventW(NULL, TRUE, FALSE, NULL);
+}
+
+static void release_np_event(HANDLE event)
+{
+    CloseHandle(event);
+}
+
 static DWORD CALLBACK listen_thread(void *arg)
 {
   RpcConnection_np *npc = arg;
@@ -123,7 +133,7 @@ static RPC_STATUS rpcrt4_conn_create_pipe(RpcConnection *Connection, LPCSTR pnam
   RpcConnection_np *npc = (RpcConnection_np *) Connection;
   TRACE("listening on %s\n", pname);
 
-  npc->pipe = CreateNamedPipeA(pname, PIPE_ACCESS_DUPLEX,
+  npc->pipe = CreateNamedPipeA(pname, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
                                PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE,
                                PIPE_UNLIMITED_INSTANCES,
                                RPC_MAX_PACKET_SIZE, RPC_MAX_PACKET_SIZE, 5000, NULL);
@@ -175,7 +185,7 @@ static RPC_STATUS rpcrt4_conn_open_pipe(RpcConnection *Connection, LPCSTR pname,
             dwFlags |= SECURITY_CONTEXT_TRACKING;
     }
     pipe = CreateFileA(pname, GENERIC_READ|GENERIC_WRITE, 0, NULL,
-                       OPEN_EXISTING, dwFlags, 0);
+                       OPEN_EXISTING, dwFlags | FILE_FLAG_OVERLAPPED, 0);
     if (pipe != INVALID_HANDLE_VALUE) break;
     err = GetLastError();
     if (err == ERROR_PIPE_BUSY) {
@@ -413,9 +423,20 @@ static int rpcrt4_conn_np_read(RpcConnection *conn, void *buffer, unsigned int c
 {
     RpcConnection_np *connection = (RpcConnection_np *) conn;
     IO_STATUS_BLOCK io_status;
+    HANDLE event;
     NTSTATUS status;
 
-    status = NtReadFile(connection->pipe, NULL, NULL, NULL, &io_status, buffer, count, NULL, NULL);
+    event = get_np_event();
+    if (!event)
+        return -1;
+
+    status = NtReadFile(connection->pipe, event, NULL, NULL, &io_status, buffer, count, NULL, NULL);
+    if (status == STATUS_PENDING)
+    {
+        WaitForSingleObject(event, INFINITE);
+        status = io_status.Status;
+    }
+    release_np_event(event);
     return status && status != STATUS_BUFFER_OVERFLOW ? -1 : io_status.Information;
 }
 
@@ -423,9 +444,20 @@ static int rpcrt4_conn_np_write(RpcConnection *conn, const void *buffer, unsigne
 {
     RpcConnection_np *connection = (RpcConnection_np *) conn;
     IO_STATUS_BLOCK io_status;
+    HANDLE event;
     NTSTATUS status;
 
-    status = NtWriteFile(connection->pipe, NULL, NULL, NULL, &io_status, buffer, count, NULL, NULL);
+    event = get_np_event();
+    if (!event)
+        return -1;
+
+    status = NtWriteFile(connection->pipe, event, NULL, NULL, &io_status, buffer, count, NULL, NULL);
+    if (status == STATUS_PENDING)
+    {
+        WaitForSingleObject(event, INFINITE);
+        status = io_status.Status;
+    }
+    release_np_event(event);
     if (status)
         return -1;
 




More information about the wine-cvs mailing list