{
PIO_STACK_LOCATION IoStack;
NODE_TYPE_CODE NodeTypeCode;
- LIST_ENTRY List;
+ LIST_ENTRY DeferredList;
PNP_FCB Fcb;
PNP_CCB Ccb;
ULONG NamedPipeEnd;
- PLIST_ENTRY ThisEntry, NextEntry;
- PIRP LocalIrp;
PAGED_CODE();
IoStack = IoGetCurrentIrpStackLocation(Irp);
- InitializeListHead(&List);
+ InitializeListHead(&DeferredList);
- ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+ NpAcquireExclusiveVcb();
NodeTypeCode = NpDecodeFileObject(IoStack->FileObject,
(PVOID*)&Fcb,
&Ccb,
--Ccb->Fcb->ServerOpenCount;
}
- NpSetClosingPipeState(Ccb, Irp, NamedPipeEnd, &List);
+ NpSetClosingPipeState(Ccb, Irp, NamedPipeEnd, &DeferredList);
}
- ExReleaseResourceLite(&NpVcb->Lock);
-
- NextEntry = List.Flink;
- while (NextEntry != &List)
- {
- ThisEntry = NextEntry;
- NextEntry = NextEntry->Flink;
-
- LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
- IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
- }
+ NpReleaseVcb();
+ NpCompleteDeferredIrps(&DeferredList);
return STATUS_SUCCESS;
}
{
PIO_STACK_LOCATION IoStack;
NODE_TYPE_CODE NodeTypeCode;
- LIST_ENTRY List;
+ LIST_ENTRY DeferredList;
PNP_FCB Fcb;
PNP_CCB Ccb;
ULONG NamedPipeEnd;
- PLIST_ENTRY ThisEntry, NextEntry;
- PIRP LocalIrp;
PAGED_CODE();
IoStack = IoGetCurrentIrpStackLocation(Irp);
- InitializeListHead(&List);
+ InitializeListHead(&DeferredList);
- ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+ NpAcquireExclusiveVcb();
NodeTypeCode = NpDecodeFileObject(IoStack->FileObject,
(PVOID*)&Fcb,
&Ccb,
if (NodeTypeCode == NPFS_NTC_ROOT_DCB)
{
--Fcb->CurrentInstances;
- NpDeleteCcb(Ccb, &List);
+ NpDeleteCcb(Ccb, &DeferredList);
}
else if (NodeTypeCode == NPFS_NTC_VCB)
{
--NpVcb->ReferenceCount;
}
- ExReleaseResourceLite(&NpVcb->Lock);
-
- NextEntry = List.Flink;
- while (NextEntry != &List)
- {
- ThisEntry = NextEntry;
- NextEntry = NextEntry->Flink;
-
- LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
- IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
- }
+ NpReleaseVcb();
+ NpCompleteDeferredIrps(&DeferredList);
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
PNP_FCB Fcb;
PNP_DCB Dcb;
ACCESS_MASK DesiredAccess;
- LIST_ENTRY List;
- PLIST_ENTRY NextEntry, ThisEntry;
+ LIST_ENTRY DeferredList;
UNICODE_STRING Prefix;
- PIRP ListIrp;
- InitializeListHead(&List);
+ InitializeListHead(&DeferredList);
IoStack = (PEXTENDED_IO_STACK_LOCATION)IoGetCurrentIrpStackLocation(Irp);
FileObject = IoStack->FileObject;
RelatedFileObject = FileObject->RelatedFileObject;
Irp->IoStatus = NpOpenNamedPipeRootDirectory(NpVcb->RootDcb,
FileObject,
DesiredAccess,
- &List);
+ &DeferredList);
goto Quickie;
}
}
Irp->IoStatus = NpOpenNamedPipeRootDirectory(NpVcb->RootDcb,
FileObject,
DesiredAccess,
- &List);
+ &DeferredList);
goto Quickie;
}
SL_FORCE_ACCESS_CHECK ?
UserMode : Irp->RequestorMode,
Irp->Tail.Overlay.Thread,
- &List);
+ &DeferredList);
Quickie:
ExReleaseResourceLite(&NpVcb->Lock);
-
- NextEntry = List.Flink;
- while (NextEntry != &List)
- {
- ThisEntry = NextEntry;
- NextEntry = NextEntry->Flink;
-
- ListIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
- IoCompleteRequest(ListIrp, IO_NAMED_PIPE_INCREMENT);
- }
-
+ NpCompleteDeferredIrps(&DeferredList);
FsRtlExitFileSystem();
IoCompleteRequest(Irp, IO_NO_INCREMENT);
PFILE_OBJECT RelatedFileObject;
USHORT Disposition, ShareAccess;
PEPROCESS Process;
- LIST_ENTRY LocalList;
- PLIST_ENTRY NextEntry, ThisEntry;
+ LIST_ENTRY DeferredList;
UNICODE_STRING FileName;
PNP_FCB Fcb;
UNICODE_STRING Prefix;
PNAMED_PIPE_CREATE_PARAMETERS Parameters;
IO_STATUS_BLOCK IoStatus;
- PIRP ListIrp;
- InitializeListHead(&LocalList);
+ InitializeListHead(&DeferredList);
Process = IoGetRequestorProcess(Irp);
IoStack = (PEXTENDED_IO_STACK_LOCATION) IoGetCurrentIrpStackLocation(Irp);
IoStatus.Information = 0;
FsRtlEnterFileSystem();
- ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+ NpAcquireExclusiveVcb();
if (RelatedFileObject)
{
ShareAccess,
Parameters,
Process,
- &LocalList,
+ &DeferredList,
&IoStatus);
goto Quickie;
}
ShareAccess,
Parameters,
Process,
- &LocalList);
+ &DeferredList);
Quickie:
- ExReleaseResourceLite(&NpVcb->Lock);
-
- NextEntry = LocalList.Flink;
- while (NextEntry != &LocalList)
- {
- ThisEntry = NextEntry;
- NextEntry = NextEntry->Flink;
-
- ListIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
- IoCompleteRequest(ListIrp, IO_NAMED_PIPE_INCREMENT);
- }
-
+ NpReleaseVcb();
+ NpCompleteDeferredIrps(&DeferredList);
FsRtlExitFileSystem();
Irp->IoStatus = IoStatus;
if (Irp && IoSetCancelRoutine(Irp, NULL))
{
- Irp->Tail.Overlay.DriverContext[3] = 0;
+ Irp->Tail.Overlay.DriverContext[3] = NULL;
}
ExFreePool(QueueEntry);
{
PNP_DATA_QUEUE DataQueue;
PNP_DATA_QUEUE_ENTRY DataEntry;
- LIST_ENTRY List;
+ LIST_ENTRY DeferredList;
PSECURITY_CLIENT_CONTEXT ClientSecurityContext;
BOOLEAN CompleteWrites, FirstEntry;
- PLIST_ENTRY NextEntry, ThisEntry;
- PIRP LocalIrp;
if (DeviceObject) IoReleaseCancelSpinLock(Irp->CancelIrql);
- InitializeListHead(&List);
+ InitializeListHead(&DeferredList);
DataQueue = (PNP_DATA_QUEUE)Irp->Tail.Overlay.DriverContext[2];
ClientSecurityContext = NULL;
if (DeviceObject)
{
FsRtlEnterFileSystem();
- ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+ NpAcquireExclusiveVcb();
}
DataEntry = (PNP_DATA_QUEUE_ENTRY)Irp->Tail.Overlay.DriverContext[3];
{
if (FirstEntry)
{
- NpGetNextRealDataQueueEntry(DataQueue, &List);
+ NpGetNextRealDataQueueEntry(DataQueue, &DeferredList);
}
if (CompleteWrites)
{
- NpCompleteStalledWrites(DataQueue, &List);
+ NpCompleteStalledWrites(DataQueue, &DeferredList);
}
}
}
if (DeviceObject)
{
- ExReleaseResourceLite(&NpVcb->Lock);
+ NpReleaseVcb();
FsRtlExitFileSystem();
}
Irp->IoStatus.Status = STATUS_CANCELLED;
IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
- NextEntry = List.Flink;
- while (NextEntry != &List)
- {
- ThisEntry = NextEntry;
- NextEntry = NextEntry->Flink;
-
- LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
- IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
- }
+ NpCompleteDeferredIrps(&DeferredList);
}
NTSTATUS
IN PIRP Irp)
{
NTSTATUS Status;
- LIST_ENTRY List;
- PLIST_ENTRY NextEntry, ThisEntry;
- PIRP LocalIrp;
+ LIST_ENTRY DeferredList;
PAGED_CODE();
- InitializeListHead(&List);
+ InitializeListHead(&DeferredList);
FsRtlEnterFileSystem();
- ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
+ NpAcquireExclusiveVcb();
- Status = NpCommonSetInformation(DeviceObject, Irp, &List);
-
- ExReleaseResourceLite(&NpVcb->Lock);
-
- NextEntry = List.Flink;
- while (NextEntry != &List)
- {
- ThisEntry = NextEntry;
- NextEntry = NextEntry->Flink;
-
- LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
- IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
- }
+ Status = NpCommonSetInformation(DeviceObject, Irp, &DeferredList);
+ NpReleaseVcb();
+ NpCompleteDeferredIrps(&DeferredList);
FsRtlExitFileSystem();
if (Status != STATUS_PENDING)
PAGED_CODE();
FsRtlEnterFileSystem();
- ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
+ NpAcquireSharedVcb();
Status = NpCommonQueryInformation(DeviceObject, Irp);
- ExReleaseResourceLite(&NpVcb->Lock);
+ NpReleaseVcb();
FsRtlExitFileSystem();
if (Status != STATUS_PENDING)
PAGED_CODE();
FsRtlEnterFileSystem();
- ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+ NpAcquireSharedVcb();
Status = NpCommonFlushBuffers(DeviceObject, Irp);
- ExReleaseResourceLite(&NpVcb->Lock);
+ NpReleaseVcb();
FsRtlExitFileSystem();
return Status;
{
ULONG Fsctl;
BOOLEAN Overflow = FALSE;
- LIST_ENTRY List;
- PLIST_ENTRY NextEntry, ThisEntry;
+ LIST_ENTRY DeferredList;
NTSTATUS Status;
- PIRP LocalIrp;
PAGED_CODE();
- InitializeListHead(&List);
+ InitializeListHead(&DeferredList);
Fsctl = IoGetCurrentIrpStackLocation(Irp)->Parameters.FileSystemControl.FsControlCode;
switch (Fsctl)
{
case FSCTL_PIPE_PEEK:
- ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
- Status = NpPeek(DeviceObject, Irp, &List);
+ NpAcquireExclusiveVcb();
+ Status = NpPeek(DeviceObject, Irp, &DeferredList);
break;
case FSCTL_PIPE_INTERNAL_WRITE:
- ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
- Status = NpInternalWrite(DeviceObject, Irp, &List);
+ NpAcquireSharedVcb();
+ Status = NpInternalWrite(DeviceObject, Irp, &DeferredList);
break;
case FSCTL_PIPE_TRANSCEIVE:
- ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
- Status = NpTransceive(DeviceObject, Irp, &List);
+ NpAcquireSharedVcb();
+ Status = NpTransceive(DeviceObject, Irp, &DeferredList);
break;
case FSCTL_PIPE_INTERNAL_TRANSCEIVE:
- ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
- Status = NpInternalTransceive(DeviceObject, Irp, &List);
+ NpAcquireSharedVcb();
+ Status = NpInternalTransceive(DeviceObject, Irp, &DeferredList);
break;
case FSCTL_PIPE_INTERNAL_READ_OVFLOW:
// on purpose
case FSCTL_PIPE_INTERNAL_READ:
- ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
- Status = NpInternalRead(DeviceObject, Irp, Overflow, &List);
+ NpAcquireSharedVcb();
+ Status = NpInternalRead(DeviceObject, Irp, Overflow, &DeferredList);
break;
case FSCTL_PIPE_QUERY_CLIENT_PROCESS:
- ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
+ NpAcquireSharedVcb();
Status = NpQueryClientProcess(DeviceObject, Irp);
break;
case FSCTL_PIPE_ASSIGN_EVENT:
- ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+ NpAcquireExclusiveVcb();
Status = NpAssignEvent(DeviceObject, Irp);
break;
case FSCTL_PIPE_DISCONNECT:
- ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
- Status = NpDisconnect(DeviceObject, Irp, &List);
+ NpAcquireExclusiveVcb();
+ Status = NpDisconnect(DeviceObject, Irp, &DeferredList);
break;
case FSCTL_PIPE_LISTEN:
- ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
- Status = NpListen(DeviceObject, Irp, &List);
+ NpAcquireSharedVcb();
+ Status = NpListen(DeviceObject, Irp, &DeferredList);
break;
case FSCTL_PIPE_QUERY_EVENT:
- ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+ NpAcquireExclusiveVcb();
Status = NpQueryEvent(DeviceObject, Irp);
break;
case FSCTL_PIPE_WAIT:
- ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+ NpAcquireExclusiveVcb();
Status = NpWaitForNamedPipe(DeviceObject, Irp);
break;
case FSCTL_PIPE_IMPERSONATE:
- ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+ NpAcquireExclusiveVcb();
Status = NpImpersonate(DeviceObject, Irp);
break;
case FSCTL_PIPE_SET_CLIENT_PROCESS:
- ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+ NpAcquireExclusiveVcb();
Status = NpSetClientProcess(DeviceObject, Irp);
break;
return STATUS_NOT_SUPPORTED;
}
- ExReleaseResourceLite(&NpVcb->Lock);
-
- NextEntry = List.Flink;
- while (NextEntry != &List)
- {
- ThisEntry = NextEntry;
- NextEntry = NextEntry->Flink;
-
- LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
- IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
- }
+ NpReleaseVcb();
+ NpCompleteDeferredIrps(&DeferredList);
return Status;
}
DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = NpFsdFlushBuffers;
DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = NpFsdDirectoryControl;
DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = NpFsdFileSystemControl;
- DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = NpFsdQuerySecurity;
- DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = NpFsdSetSecurity;
+ DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = NpFsdQuerySecurityInfo;
+ DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = NpFsdSetSecurityInfo;
DriverObject->DriverUnload = NULL;
extern PNP_VCB NpVcb;
+//
+// Functions to lock/unlock the global VCB lock
+//
+FORCEINLINE
+VOID
+NpAcquireSharedVcb(VOID)
+{
+ /* Acquire the lock in shared mode */
+ ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
+}
+
+FORCEINLINE
+VOID
+NpAcquireExclusiveVcb(VOID)
+{
+ /* Acquire the lock in exclusive mode */
+ ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+}
+
+FORCEINLINE
+VOID
+NpReleaseVcb(VOID)
+{
+ /* Release the lock */
+ ExReleaseResourceLite(&NpVcb->Lock);
+}
+
+//
+// Function to process deferred IRPs outside the VCB lock but still within the
+// critical region
+//
+VOID
+FORCEINLINE
+NpCompleteDeferredIrps(IN PLIST_ENTRY DeferredList)
+{
+ PLIST_ENTRY ThisEntry, NextEntry;
+ PIRP Irp;
+
+ /* Loop the list */
+ ThisEntry = DeferredList->Flink;
+ while (ThisEntry != DeferredList)
+ {
+ /* Remember the next entry, but don't switch to it yet */
+ NextEntry = ThisEntry->Flink;
+
+ /* Complete the IRP for this entry */
+ Irp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
+ IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
+
+ /* And now switch to the next one */
+ ThisEntry = NextEntry;
+ }
+}
+
BOOLEAN
NTAPI
NpDeleteEventTableEntry(IN PRTL_GENERIC_TABLE Table,
NTSTATUS
NTAPI
-NpFsdQuerySecurity(IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp);
+NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
NTSTATUS
NTAPI
-NpFsdSetSecurity(IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp);
+NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
NTSTATUS
NTAPI
{
PIO_STACK_LOCATION IoStack;
IO_STATUS_BLOCK IoStatus;
- LIST_ENTRY List;
- PLIST_ENTRY NextEntry, ThisEntry;
- PIRP LocalIrp;
+ LIST_ENTRY DeferredList;
PAGED_CODE();
NpSlowReadCalls++;
- InitializeListHead(&List);
+ InitializeListHead(&DeferredList);
IoStack = IoGetCurrentIrpStackLocation(Irp);
FsRtlEnterFileSystem();
- ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
+ NpAcquireSharedVcb();
NpCommonRead(IoStack->FileObject,
Irp->UserBuffer,
IoStack->Parameters.Read.Length,
&IoStatus,
Irp,
- &List);
-
- ExReleaseResourceLite(&NpVcb->Lock);
-
- NextEntry = List.Flink;
- while (NextEntry != &List)
- {
- ThisEntry = NextEntry;
- NextEntry = NextEntry->Flink;
-
- LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
- IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
- }
+ &DeferredList);
+ NpReleaseVcb();
+ NpCompleteDeferredIrps(&DeferredList);
FsRtlExitFileSystem();
if (IoStatus.Status != STATUS_PENDING)
NTSTATUS
NTAPI
-NpFsdQuerySecurity(IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
+NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
{
NTSTATUS Status;
PAGED_CODE();
FsRtlEnterFileSystem();
- ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
+ NpAcquireExclusiveVcb();
Status = NpCommonQuerySecurityInfo(DeviceObject, Irp);
- ExReleaseResourceLite(&NpVcb->Lock);
+ NpReleaseVcb();
FsRtlExitFileSystem();
if (Status != STATUS_PENDING)
NTSTATUS
NTAPI
-NpFsdSetSecurity(IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
+NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
{
NTSTATUS Status;
PAGED_CODE();
FsRtlEnterFileSystem();
- ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
+ NpAcquireExclusiveVcb();
Status = NpCommonQuerySecurityInfo(DeviceObject, Irp);
- ExReleaseResourceLite(&NpVcb->Lock);
+ NpReleaseVcb();
FsRtlExitFileSystem();
if (Status != STATUS_PENDING)
IN PIRP Irp)
{
FsRtlEnterFileSystem();
- ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+ NpAcquireExclusiveVcb();
RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
FsRtlExitFileSystem();
- ExReleaseResourceLite(&NpVcb->Lock);
+ NpReleaseVcb();
Irp->IoStatus.Status = STATUS_CANCELLED;
IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
{
PIO_STACK_LOCATION IoStack;
IO_STATUS_BLOCK IoStatus;
- LIST_ENTRY List;
- PLIST_ENTRY NextEntry, ThisEntry;
- PIRP ListIrp;
+ LIST_ENTRY DeferredList;
PAGED_CODE();
NpSlowWriteCalls++;
- InitializeListHead(&List);
+ InitializeListHead(&DeferredList);
IoStack = IoGetCurrentIrpStackLocation(Irp);
FsRtlEnterFileSystem();
- ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
+ NpAcquireSharedVcb();
NpCommonWrite(IoStack->FileObject,
Irp->UserBuffer,
Irp->Tail.Overlay.Thread,
&IoStatus,
Irp,
- &List);
-
- ExReleaseResourceLite(&NpVcb->Lock);
-
- NextEntry = List.Flink;
- while (NextEntry != &List)
- {
- ThisEntry = NextEntry;
- NextEntry = NextEntry->Flink;
-
- ListIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
- IoCompleteRequest(ListIrp, IO_NAMED_PIPE_INCREMENT);
- }
+ &DeferredList);
+ NpReleaseVcb();
+ NpCompleteDeferredIrps(&DeferredList);
FsRtlExitFileSystem();
if (IoStatus.Status != STATUS_PENDING)