+ if (Pipe->WriteMode == FILE_PIPE_BYTE_STREAM_MODE)
+ {
+ DPRINT("Byte stream mode\n");
+ while (Length > 0 && ReaderFcb->WriteQuotaAvailable > 0)
+ {
+ CopyLength = RtlRosMin(Length, ReaderFcb->WriteQuotaAvailable);
+ if (ReaderFcb->WritePtr + CopyLength <= ReaderFcb->Data + ReaderFcb->MaxDataLength)
+ {
+ memcpy(ReaderFcb->WritePtr, Buffer, CopyLength);
+ ReaderFcb->WritePtr += CopyLength;
+ if (ReaderFcb->WritePtr == ReaderFcb->Data + ReaderFcb->MaxDataLength)
+ {
+ ReaderFcb->WritePtr = ReaderFcb->Data;
+ }
+ }
+ else
+ {
+ TempLength = ReaderFcb->Data + ReaderFcb->MaxDataLength - ReaderFcb->WritePtr;
+ memcpy(ReaderFcb->WritePtr, Buffer, TempLength);
+ memcpy(ReaderFcb->Data, Buffer + TempLength, CopyLength - TempLength);
+ ReaderFcb->WritePtr = ReaderFcb->Data + CopyLength - TempLength;
+ }
+
+ Buffer += CopyLength;
+ Length -= CopyLength;
+ Information += CopyLength;
+
+ ReaderFcb->ReadDataAvailable += CopyLength;
+ ReaderFcb->WriteQuotaAvailable -= CopyLength;
+ }
+
+ if (Length == 0)
+ {
+ KeSetEvent(&ReaderFcb->Event, IO_NO_INCREMENT, FALSE);
+ break;
+ }
+ }
+ else
+ {
+ DPRINT("Message mode\n");
+ if (Length > 0)
+ {
+ CopyLength = RtlRosMin(Length, ReaderFcb->WriteQuotaAvailable);
+ memcpy(ReaderFcb->Data, Buffer, CopyLength);
+
+ Information = CopyLength;
+ ReaderFcb->ReadDataAvailable = CopyLength;
+ ReaderFcb->WriteQuotaAvailable = 0;
+ }
+
+ if (Information > 0)
+ {
+ KeSetEvent(&ReaderFcb->Event, IO_NO_INCREMENT, FALSE);
+ break;
+ }
+ }