[NPFS-NEW]: Use locking and IRP completion macros from NPFS snippet at "Common Driver...
authorAlex Ionescu <aionescu@gmail.com>
Wed, 11 Sep 2013 17:10:30 +0000 (17:10 +0000)
committerAlex Ionescu <aionescu@gmail.com>
Wed, 11 Sep 2013 17:10:30 +0000 (17:10 +0000)
download.microsoft.com/download/5/7/7/577a5684-8a83.../drvqa.doc". Fix a few incorrect exclusive vs shared lock acquires.

svn path=/trunk/; revision=60034

13 files changed:
reactos/drivers/filesystems/npfs_new/cleanup.c
reactos/drivers/filesystems/npfs_new/close.c
reactos/drivers/filesystems/npfs_new/create.c
reactos/drivers/filesystems/npfs_new/datasup.c
reactos/drivers/filesystems/npfs_new/fileinfo.c
reactos/drivers/filesystems/npfs_new/flushbuf.c
reactos/drivers/filesystems/npfs_new/fsctrl.c
reactos/drivers/filesystems/npfs_new/main.c
reactos/drivers/filesystems/npfs_new/npfs.h
reactos/drivers/filesystems/npfs_new/read.c
reactos/drivers/filesystems/npfs_new/seinfo.c
reactos/drivers/filesystems/npfs_new/statesup.c
reactos/drivers/filesystems/npfs_new/write.c

index 55f1d55..2905587 100644 (file)
@@ -7,18 +7,16 @@ NpCommonCleanup(IN PDEVICE_OBJECT DeviceObject,
 {
     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,
@@ -31,20 +29,11 @@ NpCommonCleanup(IN PDEVICE_OBJECT DeviceObject,
             --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;
 }
index cca905b..3a5c66d 100644 (file)
@@ -7,18 +7,16 @@ NpCommonClose(IN PDEVICE_OBJECT DeviceObject,
 {
     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,
@@ -26,24 +24,15 @@ NpCommonClose(IN PDEVICE_OBJECT DeviceObject,
     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);
index 1ecd11a..649f2d3 100644 (file)
@@ -205,12 +205,10 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
     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;
@@ -240,7 +238,7 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
             Irp->IoStatus = NpOpenNamedPipeRootDirectory(NpVcb->RootDcb,
                                                             FileObject,
                                                             DesiredAccess,
-                                                            &List);
+                                                            &DeferredList);
             goto Quickie;
         }
     }
@@ -255,7 +253,7 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
         Irp->IoStatus = NpOpenNamedPipeRootDirectory(NpVcb->RootDcb,
                                                      FileObject,
                                                      DesiredAccess,
-                                                     &List);
+                                                     &DeferredList);
         goto Quickie;
     }
 
@@ -329,21 +327,11 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
                                       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);
@@ -622,16 +610,14 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
     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);
@@ -650,7 +636,7 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
     IoStatus.Information = 0;
 
     FsRtlEnterFileSystem();
-    ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+    NpAcquireExclusiveVcb();
 
     if (RelatedFileObject)
     {
@@ -701,7 +687,7 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
                                                    ShareAccess,
                                                    Parameters,
                                                    Process,
-                                                   &LocalList,
+                                                   &DeferredList,
                                                    &IoStatus);
             goto Quickie;
         }
@@ -731,21 +717,11 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
                                          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;
index 9dfaec1..74a193e 100644 (file)
@@ -129,7 +129,7 @@ NpRemoveDataQueueEntry(IN PNP_DATA_QUEUE DataQueue,
 
         if (Irp && IoSetCancelRoutine(Irp, NULL))
         {
-            Irp->Tail.Overlay.DriverContext[3] = 0;
+            Irp->Tail.Overlay.DriverContext[3] = NULL;
         }
 
         ExFreePool(QueueEntry);
@@ -188,15 +188,13 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject,
 {
     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;
@@ -204,7 +202,7 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject,
     if (DeviceObject)
     {
         FsRtlEnterFileSystem();
-        ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+        NpAcquireExclusiveVcb();
     }
 
     DataEntry = (PNP_DATA_QUEUE_ENTRY)Irp->Tail.Overlay.DriverContext[3];
@@ -245,18 +243,18 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject,
         {
             if (FirstEntry)
             {
-                NpGetNextRealDataQueueEntry(DataQueue, &List);
+                NpGetNextRealDataQueueEntry(DataQueue, &DeferredList);
             }
             if (CompleteWrites)
             {
-                NpCompleteStalledWrites(DataQueue, &List);
+                NpCompleteStalledWrites(DataQueue, &DeferredList);
             }
         }
     }
 
     if (DeviceObject)
     {
-        ExReleaseResourceLite(&NpVcb->Lock);
+        NpReleaseVcb();
         FsRtlExitFileSystem();
     }
 
@@ -266,15 +264,7 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject,
     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
index cd05c7b..dfb7009 100644 (file)
@@ -100,30 +100,18 @@ NpFsdSetInformation(IN PDEVICE_OBJECT DeviceObject,
                     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)
@@ -462,11 +450,11 @@ NpFsdQueryInformation(IN PDEVICE_OBJECT DeviceObject,
     PAGED_CODE();
 
     FsRtlEnterFileSystem();
-    ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
+    NpAcquireSharedVcb();
 
     Status = NpCommonQueryInformation(DeviceObject, Irp);
 
-    ExReleaseResourceLite(&NpVcb->Lock);
+    NpReleaseVcb();
     FsRtlExitFileSystem();
 
     if (Status != STATUS_PENDING)
index 68ab880..34bcf41 100644 (file)
@@ -59,11 +59,11 @@ NpFsdFlushBuffers(IN PDEVICE_OBJECT DeviceObject,
     PAGED_CODE();
 
     FsRtlEnterFileSystem();
-    ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
+    NpAcquireSharedVcb();
 
     Status = NpCommonFlushBuffers(DeviceObject, Irp);
 
-    ExReleaseResourceLite(&NpVcb->Lock);
+    NpReleaseVcb();
     FsRtlExitFileSystem();
 
     return Status;
index 09d97d3..dfd3a5a 100644 (file)
@@ -569,35 +569,33 @@ NpCommonFileSystemControl(IN PDEVICE_OBJECT DeviceObject,
 {
     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:
@@ -605,54 +603,54 @@ NpCommonFileSystemControl(IN PDEVICE_OBJECT DeviceObject,
             // 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;
 
@@ -660,17 +658,8 @@ NpCommonFileSystemControl(IN PDEVICE_OBJECT DeviceObject,
             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;
 }
index a5c8748..81f40af 100644 (file)
@@ -40,8 +40,8 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject,
     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;
 
index 8701802..cd3bd9f 100644 (file)
@@ -263,6 +263,60 @@ typedef struct _NP_VCB
 
 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,
@@ -533,13 +587,13 @@ NpFsdQueryInformation(IN PDEVICE_OBJECT DeviceObject,
 
 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
index e67fba5..566f2b9 100644 (file)
@@ -142,37 +142,25 @@ NpFsdRead(IN PDEVICE_OBJECT DeviceObject,
 {
     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)
index b283671..2e7bd88 100644 (file)
@@ -78,18 +78,18 @@ NpCommonSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
 
 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)
@@ -103,18 +103,18 @@ NpFsdQuerySecurity(IN PDEVICE_OBJECT DeviceObject,
 
 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)
index 4544af8..9ed67f7 100644 (file)
@@ -6,12 +6,12 @@ NpCancelListeningQueueIrp(IN PDEVICE_OBJECT DeviceObject,
                           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);
index b5a566a..2776ab1 100644 (file)
@@ -156,17 +156,15 @@ NpFsdWrite(IN PDEVICE_OBJECT DeviceObject,
 {
     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,
@@ -174,20 +172,10 @@ NpFsdWrite(IN PDEVICE_OBJECT DeviceObject,
                   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)