Bernhard Loos : server: Store sharing state for named pipes.

Alexandre Julliard julliard at winehq.org
Tue Sep 27 13:00:07 CDT 2011


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

Author: Bernhard Loos <bernhardloos at googlemail.com>
Date:   Mon Sep 26 13:57:15 2011 +0200

server: Store sharing state for named pipes.

---

 dlls/kernel32/sync.c           |   15 ++++++++-------
 dlls/ntdll/file.c              |    1 +
 include/wine/server_protocol.h |    6 ++++--
 server/named_pipe.c            |    2 ++
 server/protocol.def            |    1 +
 server/request.h               |   13 +++++++------
 server/trace.c                 |    1 +
 7 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/dlls/kernel32/sync.c b/dlls/kernel32/sync.c
index 3f627a4..9630258 100644
--- a/dlls/kernel32/sync.c
+++ b/dlls/kernel32/sync.c
@@ -1346,7 +1346,7 @@ HANDLE WINAPI CreateNamedPipeW( LPCWSTR name, DWORD dwOpenMode,
     HANDLE handle;
     UNICODE_STRING nt_name;
     OBJECT_ATTRIBUTES attr;
-    DWORD access, options;
+    DWORD access, options, sharing;
     BOOLEAN pipe_type, read_mode, non_block;
     NTSTATUS status;
     IO_STATUS_BLOCK iosb;
@@ -1379,15 +1379,15 @@ HANDLE WINAPI CreateNamedPipeW( LPCWSTR name, DWORD dwOpenMode,
     switch(dwOpenMode & 3)
     {
     case PIPE_ACCESS_INBOUND:
-        options = FILE_PIPE_INBOUND;
+        sharing = FILE_SHARE_WRITE;
         access  = GENERIC_READ;
         break;
     case PIPE_ACCESS_OUTBOUND:
-        options = FILE_PIPE_OUTBOUND;
+        sharing = FILE_SHARE_READ;
         access  = GENERIC_WRITE;
         break;
     case PIPE_ACCESS_DUPLEX:
-        options = FILE_PIPE_FULL_DUPLEX;
+        sharing = FILE_SHARE_READ | FILE_SHARE_WRITE;
         access  = GENERIC_READ | GENERIC_WRITE;
         break;
     default:
@@ -1395,6 +1395,7 @@ HANDLE WINAPI CreateNamedPipeW( LPCWSTR name, DWORD dwOpenMode,
         return INVALID_HANDLE_VALUE;
     }
     access |= SYNCHRONIZE;
+    options = 0;
     if (dwOpenMode & FILE_FLAG_WRITE_THROUGH) options |= FILE_WRITE_THROUGH;
     if (!(dwOpenMode & FILE_FLAG_OVERLAPPED)) options |= FILE_SYNCHRONOUS_IO_NONALERT;
     pipe_type = (dwPipeMode & PIPE_TYPE_MESSAGE) ? TRUE : FALSE;
@@ -1406,7 +1407,7 @@ HANDLE WINAPI CreateNamedPipeW( LPCWSTR name, DWORD dwOpenMode,
 
     SetLastError(0);
 
-    status = NtCreateNamedPipeFile(&handle, access, &attr, &iosb, 0,
+    status = NtCreateNamedPipeFile(&handle, access, &attr, &iosb, sharing,
                                    FILE_OVERWRITE_IF, options, pipe_type,
                                    read_mode, non_block, nMaxInstances,
                                    nInBufferSize, nOutBufferSize, &timeout);
@@ -1847,8 +1848,8 @@ BOOL WINAPI CreatePipe( PHANDLE hReadPipe, PHANDLE hWritePipe,
                   GetCurrentProcessId(), ++index);
         RtlInitUnicodeString(&nt_name, name);
         status = NtCreateNamedPipeFile(&hr, GENERIC_READ | SYNCHRONIZE, &attr, &iosb,
-                                       0, FILE_OVERWRITE_IF,
-                                       FILE_SYNCHRONOUS_IO_NONALERT | FILE_PIPE_INBOUND,
+                                       FILE_SHARE_WRITE, FILE_OVERWRITE_IF,
+                                       FILE_SYNCHRONOUS_IO_NONALERT,
                                        FALSE, FALSE, FALSE, 
                                        1, size, size, &timeout);
         if (status)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 4d49956..278da5d 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -2781,6 +2781,7 @@ NTSTATUS WINAPI NtCreateNamedPipeFile( PHANDLE handle, ULONG access,
         req->attributes = attr->Attributes;
         req->rootdir = wine_server_obj_handle( attr->RootDirectory );
         req->options = options;
+        req->sharing = sharing;
         req->flags = 
             (pipe_type) ? NAMED_PIPE_MESSAGE_STREAM_WRITE : 0 |
             (read_mode) ? NAMED_PIPE_MESSAGE_STREAM_READ  : 0 |
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index ee438b4..9db7f78 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -3030,13 +3030,15 @@ struct create_named_pipe_request
     unsigned int   attributes;
     obj_handle_t   rootdir;
     unsigned int   options;
+    unsigned int   sharing;
     unsigned int   maxinstances;
     unsigned int   outsize;
     unsigned int   insize;
+    char __pad_44[4];
     timeout_t      timeout;
     unsigned int   flags;
     /* VARARG(name,unicode_str); */
-    char __pad_52[4];
+    char __pad_60[4];
 };
 struct create_named_pipe_reply
 {
@@ -5635,6 +5637,6 @@ union generic_reply
     struct set_suspend_context_reply set_suspend_context_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 425
+#define SERVER_PROTOCOL_VERSION 426
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 29d5c5e..9a37acb 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -91,6 +91,7 @@ struct named_pipe
 {
     struct object       obj;         /* object header */
     unsigned int        flags;
+    unsigned int        sharing;
     unsigned int        maxinstances;
     unsigned int        outsize;
     unsigned int        insize;
@@ -960,6 +961,7 @@ DECL_HANDLER(create_named_pipe)
         pipe->maxinstances = req->maxinstances;
         pipe->timeout = req->timeout;
         pipe->flags = req->flags;
+        pipe->sharing = req->sharing;
     }
     else
     {
diff --git a/server/protocol.def b/server/protocol.def
index 123f16a..71524a4 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -2186,6 +2186,7 @@ enum message_type
     unsigned int   attributes;   /* object attributes */
     obj_handle_t   rootdir;      /* root directory */
     unsigned int   options;
+    unsigned int   sharing;
     unsigned int   maxinstances;
     unsigned int   outsize;
     unsigned int   insize;
diff --git a/server/request.h b/server/request.h
index d2ca2f6..2d4528a 100644
--- a/server/request.h
+++ b/server/request.h
@@ -1477,12 +1477,13 @@ C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, access) == 12 );
 C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, attributes) == 16 );
 C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, rootdir) == 20 );
 C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, options) == 24 );
-C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, maxinstances) == 28 );
-C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, outsize) == 32 );
-C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, insize) == 36 );
-C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, timeout) == 40 );
-C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, flags) == 48 );
-C_ASSERT( sizeof(struct create_named_pipe_request) == 56 );
+C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, sharing) == 28 );
+C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, maxinstances) == 32 );
+C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, outsize) == 36 );
+C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, insize) == 40 );
+C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, timeout) == 48 );
+C_ASSERT( FIELD_OFFSET(struct create_named_pipe_request, flags) == 56 );
+C_ASSERT( sizeof(struct create_named_pipe_request) == 64 );
 C_ASSERT( FIELD_OFFSET(struct create_named_pipe_reply, handle) == 8 );
 C_ASSERT( sizeof(struct create_named_pipe_reply) == 16 );
 C_ASSERT( FIELD_OFFSET(struct get_named_pipe_info_request, handle) == 12 );
diff --git a/server/trace.c b/server/trace.c
index 37ea216..670958a 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -2607,6 +2607,7 @@ static void dump_create_named_pipe_request( const struct create_named_pipe_reque
     fprintf( stderr, ", attributes=%08x", req->attributes );
     fprintf( stderr, ", rootdir=%04x", req->rootdir );
     fprintf( stderr, ", options=%08x", req->options );
+    fprintf( stderr, ", sharing=%08x", req->sharing );
     fprintf( stderr, ", maxinstances=%08x", req->maxinstances );
     fprintf( stderr, ", outsize=%08x", req->outsize );
     fprintf( stderr, ", insize=%08x", req->insize );




More information about the wine-cvs mailing list