[NPFS-NEW]:

NpfsCreate: 339 tests executed (0 marked as todo, 0 failures), 0 skipped.
NpfsConnect: 679 tests executed (0 marked as todo, 0 failures), 0 skipped.
NpfsReadWrite: 7154 tests executed (0 marked as todo, 0 failures), 0 skipped.
NpfsReadWriteAsync: 1176 tests executed (0 marked as todo, 0 failures), 0 skipped.
'Nuff said.

svn path=/trunk/; revision=60028
This commit is contained in:
Alex Ionescu 2013-09-11 07:05:15 +00:00
parent a8e4859598
commit 529ec2cb68
11 changed files with 112 additions and 102 deletions

View file

@ -12,6 +12,7 @@ NpCommonCleanup(IN PDEVICE_OBJECT DeviceObject,
PNP_CCB Ccb; PNP_CCB Ccb;
ULONG NamedPipeEnd; ULONG NamedPipeEnd;
PLIST_ENTRY ThisEntry, NextEntry; PLIST_ENTRY ThisEntry, NextEntry;
PIRP LocalIrp;
PAGED_CODE(); PAGED_CODE();
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
@ -41,8 +42,8 @@ NpCommonCleanup(IN PDEVICE_OBJECT DeviceObject,
ThisEntry = NextEntry; ThisEntry = NextEntry;
NextEntry = NextEntry->Flink; NextEntry = NextEntry->Flink;
Irp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(Irp, IO_DISK_INCREMENT); IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
} }
return STATUS_SUCCESS; return STATUS_SUCCESS;

View file

@ -12,6 +12,7 @@ NpCommonClose(IN PDEVICE_OBJECT DeviceObject,
PNP_CCB Ccb; PNP_CCB Ccb;
ULONG NamedPipeEnd; ULONG NamedPipeEnd;
PLIST_ENTRY ThisEntry, NextEntry; PLIST_ENTRY ThisEntry, NextEntry;
PIRP LocalIrp;
PAGED_CODE(); PAGED_CODE();
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
@ -40,8 +41,8 @@ NpCommonClose(IN PDEVICE_OBJECT DeviceObject,
ThisEntry = NextEntry; ThisEntry = NextEntry;
NextEntry = NextEntry->Flink; NextEntry = NextEntry->Flink;
Irp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(Irp, IO_DISK_INCREMENT); IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
} }
Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Status = STATUS_SUCCESS;

View file

@ -217,11 +217,6 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
FileName = FileObject->FileName; FileName = FileObject->FileName;
DesiredAccess = IoStack->Parameters.CreatePipe.SecurityContext->DesiredAccess; DesiredAccess = IoStack->Parameters.CreatePipe.SecurityContext->DesiredAccess;
DPRINT1("NpfsCreate(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
DPRINT1("FileObject %p\n", FileObject);
DPRINT1("FileName %wZ\n", &FileObject->FileName);
DPRINT1("FileName->Length: %hu RelatedFileObject: %p\n", FileName.Length, RelatedFileObject);
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
@ -346,7 +341,7 @@ Quickie:
NextEntry = NextEntry->Flink; NextEntry = NextEntry->Flink;
ListIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); ListIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(ListIrp, IO_DISK_INCREMENT); IoCompleteRequest(ListIrp, IO_NAMED_PIPE_INCREMENT);
} }
FsRtlExitFileSystem(); FsRtlExitFileSystem();
@ -636,8 +631,6 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
IO_STATUS_BLOCK IoStatus; IO_STATUS_BLOCK IoStatus;
PIRP ListIrp; PIRP ListIrp;
DPRINT1("NpFsdCreateNamedPipe(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
InitializeListHead(&LocalList); InitializeListHead(&LocalList);
Process = IoGetRequestorProcess(Irp); Process = IoGetRequestorProcess(Irp);
@ -659,10 +652,6 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
DPRINT1("FileObject %p\n", FileObject);
DPRINT1("FileName %wZ\n", &FileObject->FileName);
DPRINT1("FileName->Length: %hu RelatedFileObject: %p\n", FileName.Length, RelatedFileObject);
if (RelatedFileObject) if (RelatedFileObject)
{ {
Fcb = (PNP_FCB)((ULONG_PTR)RelatedFileObject->FsContext & ~1); Fcb = (PNP_FCB)((ULONG_PTR)RelatedFileObject->FsContext & ~1);
@ -754,13 +743,13 @@ Quickie:
NextEntry = NextEntry->Flink; NextEntry = NextEntry->Flink;
ListIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); ListIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(ListIrp, IO_DISK_INCREMENT); IoCompleteRequest(ListIrp, IO_NAMED_PIPE_INCREMENT);
} }
FsRtlExitFileSystem(); FsRtlExitFileSystem();
Irp->IoStatus = IoStatus; Irp->IoStatus = IoStatus;
IoCompleteRequest(Irp, IO_DISK_INCREMENT); IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
return IoStatus.Status; return IoStatus.Status;
} }

View file

@ -192,6 +192,7 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject,
PSECURITY_CLIENT_CONTEXT ClientSecurityContext; PSECURITY_CLIENT_CONTEXT ClientSecurityContext;
BOOLEAN CompleteWrites, FirstEntry; BOOLEAN CompleteWrites, FirstEntry;
PLIST_ENTRY NextEntry, ThisEntry; PLIST_ENTRY NextEntry, ThisEntry;
PIRP LocalIrp;
if (DeviceObject) IoReleaseCancelSpinLock(Irp->CancelIrql); if (DeviceObject) IoReleaseCancelSpinLock(Irp->CancelIrql);
@ -263,7 +264,7 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject,
NpFreeClientSecurityContext(ClientSecurityContext); NpFreeClientSecurityContext(ClientSecurityContext);
Irp->IoStatus.Status = STATUS_CANCELLED; Irp->IoStatus.Status = STATUS_CANCELLED;
IoCompleteRequest(Irp, IO_DISK_INCREMENT); IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
NextEntry = List.Flink; NextEntry = List.Flink;
while (NextEntry != &List) while (NextEntry != &List)
@ -271,8 +272,8 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject,
ThisEntry = NextEntry; ThisEntry = NextEntry;
NextEntry = NextEntry->Flink; NextEntry = NextEntry->Flink;
Irp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(Irp, IO_DISK_INCREMENT); IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
} }
} }
@ -307,7 +308,10 @@ NpAddDataQueueEntry(IN ULONG NamedPipeEnd,
Irp ? Irp->Tail.Overlay.Thread : Irp ? Irp->Tail.Overlay.Thread :
PsGetCurrentThread(), PsGetCurrentThread(),
&ClientContext); &ClientContext);
if (!NT_SUCCESS(Status)) return Status; if (!NT_SUCCESS(Status))
{
return Status;
}
} }
switch (Type) switch (Type)
@ -317,29 +321,31 @@ NpAddDataQueueEntry(IN ULONG NamedPipeEnd,
case 3: case 3:
ASSERT(Irp != NULL); ASSERT(Irp != NULL);
DataEntry = ExAllocatePoolWithQuotaTag(NonPagedPool, sizeof(*DataEntry), NPFS_DATA_ENTRY_TAG); DataEntry = ExAllocatePoolWithQuotaTag(NonPagedPool,
if (DataEntry) sizeof(*DataEntry),
NPFS_DATA_ENTRY_TAG);
if (!DataEntry)
{ {
DataEntry->DataEntryType = Type; NpFreeClientSecurityContext(ClientContext);
DataEntry->QuotaInEntry = 0; return STATUS_INSUFFICIENT_RESOURCES;
DataEntry->Irp = Irp;
DataEntry->DataSize = DataSize;
DataEntry->ClientSecurityContext = ClientContext;
ASSERT((DataQueue->QueueState == Empty) || (DataQueue->QueueState == Who));
Status = STATUS_PENDING;
break;
} }
NpFreeClientSecurityContext(ClientContext); DataEntry->DataEntryType = Type;
return STATUS_INSUFFICIENT_RESOURCES; DataEntry->QuotaInEntry = 0;
DataEntry->Irp = Irp;
DataEntry->DataSize = DataSize;
DataEntry->ClientSecurityContext = ClientContext;
ASSERT((DataQueue->QueueState == Empty) || (DataQueue->QueueState == Who));
Status = STATUS_PENDING;
break;
case Buffered: case Buffered:
EntrySize = sizeof(*DataEntry); EntrySize = sizeof(*DataEntry);
if (Who != Empty) if (Who != ReadEntries)
{ {
EntrySize = DataSize + sizeof(*DataEntry); EntrySize += DataSize;
if ((DataSize + sizeof(*DataEntry)) < DataSize) if (EntrySize < DataSize)
{ {
NpFreeClientSecurityContext(ClientContext); NpFreeClientSecurityContext(ClientContext);
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
@ -350,14 +356,16 @@ NpAddDataQueueEntry(IN ULONG NamedPipeEnd,
if (DataQueue->Quota - DataQueue->QuotaUsed < QuotaInEntry) if (DataQueue->Quota - DataQueue->QuotaUsed < QuotaInEntry)
{ {
QuotaInEntry = DataQueue->Quota - DataQueue->QuotaUsed; QuotaInEntry = DataQueue->Quota - DataQueue->QuotaUsed;
HasSpace = 1; HasSpace = TRUE;
} }
else else
{ {
HasSpace = 0; HasSpace = FALSE;
} }
DataEntry = ExAllocatePoolWithQuotaTag(NonPagedPool, EntrySize, NPFS_DATA_ENTRY_TAG); DataEntry = ExAllocatePoolWithQuotaTag(NonPagedPool,
EntrySize,
NPFS_DATA_ENTRY_TAG);
if (!DataEntry) if (!DataEntry)
{ {
NpFreeClientSecurityContext(ClientContext); NpFreeClientSecurityContext(ClientContext);
@ -382,9 +390,9 @@ NpAddDataQueueEntry(IN ULONG NamedPipeEnd,
{ {
_SEH2_TRY _SEH2_TRY
{ {
RtlCopyMemory(DataEntry + 1, RtlCopyMemory(DataEntry + 1,
Irp ? Irp->UserBuffer: Buffer, Irp ? Irp->UserBuffer: Buffer,
DataSize); DataSize);
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
@ -399,12 +407,14 @@ NpAddDataQueueEntry(IN ULONG NamedPipeEnd,
} }
else else
{ {
DataEntry->Irp = 0; DataEntry->Irp = NULL;
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
} }
ASSERT((DataQueue->QueueState == Empty) || (DataQueue->QueueState == Who)); ASSERT((DataQueue->QueueState == Empty) ||
(DataQueue->QueueState == Who));
} }
break;
default: default:
ASSERT(FALSE); ASSERT(FALSE);
@ -429,7 +439,8 @@ NpAddDataQueueEntry(IN ULONG NamedPipeEnd,
DataQueue->QuotaUsed += DataEntry->QuotaInEntry; DataQueue->QuotaUsed += DataEntry->QuotaInEntry;
DataQueue->QueueState = Who; DataQueue->QueueState = Who;
DataQueue->BytesInQueue += DataEntry->DataSize; DataQueue->BytesInQueue += DataEntry->DataSize;
++DataQueue->EntriesInQueue; DataQueue->EntriesInQueue++;
if (ByteOffset) if (ByteOffset)
{ {
DataQueue->ByteOffset = ByteOffset; DataQueue->ByteOffset = ByteOffset;
@ -448,9 +459,8 @@ NpAddDataQueueEntry(IN ULONG NamedPipeEnd,
IoSetCancelRoutine(Irp, NpCancelDataQueueIrp); IoSetCancelRoutine(Irp, NpCancelDataQueueIrp);
if (Irp->Cancel) if ((Irp->Cancel) && (IoSetCancelRoutine(Irp, NULL)))
{ {
IoSetCancelRoutine(Irp, NULL);
NpCancelDataQueueIrp(NULL, Irp); NpCancelDataQueueIrp(NULL, Irp);
} }
} }

View file

@ -102,6 +102,7 @@ NpFsdSetInformation(IN PDEVICE_OBJECT DeviceObject,
NTSTATUS Status; NTSTATUS Status;
LIST_ENTRY List; LIST_ENTRY List;
PLIST_ENTRY NextEntry, ThisEntry; PLIST_ENTRY NextEntry, ThisEntry;
PIRP LocalIrp;
PAGED_CODE(); PAGED_CODE();
InitializeListHead(&List); InitializeListHead(&List);
@ -119,8 +120,8 @@ NpFsdSetInformation(IN PDEVICE_OBJECT DeviceObject,
ThisEntry = NextEntry; ThisEntry = NextEntry;
NextEntry = NextEntry->Flink; NextEntry = NextEntry->Flink;
Irp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(Irp, IO_DISK_INCREMENT); IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
} }
FsRtlExitFileSystem(); FsRtlExitFileSystem();

View file

@ -572,6 +572,7 @@ NpCommonFileSystemControl(IN PDEVICE_OBJECT DeviceObject,
LIST_ENTRY List; LIST_ENTRY List;
PLIST_ENTRY NextEntry, ThisEntry; PLIST_ENTRY NextEntry, ThisEntry;
NTSTATUS Status; NTSTATUS Status;
PIRP LocalIrp;
PAGED_CODE(); PAGED_CODE();
InitializeListHead(&List); InitializeListHead(&List);
@ -667,8 +668,8 @@ NpCommonFileSystemControl(IN PDEVICE_OBJECT DeviceObject,
ThisEntry = NextEntry; ThisEntry = NextEntry;
NextEntry = NextEntry->Flink; NextEntry = NextEntry->Flink;
Irp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(Irp, IO_DISK_INCREMENT); IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
} }
return Status; return Status;

View file

@ -61,8 +61,7 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject,
/* Initialize the device object */ /* Initialize the device object */
NpfsDeviceObject = DeviceObject; NpfsDeviceObject = DeviceObject;
DeviceObject->Flags |= DO_DIRECT_IO; DeviceObject->Flags |= DO_LONG_TERM_REQUESTS;
DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
/* Initialize the Volume Control Block (VCB) */ /* Initialize the Volume Control Block (VCB) */
NpVcb = DeviceObject->DeviceExtension; NpVcb = DeviceObject->DeviceExtension;

View file

@ -144,6 +144,7 @@ NpFsdRead(IN PDEVICE_OBJECT DeviceObject,
IO_STATUS_BLOCK IoStatus; IO_STATUS_BLOCK IoStatus;
LIST_ENTRY List; LIST_ENTRY List;
PLIST_ENTRY NextEntry, ThisEntry; PLIST_ENTRY NextEntry, ThisEntry;
PIRP LocalIrp;
PAGED_CODE(); PAGED_CODE();
NpSlowReadCalls++; NpSlowReadCalls++;
@ -168,8 +169,8 @@ NpFsdRead(IN PDEVICE_OBJECT DeviceObject,
ThisEntry = NextEntry; ThisEntry = NextEntry;
NextEntry = NextEntry->Flink; NextEntry = NextEntry->Flink;
Irp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(Irp, IO_DISK_INCREMENT); IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
} }
FsRtlExitFileSystem(); FsRtlExitFileSystem();

View file

@ -235,6 +235,7 @@ NpSetClosingPipeState(IN PNP_CCB Ccb,
PLIST_ENTRY NextEntry; PLIST_ENTRY NextEntry;
PNP_DATA_QUEUE ReadQueue, WriteQueue, DataQueue; PNP_DATA_QUEUE ReadQueue, WriteQueue, DataQueue;
PNP_EVENT_BUFFER EventBuffer; PNP_EVENT_BUFFER EventBuffer;
PIRP ListIrp;
NonPagedCcb = Ccb->NonPagedCcb; NonPagedCcb = Ccb->NonPagedCcb;
Fcb = Ccb->Fcb; Fcb = Ccb->Fcb;
@ -249,11 +250,11 @@ NpSetClosingPipeState(IN PNP_CCB Ccb,
{ {
NextEntry = RemoveHeadList(&Ccb->IrpList); NextEntry = RemoveHeadList(&Ccb->IrpList);
Irp = CONTAINING_RECORD(NextEntry, IRP, Tail.Overlay.ListEntry); ListIrp = CONTAINING_RECORD(NextEntry, IRP, Tail.Overlay.ListEntry);
if (IoSetCancelRoutine(Irp, NULL)) if (IoSetCancelRoutine(ListIrp, NULL))
{ {
Irp->IoStatus.Status = STATUS_PIPE_BROKEN; ListIrp->IoStatus.Status = STATUS_PIPE_BROKEN;
InsertTailList(List, NextEntry); InsertTailList(List, NextEntry);
} }
else else
@ -297,11 +298,11 @@ NpSetClosingPipeState(IN PNP_CCB Ccb,
while (DataQueue->QueueState != Empty) while (DataQueue->QueueState != Empty)
{ {
Irp = NpRemoveDataQueueEntry(DataQueue, FALSE, List); ListIrp = NpRemoveDataQueueEntry(DataQueue, FALSE, List);
if (Irp) if (ListIrp)
{ {
Irp->IoStatus.Status = STATUS_PIPE_BROKEN; ListIrp->IoStatus.Status = STATUS_PIPE_BROKEN;
InsertTailList(List, &Irp->Tail.Overlay.ListEntry); InsertTailList(List, &ListIrp->Tail.Overlay.ListEntry);
} }
} }
@ -342,21 +343,21 @@ NpSetClosingPipeState(IN PNP_CCB Ccb,
while (ReadQueue->QueueState != Empty) while (ReadQueue->QueueState != Empty)
{ {
Irp = NpRemoveDataQueueEntry(ReadQueue, FALSE, List); ListIrp = NpRemoveDataQueueEntry(ReadQueue, FALSE, List);
if (Irp) if (ListIrp)
{ {
Irp->IoStatus.Status = STATUS_PIPE_BROKEN; ListIrp->IoStatus.Status = STATUS_PIPE_BROKEN;
InsertTailList(List, &Irp->Tail.Overlay.ListEntry); InsertTailList(List, &ListIrp->Tail.Overlay.ListEntry);
} }
} }
while (WriteQueue->QueueState == WriteEntries) while (WriteQueue->QueueState == ReadEntries)
{ {
Irp = NpRemoveDataQueueEntry(WriteQueue, FALSE, List); ListIrp = NpRemoveDataQueueEntry(WriteQueue, FALSE, List);
if (Irp) if (ListIrp)
{ {
Irp->IoStatus.Status = STATUS_PIPE_BROKEN; ListIrp->IoStatus.Status = STATUS_PIPE_BROKEN;
InsertTailList(List, &Irp->Tail.Overlay.ListEntry); InsertTailList(List, &ListIrp->Tail.Overlay.ListEntry);
} }
} }

View file

@ -40,22 +40,26 @@ NpCommonWrite(IN PFILE_OBJECT FileObject,
NonPagedCcb = Ccb->NonPagedCcb; NonPagedCcb = Ccb->NonPagedCcb;
ExAcquireResourceExclusiveLite(&NonPagedCcb->Lock, TRUE); ExAcquireResourceExclusiveLite(&NonPagedCcb->Lock, TRUE);
if (Ccb->NamedPipeState == FILE_PIPE_DISCONNECTED_STATE) if (Ccb->NamedPipeState != FILE_PIPE_CONNECTED_STATE)
{ {
IoStatus->Status = STATUS_PIPE_DISCONNECTED; if (Ccb->NamedPipeState == FILE_PIPE_DISCONNECTED_STATE)
{
IoStatus->Status = STATUS_PIPE_DISCONNECTED;
}
else if (Ccb->NamedPipeState == FILE_PIPE_LISTENING_STATE)
{
IoStatus->Status = STATUS_PIPE_LISTENING;
}
else
{
ASSERT(Ccb->NamedPipeState == FILE_PIPE_CLOSING_STATE);
IoStatus->Status = STATUS_PIPE_CLOSING;
}
WriteOk = TRUE; WriteOk = TRUE;
goto Quickie; goto Quickie;
} }
if (Ccb->NamedPipeState == FILE_PIPE_LISTENING_STATE || Ccb->NamedPipeState == FILE_PIPE_CLOSING_STATE)
{
IoStatus->Status = Ccb->NamedPipeState != FILE_PIPE_LISTENING_STATE ? STATUS_PIPE_LISTENING : STATUS_PIPE_CLOSING;
WriteOk = TRUE;
goto Quickie;
}
ASSERT(Ccb->NamedPipeState == FILE_PIPE_CONNECTED_STATE);
if ((NamedPipeEnd == FILE_PIPE_SERVER_END && Ccb->Fcb->NamedPipeConfiguration == FILE_PIPE_INBOUND) || if ((NamedPipeEnd == FILE_PIPE_SERVER_END && Ccb->Fcb->NamedPipeConfiguration == FILE_PIPE_INBOUND) ||
(NamedPipeEnd == FILE_PIPE_CLIENT_END && Ccb->Fcb->NamedPipeConfiguration == FILE_PIPE_OUTBOUND)) (NamedPipeEnd == FILE_PIPE_CLIENT_END && Ccb->Fcb->NamedPipeConfiguration == FILE_PIPE_OUTBOUND))
{ {
@ -111,6 +115,7 @@ NpCommonWrite(IN PFILE_OBJECT FileObject,
Thread, Thread,
List); List);
IoStatus->Status = Status; IoStatus->Status = Status;
if (Status == STATUS_MORE_PROCESSING_REQUIRED) if (Status == STATUS_MORE_PROCESSING_REQUIRED)
{ {
ASSERT(WriteQueue->QueueState != ReadEntries); ASSERT(WriteQueue->QueueState != ReadEntries);
@ -153,6 +158,7 @@ NpFsdWrite(IN PDEVICE_OBJECT DeviceObject,
IO_STATUS_BLOCK IoStatus; IO_STATUS_BLOCK IoStatus;
LIST_ENTRY List; LIST_ENTRY List;
PLIST_ENTRY NextEntry, ThisEntry; PLIST_ENTRY NextEntry, ThisEntry;
PIRP ListIrp;
PAGED_CODE(); PAGED_CODE();
NpSlowWriteCalls++; NpSlowWriteCalls++;
@ -178,8 +184,8 @@ NpFsdWrite(IN PDEVICE_OBJECT DeviceObject,
ThisEntry = NextEntry; ThisEntry = NextEntry;
NextEntry = NextEntry->Flink; NextEntry = NextEntry->Flink;
Irp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); ListIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(Irp, IO_DISK_INCREMENT); IoCompleteRequest(ListIrp, IO_NAMED_PIPE_INCREMENT);
} }
FsRtlExitFileSystem(); FsRtlExitFileSystem();

View file

@ -3,14 +3,14 @@
NTSTATUS NTSTATUS
NTAPI NTAPI
NpWriteDataQueue(IN PNP_DATA_QUEUE WriteQueue, NpWriteDataQueue(IN PNP_DATA_QUEUE WriteQueue,
IN ULONG Mode, IN ULONG Mode,
IN PVOID OutBuffer, IN PVOID OutBuffer,
IN ULONG OutBufferSize, IN ULONG OutBufferSize,
IN ULONG PipeType, IN ULONG PipeType,
OUT PULONG BytesWritten, OUT PULONG BytesNotWritten,
IN PNP_CCB Ccb, IN PNP_CCB Ccb,
IN ULONG NamedPipeEnd, IN ULONG NamedPipeEnd,
IN PETHREAD Thread, IN PETHREAD Thread,
IN PLIST_ENTRY List) IN PLIST_ENTRY List)
{ {
BOOLEAN HaveContext = FALSE, MoreProcessing, AllocatedBuffer; BOOLEAN HaveContext = FALSE, MoreProcessing, AllocatedBuffer;
@ -23,7 +23,7 @@ NpWriteDataQueue(IN PNP_DATA_QUEUE WriteQueue,
PSECURITY_CLIENT_CONTEXT ClientContext; PSECURITY_CLIENT_CONTEXT ClientContext;
PAGED_CODE(); PAGED_CODE();
*BytesWritten = OutBufferSize; *BytesNotWritten = OutBufferSize;
MoreProcessing = TRUE; MoreProcessing = TRUE;
if ((PipeType != FILE_PIPE_MESSAGE_MODE) || (OutBufferSize)) if ((PipeType != FILE_PIPE_MESSAGE_MODE) || (OutBufferSize))
@ -33,7 +33,7 @@ NpWriteDataQueue(IN PNP_DATA_QUEUE WriteQueue,
for (DataEntry = NpGetNextRealDataQueueEntry(WriteQueue, List); for (DataEntry = NpGetNextRealDataQueueEntry(WriteQueue, List);
((WriteQueue->QueueState == ReadEntries) && ((WriteQueue->QueueState == ReadEntries) &&
((*BytesWritten > 0) || (MoreProcessing))); ((*BytesNotWritten > 0) || (MoreProcessing)));
DataEntry = NpGetNextRealDataQueueEntry(WriteQueue, List)) DataEntry = NpGetNextRealDataQueueEntry(WriteQueue, List))
{ {
DataSize = DataEntry->DataSize; DataSize = DataEntry->DataSize;
@ -58,7 +58,7 @@ NpWriteDataQueue(IN PNP_DATA_QUEUE WriteQueue,
DataEntry->Irp->Overlay.AllocationSize.QuadPart = 0; DataEntry->Irp->Overlay.AllocationSize.QuadPart = 0;
} }
BufferSize = *BytesWritten; BufferSize = *BytesNotWritten;
if (BufferSize >= DataSize) BufferSize = DataSize; if (BufferSize >= DataSize) BufferSize = DataSize;
if (DataEntry->DataEntryType != Unbuffered && BufferSize) if (DataEntry->DataEntryType != Unbuffered && BufferSize)
@ -76,7 +76,7 @@ NpWriteDataQueue(IN PNP_DATA_QUEUE WriteQueue,
_SEH2_TRY _SEH2_TRY
{ {
RtlCopyMemory(Buffer, RtlCopyMemory(Buffer,
(PVOID)((ULONG_PTR)OutBuffer + OutBufferSize - *BytesWritten), (PVOID)((ULONG_PTR)OutBuffer + OutBufferSize - *BytesNotWritten),
BufferSize); BufferSize);
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
@ -106,7 +106,7 @@ NpWriteDataQueue(IN PNP_DATA_QUEUE WriteQueue,
WriteIrp = NpRemoveDataQueueEntry(WriteQueue, TRUE, List); WriteIrp = NpRemoveDataQueueEntry(WriteQueue, TRUE, List);
if (WriteIrp) if (WriteIrp)
{ {
*BytesWritten -= BufferSize; *BytesNotWritten -= BufferSize;
WriteIrp->IoStatus.Information = BufferSize; WriteIrp->IoStatus.Information = BufferSize;
if (AllocatedBuffer) if (AllocatedBuffer)
@ -115,7 +115,7 @@ NpWriteDataQueue(IN PNP_DATA_QUEUE WriteQueue,
WriteIrp->Flags |= IRP_DEALLOCATE_BUFFER | IRP_BUFFERED_IO | IRP_INPUT_OPERATION; WriteIrp->Flags |= IRP_DEALLOCATE_BUFFER | IRP_BUFFERED_IO | IRP_INPUT_OPERATION;
} }
if (!*BytesWritten) if (!*BytesNotWritten)
{ {
MoreProcessing = FALSE; MoreProcessing = FALSE;
WriteIrp->IoStatus.Status = STATUS_SUCCESS; WriteIrp->IoStatus.Status = STATUS_SUCCESS;
@ -140,7 +140,7 @@ NpWriteDataQueue(IN PNP_DATA_QUEUE WriteQueue,
} }
} }
if (*BytesWritten > 0 || MoreProcessing) if (*BytesNotWritten > 0 || MoreProcessing)
{ {
ASSERT(WriteQueue->QueueState != ReadEntries); ASSERT(WriteQueue->QueueState != ReadEntries);
Status = STATUS_MORE_PROCESSING_REQUIRED; Status = STATUS_MORE_PROCESSING_REQUIRED;