[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,9 +321,15 @@ 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)
{ {
NpFreeClientSecurityContext(ClientContext);
return STATUS_INSUFFICIENT_RESOURCES;
}
DataEntry->DataEntryType = Type; DataEntry->DataEntryType = Type;
DataEntry->QuotaInEntry = 0; DataEntry->QuotaInEntry = 0;
DataEntry->Irp = Irp; DataEntry->Irp = Irp;
@ -328,18 +338,14 @@ NpAddDataQueueEntry(IN ULONG NamedPipeEnd,
ASSERT((DataQueue->QueueState == Empty) || (DataQueue->QueueState == Who)); ASSERT((DataQueue->QueueState == Empty) || (DataQueue->QueueState == Who));
Status = STATUS_PENDING; Status = STATUS_PENDING;
break; break;
}
NpFreeClientSecurityContext(ClientContext);
return STATUS_INSUFFICIENT_RESOURCES;
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);
@ -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_CONNECTED_STATE)
{
if (Ccb->NamedPipeState == FILE_PIPE_DISCONNECTED_STATE) if (Ccb->NamedPipeState == FILE_PIPE_DISCONNECTED_STATE)
{ {
IoStatus->Status = STATUS_PIPE_DISCONNECTED; IoStatus->Status = STATUS_PIPE_DISCONNECTED;
WriteOk = TRUE;
goto Quickie;
} }
else if (Ccb->NamedPipeState == FILE_PIPE_LISTENING_STATE)
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; 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;
} }
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

@ -7,7 +7,7 @@ NpWriteDataQueue(IN PNP_DATA_QUEUE WriteQueue,
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,
@ -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;