mirror of
https://github.com/reactos/reactos.git
synced 2024-07-28 15:19:09 +00:00
[NPFS-NEW]: Fix moar bougs. pipe: 33920 tests execute (0 marked as todo, 84 failures), 0 skipped. Note that this is already better than trunk's npfs!
svn path=/trunk/; revision=60067
This commit is contained in:
parent
4f9c6d1106
commit
fb79499369
|
@ -175,9 +175,9 @@ NpGetNextRealDataQueueEntry(IN PNP_DATA_QUEUE DataQueue,
|
||||||
PLIST_ENTRY NextEntry;
|
PLIST_ENTRY NextEntry;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
DataEntry = NULL;
|
|
||||||
|
|
||||||
NextEntry = DataQueue->Queue.Flink;
|
NextEntry = DataQueue->Queue.Flink;
|
||||||
|
DataEntry = CONTAINING_RECORD(NextEntry, NP_DATA_QUEUE_ENTRY, QueueEntry);
|
||||||
|
|
||||||
while (NextEntry != &DataQueue->Queue)
|
while (NextEntry != &DataQueue->Queue)
|
||||||
{
|
{
|
||||||
DataEntry = CONTAINING_RECORD(NextEntry, NP_DATA_QUEUE_ENTRY, QueueEntry);
|
DataEntry = CONTAINING_RECORD(NextEntry, NP_DATA_QUEUE_ENTRY, QueueEntry);
|
||||||
|
|
|
@ -37,11 +37,11 @@ NpCommonFlushBuffers(IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
|
||||||
if (NamedPipeEnd == FILE_PIPE_SERVER_END)
|
if (NamedPipeEnd == FILE_PIPE_SERVER_END)
|
||||||
{
|
{
|
||||||
FlushQueue = &Ccb->DataQueue[FILE_PIPE_INBOUND];
|
FlushQueue = &Ccb->DataQueue[FILE_PIPE_OUTBOUND];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FlushQueue = &Ccb->DataQueue[FILE_PIPE_OUTBOUND];
|
FlushQueue = &Ccb->DataQueue[FILE_PIPE_INBOUND];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FlushQueue->QueueState == WriteEntries)
|
if (FlushQueue->QueueState == WriteEntries)
|
||||||
|
@ -81,6 +81,12 @@ NpFsdFlushBuffers(IN PDEVICE_OBJECT DeviceObject,
|
||||||
NpReleaseVcb();
|
NpReleaseVcb();
|
||||||
FsRtlExitFileSystem();
|
FsRtlExitFileSystem();
|
||||||
|
|
||||||
|
if (Status != STATUS_PENDING)
|
||||||
|
{
|
||||||
|
Irp->IoStatus.Status = Status;
|
||||||
|
IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
|
||||||
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -351,6 +351,8 @@ NpReleaseVcb(VOID)
|
||||||
ExReleaseResourceLite(&NpVcb->Lock);
|
ExReleaseResourceLite(&NpVcb->Lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Function to process deferred IRPs outside the VCB lock but still within the
|
// Function to process deferred IRPs outside the VCB lock but still within the
|
||||||
// critical region
|
// critical region
|
||||||
|
|
|
@ -75,7 +75,7 @@ NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue,
|
||||||
}
|
}
|
||||||
|
|
||||||
DataLength = Offset;
|
DataLength = Offset;
|
||||||
if (Offset >= RemainingSize) DataLength = RemainingSize;
|
if (DataLength >= RemainingSize) DataLength = RemainingSize;
|
||||||
|
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
@ -130,14 +130,17 @@ NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue,
|
||||||
InsertTailList(List, &Irp->Tail.Overlay.ListEntry);
|
InsertTailList(List, &Irp->Tail.Overlay.ListEntry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Mode == FILE_PIPE_MESSAGE_MODE)
|
if (Mode == FILE_PIPE_MESSAGE_MODE)
|
||||||
{
|
{
|
||||||
Status.Status = STATUS_SUCCESS;
|
Status.Status = STATUS_SUCCESS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(!ReadOverflowOperation);
|
ASSERT(!ReadOverflowOperation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Peek)
|
if (Peek)
|
||||||
{
|
{
|
||||||
DataEntry = CONTAINING_RECORD(DataEntry->QueueEntry.Flink,
|
DataEntry = CONTAINING_RECORD(DataEntry->QueueEntry.Flink,
|
||||||
|
|
|
@ -36,7 +36,7 @@ NpCommonWrite(IN PFILE_OBJECT FileObject,
|
||||||
PNP_DATA_QUEUE WriteQueue;
|
PNP_DATA_QUEUE WriteQueue;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PNP_EVENT_BUFFER EventBuffer;
|
PNP_EVENT_BUFFER EventBuffer;
|
||||||
ULONG BytesWritten, NamedPipeEnd;
|
ULONG BytesWritten, NamedPipeEnd, ReadMode;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
IoStatus->Information = 0;
|
IoStatus->Information = 0;
|
||||||
|
@ -91,10 +91,12 @@ NpCommonWrite(IN PFILE_OBJECT FileObject,
|
||||||
if (NamedPipeEnd == FILE_PIPE_SERVER_END)
|
if (NamedPipeEnd == FILE_PIPE_SERVER_END)
|
||||||
{
|
{
|
||||||
WriteQueue = &Ccb->DataQueue[FILE_PIPE_OUTBOUND];
|
WriteQueue = &Ccb->DataQueue[FILE_PIPE_OUTBOUND];
|
||||||
|
ReadMode = Ccb->ReadMode[FILE_PIPE_CLIENT_END];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WriteQueue = &Ccb->DataQueue[FILE_PIPE_INBOUND];
|
WriteQueue = &Ccb->DataQueue[FILE_PIPE_INBOUND];
|
||||||
|
ReadMode = Ccb->ReadMode[FILE_PIPE_SERVER_END];
|
||||||
}
|
}
|
||||||
|
|
||||||
EventBuffer = NonPagedCcb->EventBuffer[NamedPipeEnd];
|
EventBuffer = NonPagedCcb->EventBuffer[NamedPipeEnd];
|
||||||
|
@ -122,7 +124,7 @@ NpCommonWrite(IN PFILE_OBJECT FileObject,
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = NpWriteDataQueue(WriteQueue,
|
Status = NpWriteDataQueue(WriteQueue,
|
||||||
Ccb->ReadMode[NamedPipeEnd],
|
ReadMode,
|
||||||
Buffer,
|
Buffer,
|
||||||
DataSize,
|
DataSize,
|
||||||
Ccb->Fcb->NamedPipeType,
|
Ccb->Fcb->NamedPipeType,
|
||||||
|
@ -136,8 +138,8 @@ NpCommonWrite(IN PFILE_OBJECT FileObject,
|
||||||
if (Status == STATUS_MORE_PROCESSING_REQUIRED)
|
if (Status == STATUS_MORE_PROCESSING_REQUIRED)
|
||||||
{
|
{
|
||||||
ASSERT(WriteQueue->QueueState != ReadEntries);
|
ASSERT(WriteQueue->QueueState != ReadEntries);
|
||||||
if ((Ccb->CompletionMode[NamedPipeEnd] == FILE_PIPE_COMPLETE_OPERATION || !Irp)
|
if ((Ccb->CompletionMode[NamedPipeEnd] == FILE_PIPE_COMPLETE_OPERATION || !Irp) &&
|
||||||
&& WriteQueue->Quota - WriteQueue->QuotaUsed < BytesWritten)
|
((WriteQueue->Quota - WriteQueue->QuotaUsed) < BytesWritten))
|
||||||
{
|
{
|
||||||
IoStatus->Information = DataSize - BytesWritten;
|
IoStatus->Information = DataSize - BytesWritten;
|
||||||
IoStatus->Status = STATUS_SUCCESS;
|
IoStatus->Status = STATUS_SUCCESS;
|
||||||
|
|
Loading…
Reference in a new issue