/* FIXME: check if in blocking mode */
if (Fcb->ReadDataAvailable == 0)
{
- KeResetEvent(&Fcb->Event);
if (Fcb->PipeState == FILE_PIPE_CONNECTED_STATE)
{
KeSetEvent(&WriterFcb->Event, IO_NO_INCREMENT, FALSE);
if (Length == 0)
{
KeSetEvent(&WriterFcb->Event, IO_NO_INCREMENT, FALSE);
+ KeResetEvent(&Fcb->Event);
break;
}
}
#endif
Information = CopyLength;
- Fcb->ReadDataAvailable = 0;
- Fcb->WriteQuotaAvailable = Fcb->MaxDataLength;
+
+ if (Fcb->ReadDataAvailable > Length)
+ {
+ memmove(Fcb->Data, Fcb->Data + Length,
+ Fcb->ReadDataAvailable - Length);
+ Fcb->ReadDataAvailable -= Length;
+ Status = STATUS_MORE_ENTRIES;
+ }
+ else
+ {
+ Fcb->ReadDataAvailable = 0;
+ Fcb->WriteQuotaAvailable = Fcb->MaxDataLength;
+ }
}
if (Information > 0)
{
KeSetEvent(&WriterFcb->Event, IO_NO_INCREMENT, FALSE);
}
+ KeResetEvent(&Fcb->Event);
break;
}
}
{
if (ReaderFcb->WriteQuotaAvailable == 0)
{
- KeResetEvent(&Fcb->Event);
KeSetEvent(&ReaderFcb->Event, IO_NO_INCREMENT, FALSE);
KeReleaseSpinLock(&ReaderFcb->DataListLock, OldIrql);
if (Fcb->PipeState != FILE_PIPE_CONNECTED_STATE)
if (Length == 0)
{
KeSetEvent(&ReaderFcb->Event, IO_NO_INCREMENT, FALSE);
+ KeResetEvent(&Fcb->Event);
break;
}
}
if (Information > 0)
{
KeSetEvent(&ReaderFcb->Event, IO_NO_INCREMENT, FALSE);
+ KeResetEvent(&Fcb->Event);
break;
}
}