mirror of
https://github.com/reactos/reactos.git
synced 2025-07-13 14:04:14 +00:00
[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:
parent
a8e4859598
commit
529ec2cb68
11 changed files with 112 additions and 102 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue