Jacek Caban : server: Support FSCTL_PIPE_PEEK in byte mode.

Alexandre Julliard julliard at winehq.org
Wed Oct 4 15:37:14 CDT 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Oct  4 15:17:52 2017 +0200

server: Support FSCTL_PIPE_PEEK in byte mode.

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

---

 server/named_pipe.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

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 @@ static int pipe_end_peek( struct pipe_end *pipe_end )
 
     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;
 }
 




More information about the wine-cvs mailing list