server: Support FSCTL_PIPE_PEEK in byte mode.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 1ec1ff4..2141f44 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -930,21 +930,33 @@
 
     LIST_FOR_EACH_ENTRY( message, &pipe_end->message_queue, struct pipe_message, entry )
         avail += message->iosb->in_size - message->read_pos;
+    reply_size = min( reply_size, avail );
 
-    if (avail)
+    if (avail && (pipe_end->flags & NAMED_PIPE_MESSAGE_STREAM_WRITE))
     {
         message = LIST_ENTRY( list_head(&pipe_end->message_queue), struct pipe_message, entry );
         message_length = message->iosb->in_size - message->read_pos;
         reply_size = min( reply_size, message_length );
     }
-    else reply_size = 0;
 
     if (!(buffer = set_reply_data_size( offsetof( FILE_PIPE_PEEK_BUFFER, Data[reply_size] )))) return 0;
     buffer->NamedPipeState    = 0;  /* FIXME */
     buffer->ReadDataAvailable = avail;
     buffer->NumberOfMessages  = 0;  /* FIXME */
     buffer->MessageLength     = message_length;
-    if (reply_size) memcpy( buffer->Data, (const char *)message->iosb->in_data + message->read_pos, reply_size );
+
+    if (reply_size)
+    {
+        data_size_t write_pos = 0, writing;
+        LIST_FOR_EACH_ENTRY( message, &pipe_end->message_queue, struct pipe_message, entry )
+        {
+            writing = min( reply_size - write_pos, message->iosb->in_size - message->read_pos );
+            memcpy( buffer->Data + write_pos, (const char *)message->iosb->in_data + message->read_pos,
+                    writing );
+            write_pos += writing;
+            if (write_pos == reply_size) break;
+        }
+    }
     return 1;
 }