[PATCH 1/2] kernel32: Implement bytes left in PeekNamedPipe().

Zebediah Figura z.figura12 at gmail.com
Sat May 20 16:52:56 CDT 2017


Fixes https://bugs.winehq.org/show_bug.cgi?id=42348

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/kernel32/sync.c | 2 +-
 server/named_pipe.c  | 6 ++++--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/dlls/kernel32/sync.c b/dlls/kernel32/sync.c
index ee995f55af..d3d46b7dc8 100644
--- a/dlls/kernel32/sync.c
+++ b/dlls/kernel32/sync.c
@@ -1475,7 +1475,7 @@ BOOL WINAPI PeekNamedPipe( HANDLE hPipe, LPVOID lpvBuffer, DWORD cbBuffer,
         ULONG read_size = io.Information - FIELD_OFFSET( FILE_PIPE_PEEK_BUFFER, Data );
         if (lpcbAvail) *lpcbAvail = buffer->ReadDataAvailable;
         if (lpcbRead) *lpcbRead = read_size;
-        if (lpcbMessage) *lpcbMessage = 0;  /* FIXME */
+        if (lpcbMessage) *lpcbMessage = buffer->MessageLength - read_size;
         if (lpvBuffer) memcpy( lpvBuffer, buffer->Data, read_size );
     }
     else SetLastError( RtlNtStatusToDosError(status) );
diff --git a/server/named_pipe.c b/server/named_pipe.c
index b8ea4264c2..0c314bd2e1 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -927,6 +927,7 @@ static void pipe_end_peek( struct pipe_end *pipe_end )
     FILE_PIPE_PEEK_BUFFER *buffer;
     struct pipe_message *message;
     data_size_t avail = 0;
+    data_size_t message_length = 0;
 
     if (!use_server_io( pipe_end ))
     {
@@ -947,7 +948,8 @@ static void pipe_end_peek( struct pipe_end *pipe_end )
     if (avail)
     {
         message = LIST_ENTRY( list_head(&pipe_end->message_queue), struct pipe_message, entry );
-        reply_size = min( reply_size, message->iosb->in_size - message->read_pos );
+        message_length = message->iosb->in_size - message->read_pos;
+        reply_size = min( reply_size, message_length );
     }
     else reply_size = 0;
 
@@ -955,7 +957,7 @@ static void pipe_end_peek( struct pipe_end *pipe_end )
     buffer->NamedPipeState    = 0;  /* FIXME */
     buffer->ReadDataAvailable = avail;
     buffer->NumberOfMessages  = 0;  /* FIXME */
-    buffer->MessageLength     = 0;  /* FIXME */
+    buffer->MessageLength     = message_length;
     if (reply_size) memcpy( buffer->Data, (const char *)message->iosb->in_data + message->read_pos, reply_size );
 }
 
-- 
2.13.0




More information about the wine-patches mailing list