Windows: AFSPrimaryVolumeWorkerThread reorg
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSGeneric.cpp
index f5bb20c..3524907 100644 (file)
@@ -689,7 +689,20 @@ AFSInitializeGlobalDirectoryEntries()
         if( pDirNode == NULL)
         {
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
             AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
                           AFS_TRACE_LEVEL_ERROR,
@@ -712,7 +725,20 @@ AFSInitializeGlobalDirectoryEntries()
 
             ExFreePool( pDirNode);
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
             AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
@@ -806,7 +832,20 @@ AFSInitializeGlobalDirectoryEntries()
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSInitializeGlobalDirectoryEntries AFS_DIR_ENTRY_TAG allocation failure\n"));
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -825,7 +864,20 @@ AFSInitializeGlobalDirectoryEntries()
 
             ExFreePool( pDirNode);
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -882,7 +934,20 @@ try_exit:
             if( AFSGlobalDotDirEntry != NULL)
             {
 
-                AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+                lCount = AFSObjectInfoDecrement( AFSGlobalDotDirEntry->ObjectInformation,
+                                                 AFS_OBJECT_REFERENCE_GLOBAL);
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+                              AFSGlobalDotDirEntry->ObjectInformation,
+                              lCount));
+
+                if ( lCount == 0)
+                {
+
+                    AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+                }
 
                 ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
 
@@ -896,7 +961,20 @@ try_exit:
             if( AFSGlobalDotDotDirEntry != NULL)
             {
 
-                AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+                lCount = AFSObjectInfoDecrement( AFSGlobalDotDotDirEntry->ObjectInformation,
+                                                 AFS_OBJECT_REFERENCE_GLOBAL);
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+                              AFSGlobalDotDotDirEntry->ObjectInformation,
+                              lCount));
+
+                if ( lCount == 0)
+                {
+
+                    AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+                }
 
                 ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
 
@@ -984,6 +1062,11 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
                           FileName));
         }
 
+        //
+        // This reference count is either stored into the return DirectoryCB
+        // or released before function exit.
+        //
+
         lCount = AFSObjectInfoIncrement( pObjectInfoCB,
                                          AFS_OBJECT_REFERENCE_DIRENTRY);
 
@@ -1239,11 +1322,10 @@ try_exit:
                               pObjectInfoCB,
                               lCount));
 
-                if( bAllocatedObjectCB)
+                if( bAllocatedObjectCB &&
+                    lCount == 0)
                 {
 
-                    ASSERT( pObjectInfoCB->ObjectReferenceCount == 0);
-
                     AFSDeleteObjectInfo( &pObjectInfoCB);
                 }
             }
@@ -4436,7 +4518,20 @@ AFSInitializeSpecialShareNameList()
         if( pDirNode == NULL)
         {
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -4455,7 +4550,20 @@ AFSInitializeSpecialShareNameList()
 
             ExFreePool( pDirNode);
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -4529,7 +4637,20 @@ AFSInitializeSpecialShareNameList()
         if( pDirNode == NULL)
         {
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -4548,7 +4669,20 @@ AFSInitializeSpecialShareNameList()
 
             ExFreePool( pDirNode);
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -4603,7 +4737,20 @@ try_exit:
 
                     pLastDirNode = (AFSDirectoryCB *)pDirNode->ListEntry.fLink;
 
-                    AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+                    lCount = AFSObjectInfoDecrement( pDirNode->ObjectInformation,
+                                                     AFS_OBJECT_REFERENCE_GLOBAL);
+
+                    AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+                                  pDirNode->ObjectInformation,
+                                  lCount));
+
+                    if ( lCount == 0)
+                    {
+
+                        AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+                    }
 
                     ExDeleteResourceLite( &pDirNode->NonPaged->Lock);
 
@@ -5068,90 +5215,92 @@ try_exit:
     return ntStatus;
 }
 
-AFSNameArrayHdr *
-AFSInitNameArray( IN AFSDirectoryCB *DirectoryCB,
-                  IN ULONG InitialElementCount)
+void
+AFSSetEnumerationEvent( IN AFSFcb *Fcb)
 {
-
-    AFSNameArrayHdr *pNameArray = NULL;
-    AFSNameArrayCB *pCurrentElement = NULL;
-    AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     LONG lCount;
 
-    __Enter
+    //
+    // Depending on the type of node, set the event
+    //
+
+    switch( Fcb->Header.NodeTypeCode)
     {
 
-        if( InitialElementCount == 0)
+        case AFS_DIRECTORY_FCB:
+        case AFS_ROOT_FCB:
+        case AFS_ROOT_ALL:
         {
 
-            InitialElementCount = pDevExt->Specific.RDR.NameArrayLength;
-        }
+            lCount = InterlockedIncrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
 
-        pNameArray = (AFSNameArrayHdr *)AFSExAllocatePoolWithTag( PagedPool,
-                                                                  sizeof( AFSNameArrayHdr) +
-                                                                    (InitialElementCount * sizeof( AFSNameArrayCB)),
-                                                                  AFS_NAME_ARRAY_TAG);
+            break;
+        }
+    }
 
-        if( pNameArray == NULL)
-        {
+    return;
+}
 
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_ERROR,
-                          "AFSInitNameArray Failed to allocate name array\n"));
+void
+AFSClearEnumerationEvent( IN AFSFcb *Fcb)
+{
 
-            try_return( pNameArray);
-        }
+    LONG lCount;
 
-        RtlZeroMemory( pNameArray,
-                       sizeof( AFSNameArrayHdr) +
-                          (InitialElementCount * sizeof( AFSNameArrayCB)));
+    //
+    // Depending on the type of node, set the event
+    //
 
-        pNameArray->MaxElementCount = InitialElementCount;
+    switch( Fcb->Header.NodeTypeCode)
+    {
 
-        if( DirectoryCB != NULL)
+        case AFS_DIRECTORY_FCB:
+        case AFS_ROOT_FCB:
+        case AFS_ROOT_ALL:
         {
 
-            pCurrentElement = &pNameArray->ElementArray[ 0];
+            ASSERT( Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0);
+
+            lCount = InterlockedDecrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
 
-            pNameArray->CurrentEntry = pCurrentElement;
+            break;
+        }
+    }
 
-            pNameArray->Count = 1;
+    return;
+}
 
-            pNameArray->LinkCount = 0;
+BOOLEAN
+AFSIsEnumerationInProcess( IN AFSObjectInfoCB *ObjectInfo)
+{
 
-            lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
+    BOOLEAN bIsInProcess = FALSE;
 
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInitNameArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
-                          pNameArray,
-                          &DirectoryCB->NameInformation.FileName,
-                          DirectoryCB,
-                          lCount));
+    __Enter
+    {
 
-            pCurrentElement->DirectoryCB = DirectoryCB;
+        if( ObjectInfo->Fcb == NULL)
+        {
 
-            pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
+            try_return( bIsInProcess);
+        }
 
-            pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
+        switch( ObjectInfo->Fcb->Header.NodeTypeCode)
+        {
 
-            if( pCurrentElement->FileId.Vnode == 1)
+            case AFS_DIRECTORY_FCB:
+            case AFS_ROOT_FCB:
+            case AFS_ROOT_ALL:
             {
 
-                SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
-            }
+                if( ObjectInfo->Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0)
+                {
 
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInitNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                          pNameArray,
-                          pCurrentElement->DirectoryCB,
-                          pCurrentElement->FileId.Cell,
-                          pCurrentElement->FileId.Volume,
-                          pCurrentElement->FileId.Vnode,
-                          pCurrentElement->FileId.Unique,
-                          &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                          pCurrentElement->DirectoryCB->ObjectInformation->FileType));
+                    bIsInProcess = TRUE;
+                }
+
+                break;
+            }
         }
 
 try_exit:
@@ -5159,838 +5308,87 @@ try_exit:
         NOTHING;
     }
 
-    return pNameArray;
+    return bIsInProcess;
 }
 
 NTSTATUS
-AFSPopulateNameArray( IN AFSNameArrayHdr *NameArray,
-                      IN UNICODE_STRING *Path,
-                      IN AFSDirectoryCB *DirectoryCB)
+AFSVerifyVolume( IN ULONGLONG ProcessId,
+                 IN AFSVolumeCB *VolumeCB)
 {
 
+    UNREFERENCED_PARAMETER(ProcessId);
+    UNREFERENCED_PARAMETER(VolumeCB);
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSNameArrayCB *pCurrentElement = NULL;
-    LONG lCount;
 
-    __Enter
-    {
 
-        AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSPopulateNameArray [NA:%p] passed Path %wZ DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                      NameArray,
-                      &Path,
-                      DirectoryCB,
-                      DirectoryCB->ObjectInformation->FileId.Cell,
-                      DirectoryCB->ObjectInformation->FileId.Volume,
-                      DirectoryCB->ObjectInformation->FileId.Vnode,
-                      DirectoryCB->ObjectInformation->FileId.Unique,
-                      &DirectoryCB->NameInformation.FileName,
-                      DirectoryCB->ObjectInformation->FileType));
+    return ntStatus;
+}
 
-        //
-        // Init some info in the header
-        //
+NTSTATUS
+AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ParentObjectInfo)
+{
 
-        pCurrentElement = &NameArray->ElementArray[ 0];
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+    AFSObjectInfoCB *pObjectInfoCB = NULL;
+    AFSDirectoryCB *pDirNode = NULL;
+    ULONG ulEntryLength = 0;
+    AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
+    LONG lCount;
+
+    __Enter
+    {
 
-        NameArray->CurrentEntry = pCurrentElement;
+        pObjectInfoCB = AFSAllocateObjectInfo( ParentObjectInfo,
+                                               0);
 
-        //
-        // The first entry points at the root
-        //
+        if( pObjectInfoCB == NULL)
+        {
 
-        pCurrentElement->DirectoryCB = DirectoryCB->ObjectInformation->VolumeCB->DirectoryCB;
+            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+        }
 
-        lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
+        lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+                                         AFS_OBJECT_REFERENCE_PIOCTL);
 
-        AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSPopulateNameArray [NA:%p] Increment count on volume %wZ DE %p Cnt %d\n",
-                      NameArray,
-                      &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                      pCurrentElement->DirectoryCB,
+                      "AFSInitPIOCtlDirectoryCB Increment count on object %p Cnt %d\n",
+                      pObjectInfoCB,
                       lCount));
 
-        pCurrentElement->Component = DirectoryCB->ObjectInformation->VolumeCB->DirectoryCB->NameInformation.FileName;
+        pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_PIOCTL;
+
+        pObjectInfoCB->FileAttributes = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
 
-        pCurrentElement->FileId = DirectoryCB->ObjectInformation->VolumeCB->ObjectInformation.FileId;
+        ulEntryLength = sizeof( AFSDirectoryCB) + AFSPIOCtlName.Length;
 
-        pCurrentElement->Flags = 0;
+        pDirNode = (AFSDirectoryCB *)AFSExAllocatePoolWithTag( PagedPool,
+                                                               ulEntryLength,
+                                                               AFS_DIR_ENTRY_TAG);
 
-        if( pCurrentElement->FileId.Vnode == 1)
+        if( pDirNode == NULL)
         {
 
-            SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
+            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
-        NameArray->Count = 1;
-
-        NameArray->LinkCount = 0;
-
-        AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSPopulateNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                      NameArray,
-                      pCurrentElement->DirectoryCB,
-                      pCurrentElement->FileId.Cell,
-                      pCurrentElement->FileId.Volume,
-                      pCurrentElement->FileId.Vnode,
-                      pCurrentElement->FileId.Unique,
-                      &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                      pCurrentElement->DirectoryCB->ObjectInformation->FileType));
+                      "AFSInitPIOCtlDirectoryCB AFS_DIR_ENTRY_TAG allocated %p\n",
+                      pDirNode));
 
-        //
-        // If the root is the parent then we are done ...
-        //
+        pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
+                                                                                sizeof( AFSNonPagedDirectoryCB),
+                                                                                AFS_DIR_ENTRY_NP_TAG);
 
-        if( &DirectoryCB->ObjectInformation->VolumeCB->ObjectInformation == DirectoryCB->ObjectInformation)
+        if( pNonPagedDirEntry == NULL)
         {
-            try_return( ntStatus);
+
+            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
-try_exit:
-
-        NOTHING;
-    }
-
-    return ntStatus;
-}
-
-NTSTATUS
-AFSPopulateNameArrayFromRelatedArray( IN AFSNameArrayHdr *NameArray,
-                                      IN AFSNameArrayHdr *RelatedNameArray,
-                                      IN AFSDirectoryCB *DirectoryCB)
-{
-
-    NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSNameArrayCB *pCurrentElement = NULL, *pCurrentRelatedElement = NULL;
-    LONG lCount;
-
-    __Enter
-    {
-
-        if ( DirectoryCB)
-        {
-
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSPopulateNameArray [NA:%p] passed RelatedNameArray %p DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                          NameArray,
-                          RelatedNameArray,
-                          DirectoryCB,
-                          DirectoryCB->ObjectInformation->FileId.Cell,
-                          DirectoryCB->ObjectInformation->FileId.Volume,
-                          DirectoryCB->ObjectInformation->FileId.Vnode,
-                          DirectoryCB->ObjectInformation->FileId.Unique,
-                          &DirectoryCB->NameInformation.FileName,
-                          DirectoryCB->ObjectInformation->FileType));
-        }
-        else
-        {
-
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSPopulateNameArray [NA:%p] passed RelatedNameArray %p DE NULL\n",
-                          NameArray,
-                          RelatedNameArray));
-        }
-
-        //
-        // Init some info in the header
-        //
-
-        pCurrentElement = &NameArray->ElementArray[ 0];
-
-        pCurrentRelatedElement = &RelatedNameArray->ElementArray[ 0];
-
-        NameArray->Count = 0;
-
-        NameArray->LinkCount = RelatedNameArray->LinkCount;
-
-        //
-        // Populate the name array with the data from the related array
-        //
-
-        while( TRUE)
-        {
-
-            pCurrentElement->DirectoryCB = pCurrentRelatedElement->DirectoryCB;
-
-            pCurrentElement->Component = pCurrentRelatedElement->DirectoryCB->NameInformation.FileName;
-
-            pCurrentElement->FileId    = pCurrentElement->DirectoryCB->ObjectInformation->FileId;
-
-            pCurrentElement->Flags = 0;
-
-            if( pCurrentElement->FileId.Vnode == 1)
-            {
-
-                SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
-            }
-
-            lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
-
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSPopulateNameArrayFromRelatedArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
-                          NameArray,
-                          &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                          pCurrentElement->DirectoryCB,
-                          lCount));
-
-            lCount = InterlockedIncrement( &NameArray->Count);
-
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSPopulateNameArrayFromRelatedArray [NA:%p] Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                          NameArray,
-                          lCount - 1,
-                          pCurrentElement->DirectoryCB,
-                          pCurrentElement->FileId.Cell,
-                          pCurrentElement->FileId.Volume,
-                          pCurrentElement->FileId.Vnode,
-                          pCurrentElement->FileId.Unique,
-                          &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                          pCurrentElement->DirectoryCB->ObjectInformation->FileType));
-
-            if( pCurrentElement->DirectoryCB == DirectoryCB ||
-                NameArray->Count == RelatedNameArray->Count)
-            {
-
-                //
-                // Done ...
-                //
-
-                break;
-            }
-
-            pCurrentElement++;
-
-            pCurrentRelatedElement++;
-        }
-
-        NameArray->CurrentEntry = NameArray->Count > 0 ? pCurrentElement : NULL;
-    }
-
-    return ntStatus;
-}
-
-NTSTATUS
-AFSFreeNameArray( IN AFSNameArrayHdr *NameArray)
-{
-
-    NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSNameArrayCB *pCurrentElement = NULL;
-    LONG lCount, lElement;
-
-    __Enter
-    {
-
-        AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSFreeNameArray [NA:%p]\n",
-                      NameArray));
-
-        for ( lElement = 0; lElement < NameArray->Count; lElement++)
-        {
-
-            pCurrentElement = &NameArray->ElementArray[ lElement];
-
-            lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
-
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSFreeNameArray [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
-                          NameArray,
-                          &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                          pCurrentElement->DirectoryCB,
-                          lCount));
-
-            ASSERT( lCount >= 0);
-        }
-
-        AFSExFreePoolWithTag( NameArray, AFS_NAME_ARRAY_TAG);
-    }
-
-    return ntStatus;
-}
-
-NTSTATUS
-AFSInsertNextElement( IN AFSNameArrayHdr *NameArray,
-                      IN AFSDirectoryCB *DirectoryCB)
-{
-
-    NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSNameArrayCB *pCurrentElement = NULL;
-    LONG lCount;
-
-    __Enter
-    {
-
-        AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInsertNextElement [NA:%p] passed DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                      NameArray,
-                      DirectoryCB,
-                      DirectoryCB->ObjectInformation->FileId.Cell,
-                      DirectoryCB->ObjectInformation->FileId.Volume,
-                      DirectoryCB->ObjectInformation->FileId.Vnode,
-                      DirectoryCB->ObjectInformation->FileId.Unique,
-                      &DirectoryCB->NameInformation.FileName,
-                      DirectoryCB->ObjectInformation->FileType));
-
-        if( NameArray->Count == (LONG) NameArray->MaxElementCount)
-        {
-
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_ERROR,
-                          "AFSInsertNextElement [NA:%p] Name has reached Maximum Size\n",
-                          NameArray));
-
-            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
-        }
-
-        for ( lCount = 0; lCount < NameArray->Count; lCount++)
-        {
-
-            if ( AFSIsEqualFID( &NameArray->ElementArray[ lCount].FileId,
-                                &DirectoryCB->ObjectInformation->FileId) )
-            {
-
-                AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                              AFS_TRACE_LEVEL_WARNING,
-                              "AFSInsertNextElement [NA:%p] DE %p recursion Status %08X\n",
-                              NameArray,
-                              DirectoryCB,
-                              STATUS_ACCESS_DENIED));
-
-                try_return( ntStatus = STATUS_ACCESS_DENIED);
-            }
-        }
-
-        if( NameArray->Count > 0)
-        {
-
-            NameArray->CurrentEntry++;
-        }
-        else
-        {
-            NameArray->CurrentEntry = &NameArray->ElementArray[ 0];
-        }
-
-        pCurrentElement = NameArray->CurrentEntry;
-
-        lCount = InterlockedIncrement( &NameArray->Count);
-
-        lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
-
-        AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInsertNextElement [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
-                      NameArray,
-                      &DirectoryCB->NameInformation.FileName,
-                      DirectoryCB,
-                      lCount));
-
-        ASSERT( lCount > 0);
-
-        pCurrentElement->DirectoryCB = DirectoryCB;
-
-        pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
-
-        pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
-
-        pCurrentElement->Flags = 0;
-
-        if( pCurrentElement->FileId.Vnode == 1)
-        {
-
-            SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
-        }
-
-        AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInsertNextElement [NA:%p] Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                      NameArray,
-                      NameArray->Count - 1,
-                      pCurrentElement->DirectoryCB,
-                      pCurrentElement->FileId.Cell,
-                      pCurrentElement->FileId.Volume,
-                      pCurrentElement->FileId.Vnode,
-                      pCurrentElement->FileId.Unique,
-                      &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                      pCurrentElement->DirectoryCB->ObjectInformation->FileType));
-
-try_exit:
-
-        NOTHING;
-    }
-
-    return ntStatus;
-}
-
-AFSDirectoryCB *
-AFSBackupEntry( IN AFSNameArrayHdr *NameArray)
-{
-
-    AFSDirectoryCB *pDirectoryCB = NULL;
-    AFSNameArrayCB *pCurrentElement = NULL;
-    BOOLEAN         bVolumeRoot = FALSE;
-    LONG lCount;
-
-    __Enter
-    {
-
-        AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSBackupEntry [NA:%p]\n",
-                      NameArray));
-
-        if( NameArray->Count == 0)
-        {
-
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_ERROR,
-                          "AFSBackupEntry [NA:%p] No more entries\n",
-                          NameArray));
-
-            try_return( pCurrentElement);
-        }
-
-        lCount = InterlockedDecrement( &NameArray->CurrentEntry->DirectoryCB->NameArrayReferenceCount);
-
-        AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSBackupEntry [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
-                      NameArray,
-                      &NameArray->CurrentEntry->DirectoryCB->NameInformation.FileName,
-                      NameArray->CurrentEntry->DirectoryCB,
-                      lCount));
-
-        ASSERT( lCount >= 0);
-
-        NameArray->CurrentEntry->DirectoryCB = NULL;
-
-        lCount = InterlockedDecrement( &NameArray->Count);
-
-        if( lCount == 0)
-        {
-            NameArray->CurrentEntry = NULL;
-
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_ERROR,
-                          "AFSBackupEntry [NA:%p] No more entries\n",
-                          NameArray));
-        }
-        else
-        {
-
-            bVolumeRoot = BooleanFlagOn( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
-
-            NameArray->CurrentEntry--;
-
-            pCurrentElement = NameArray->CurrentEntry;
-
-            pDirectoryCB = pCurrentElement->DirectoryCB;
-
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSBackupEntry [NA:%p] Returning Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                          NameArray,
-                          NameArray->Count - 1,
-                          pCurrentElement->DirectoryCB,
-                          pCurrentElement->FileId.Cell,
-                          pCurrentElement->FileId.Volume,
-                          pCurrentElement->FileId.Vnode,
-                          pCurrentElement->FileId.Unique,
-                          &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                          pCurrentElement->DirectoryCB->ObjectInformation->FileType));
-
-            //
-            // If the entry we are removing is a volume root,
-            // we must remove the mount point entry as well.
-            // If the NameArray was constructed by checking the
-            // share name via the service, the name array can
-            // contain two volume roots in sequence without a
-            // mount point separating them.
-            //
-
-            if ( bVolumeRoot &&
-                 !BooleanFlagOn( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT))
-            {
-
-                pDirectoryCB = AFSBackupEntry( NameArray);
-            }
-        }
-
-
-try_exit:
-
-        NOTHING;
-    }
-
-    return pDirectoryCB;
-}
-
-AFSDirectoryCB *
-AFSGetParentEntry( IN AFSNameArrayHdr *NameArray)
-{
-
-    AFSDirectoryCB *pDirEntry = NULL;
-    AFSNameArrayCB *pElement = NULL;
-
-    __Enter
-    {
-
-        AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSGetParentEntry [NA:%p]\n",
-                      NameArray));
-
-        if( NameArray->Count == 0 ||
-            NameArray->Count == 1)
-        {
-
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_ERROR,
-                          "AFSGetParentEntry [NA:%p] No more entries\n",
-                          NameArray));
-
-            try_return( pDirEntry = NULL);
-        }
-
-        pElement = &NameArray->ElementArray[ NameArray->Count - 2];
-
-        pDirEntry = pElement->DirectoryCB;
-
-        AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSGetParentEntry [NA:%p] Returning Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                      NameArray,
-                      NameArray->Count - 2,
-                      pElement->DirectoryCB,
-                      pElement->FileId.Cell,
-                      pElement->FileId.Volume,
-                      pElement->FileId.Vnode,
-                      pElement->FileId.Unique,
-                      &pElement->DirectoryCB->NameInformation.FileName,
-                      pElement->DirectoryCB->ObjectInformation->FileType));
-
-try_exit:
-
-        NOTHING;
-    }
-
-    return pDirEntry;
-}
-
-void
-AFSResetNameArray( IN AFSNameArrayHdr *NameArray,
-                   IN AFSDirectoryCB *DirectoryCB)
-{
-
-    AFSNameArrayCB *pCurrentElement = NULL;
-    AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
-    LONG lCount, lElement;
-
-    __Enter
-    {
-
-        AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSResetNameArray [NA:%p] passed DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                      NameArray,
-                      DirectoryCB,
-                      DirectoryCB->ObjectInformation->FileId.Cell,
-                      DirectoryCB->ObjectInformation->FileId.Volume,
-                      DirectoryCB->ObjectInformation->FileId.Vnode,
-                      DirectoryCB->ObjectInformation->FileId.Unique,
-                      &DirectoryCB->NameInformation.FileName,
-                      DirectoryCB->ObjectInformation->FileType));
-
-        //
-        // Dereference previous name array contents
-        //
-
-        for ( lElement = 0; lElement < NameArray->Count; lElement++)
-        {
-
-            pCurrentElement = &NameArray->ElementArray[ lElement];
-
-            lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
-
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSResetNameArray [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
-                          NameArray,
-                          &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                          pCurrentElement->DirectoryCB,
-                          lCount));
-
-            ASSERT( lCount >= 0);
-        }
-
-        RtlZeroMemory( NameArray,
-                       sizeof( AFSNameArrayHdr) +
-                          ((pDevExt->Specific.RDR.NameArrayLength - 1) * sizeof( AFSNameArrayCB)));
-
-        NameArray->MaxElementCount = pDevExt->Specific.RDR.NameArrayLength;
-
-        if( DirectoryCB != NULL)
-        {
-
-            pCurrentElement = &NameArray->ElementArray[ 0];
-
-            NameArray->CurrentEntry = pCurrentElement;
-
-            NameArray->Count = 1;
-
-            NameArray->LinkCount = 0;
-
-            lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
-
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSResetNameArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
-                          NameArray,
-                          &DirectoryCB->NameInformation.FileName,
-                          DirectoryCB,
-                          lCount));
-
-            pCurrentElement->DirectoryCB = DirectoryCB;
-
-            pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
-
-            pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
-
-            pCurrentElement->Flags  = 0;
-
-            if( pCurrentElement->FileId.Vnode == 1)
-            {
-
-                SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
-            }
-
-            AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSResetNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                          NameArray,
-                          pCurrentElement->DirectoryCB,
-                          pCurrentElement->FileId.Cell,
-                          pCurrentElement->FileId.Volume,
-                          pCurrentElement->FileId.Vnode,
-                          pCurrentElement->FileId.Unique,
-                          &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                          pCurrentElement->DirectoryCB->ObjectInformation->FileType));
-        }
-    }
-
-    return;
-}
-
-void
-AFSDumpNameArray( IN AFSNameArrayHdr *NameArray)
-{
-
-    AFSNameArrayCB *pCurrentElement = NULL;
-
-    pCurrentElement = &NameArray->ElementArray[ 0];
-
-    AFSPrint("AFSDumpNameArray Start (%d)\n", NameArray->Count);
-
-    while( pCurrentElement->DirectoryCB != NULL)
-    {
-
-        AFSPrint("FID %08lX-%08lX-%08lX-%08lX %wZ\n",
-                  pCurrentElement->FileId.Cell,
-                  pCurrentElement->FileId.Volume,
-                  pCurrentElement->FileId.Vnode,
-                  pCurrentElement->FileId.Unique,
-                  &pCurrentElement->DirectoryCB->NameInformation.FileName);
-
-        pCurrentElement++;
-    }
-
-    AFSPrint("AFSDumpNameArray End\n\n");
-
-    return;
-}
-
-void
-AFSSetEnumerationEvent( IN AFSFcb *Fcb)
-{
-    LONG lCount;
-
-    //
-    // Depending on the type of node, set the event
-    //
-
-    switch( Fcb->Header.NodeTypeCode)
-    {
-
-        case AFS_DIRECTORY_FCB:
-        case AFS_ROOT_FCB:
-        case AFS_ROOT_ALL:
-        {
-
-            lCount = InterlockedIncrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
-
-            break;
-        }
-    }
-
-    return;
-}
-
-void
-AFSClearEnumerationEvent( IN AFSFcb *Fcb)
-{
-
-    LONG lCount;
-
-    //
-    // Depending on the type of node, set the event
-    //
-
-    switch( Fcb->Header.NodeTypeCode)
-    {
-
-        case AFS_DIRECTORY_FCB:
-        case AFS_ROOT_FCB:
-        case AFS_ROOT_ALL:
-        {
-
-            ASSERT( Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0);
-
-            lCount = InterlockedDecrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
-
-            break;
-        }
-    }
-
-    return;
-}
-
-BOOLEAN
-AFSIsEnumerationInProcess( IN AFSObjectInfoCB *ObjectInfo)
-{
-
-    BOOLEAN bIsInProcess = FALSE;
-
-    __Enter
-    {
-
-        if( ObjectInfo->Fcb == NULL)
-        {
-
-            try_return( bIsInProcess);
-        }
-
-        switch( ObjectInfo->Fcb->Header.NodeTypeCode)
-        {
-
-            case AFS_DIRECTORY_FCB:
-            case AFS_ROOT_FCB:
-            case AFS_ROOT_ALL:
-            {
-
-                if( ObjectInfo->Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0)
-                {
-
-                    bIsInProcess = TRUE;
-                }
-
-                break;
-            }
-        }
-
-try_exit:
-
-        NOTHING;
-    }
-
-    return bIsInProcess;
-}
-
-NTSTATUS
-AFSVerifyVolume( IN ULONGLONG ProcessId,
-                 IN AFSVolumeCB *VolumeCB)
-{
-
-    UNREFERENCED_PARAMETER(ProcessId);
-    UNREFERENCED_PARAMETER(VolumeCB);
-    NTSTATUS ntStatus = STATUS_SUCCESS;
-
-
-    return ntStatus;
-}
-
-NTSTATUS
-AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ParentObjectInfo)
-{
-
-    NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSObjectInfoCB *pObjectInfoCB = NULL;
-    AFSDirectoryCB *pDirNode = NULL;
-    ULONG ulEntryLength = 0;
-    AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
-    LONG lCount;
-
-    __Enter
-    {
-
-        pObjectInfoCB = AFSAllocateObjectInfo( ParentObjectInfo,
-                                               0);
-
-        if( pObjectInfoCB == NULL)
-        {
-
-            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
-        }
-
-        lCount = AFSObjectInfoIncrement( pObjectInfoCB,
-                                         AFS_OBJECT_REFERENCE_DIRENTRY);
-
-        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInitPIOCtlDirectoryCB Increment count on object %p Cnt %d\n",
-                      pObjectInfoCB,
-                      lCount));
-
-        pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_PIOCTL;
-
-        pObjectInfoCB->FileAttributes = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
-
-        ulEntryLength = sizeof( AFSDirectoryCB) + AFSPIOCtlName.Length;
-
-        pDirNode = (AFSDirectoryCB *)AFSExAllocatePoolWithTag( PagedPool,
-                                                               ulEntryLength,
-                                                               AFS_DIR_ENTRY_TAG);
-
-        if( pDirNode == NULL)
-        {
-
-            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
-        }
-
-        AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInitPIOCtlDirectoryCB AFS_DIR_ENTRY_TAG allocated %p\n",
-                      pDirNode));
-
-        pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
-                                                                                sizeof( AFSNonPagedDirectoryCB),
-                                                                                AFS_DIR_ENTRY_NP_TAG);
-
-        if( pNonPagedDirEntry == NULL)
-        {
-
-            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
-        }
-
-        RtlZeroMemory( pDirNode,
-                       ulEntryLength);
+        RtlZeroMemory( pDirNode,
+                       ulEntryLength);
 
         RtlZeroMemory( pNonPagedDirEntry,
                        sizeof( AFSNonPagedDirectoryCB));
@@ -6062,7 +5460,7 @@ try_exit:
             {
 
                 lCount = AFSObjectInfoDecrement( pObjectInfoCB,
-                                                 AFS_OBJECT_REFERENCE_DIRENTRY);
+                                                 AFS_OBJECT_REFERENCE_PIOCTL);
 
                 AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
@@ -6070,7 +5468,11 @@ try_exit:
                               pObjectInfoCB,
                               lCount));
 
-                AFSDeleteObjectInfo( &pObjectInfoCB);
+                if ( lCount == 0)
+                {
+
+                    AFSDeleteObjectInfo( &pObjectInfoCB);
+                }
             }
         }
     }
@@ -6777,6 +6179,11 @@ AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB,
     AFSObjectInfoCB *pObjectInfo = NULL;
     LONG             lCount;
 
+    ullIndex = AFSCreateLowIndex( FileId);
+
+    AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+                      TRUE);
+
     if ( AFSIsEqualFID( &VolumeCB->ObjectInformation.FileId, FileId))
     {
 
@@ -6785,16 +6192,9 @@ AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB,
     else
     {
 
-        AFSAcquireExcl( VolumeCB->ObjectInfoTree.TreeLock,
-                        TRUE);
-
-        ullIndex = AFSCreateLowIndex( FileId);
-
         ntStatus = AFSLocateHashEntry( VolumeCB->ObjectInfoTree.TreeHead,
                                        ullIndex,
                                        (AFSBTreeEntry **)&pObjectInfo);
-
-        AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
     }
 
     if ( NT_SUCCESS( ntStatus)) {
@@ -6809,6 +6209,8 @@ AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB,
                       lCount));
     }
 
+    AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
+
     return pObjectInfo;
 }
 
@@ -6832,155 +6234,169 @@ AFSReleaseObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
 void
 AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
 {
-
     BOOLEAN bAcquiredTreeLock = FALSE;
     AFSObjectInfoCB *pObjectInfo = NULL;
+    AFSVolumeCB * pVolume = NULL;
     BOOLEAN bHeldInService;
     AFSObjectInfoCB * pParentObjectInfo = NULL;
     AFSFileID FileId;
     LONG lCount;
 
-    if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_ROOT_VOLUME))
+    __Enter
     {
+        if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_ROOT_VOLUME))
+        {
 
-        //
-        // AFSDeleteObjectInfo should never be called on the ObjectInformationCB
-        // embedded in the VolumeCB.
-        //
-
-        ASSERT( FALSE);
-
-        return;
-    }
+            //
+            // AFSDeleteObjectInfo should never be called on the ObjectInformationCB
+            // embedded in the VolumeCB.
+            //
 
-    pObjectInfo = (AFSObjectInfoCB *) InterlockedCompareExchangePointer( (PVOID *)ppObjectInfo,
-                                                                         NULL,
-                                                                         *ppObjectInfo);
+            ASSERT( FALSE);
 
-    if ( pObjectInfo == NULL)
-    {
+            return;
+        }
 
-        return;
-    }
+        pVolume = (*ppObjectInfo)->VolumeCB;
 
-    ASSERT( *ppObjectInfo == NULL);
+        if( !ExIsResourceAcquiredExclusiveLite( pVolume->ObjectInfoTree.TreeLock))
+        {
 
-    ASSERT( pObjectInfo->ObjectReferenceCount == 0);
+            ASSERT( !ExIsResourceAcquiredLite( pVolume->ObjectInfoTree.TreeLock));
 
-    bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
+            AFSAcquireExcl( pVolume->ObjectInfoTree.TreeLock,
+                            TRUE);
 
-    if( !ExIsResourceAcquiredExclusiveLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock))
-    {
+            bAcquiredTreeLock = TRUE;
+        }
 
-        ASSERT( !ExIsResourceAcquiredLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock));
+        for ( lCount = 0; lCount < AFS_OBJECT_REFERENCE_MAX; lCount++)
+        {
 
-        AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
-                        TRUE);
+            ASSERT( (*ppObjectInfo)->ObjectReferences[ lCount] >= 0);
+        }
 
-        bAcquiredTreeLock = TRUE;
-    }
+        ASSERT( (*ppObjectInfo)->ObjectReferenceCount == 0);
 
-    if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
-    {
+        pObjectInfo = (AFSObjectInfoCB *) InterlockedCompareExchangePointer( (PVOID *)ppObjectInfo,
+                                                                             NULL,
+                                                                             *ppObjectInfo);
 
-        pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
-                                               &pObjectInfo->ParentFileId);
-    }
+        if ( pObjectInfo == NULL)
+        {
 
-    //
-    // Remove it from the tree and list if it was inserted
-    //
+            try_return( NOTHING);
+        }
 
-    if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
-    {
+        ASSERT( *ppObjectInfo == NULL);
 
-        AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
-                            &pObjectInfo->TreeEntry);
-    }
+        if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+        {
 
-    if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
-    {
+            pParentObjectInfo = AFSFindObjectInfo( pVolume,
+                                                   &pObjectInfo->ParentFileId);
+            if( pParentObjectInfo != NULL)
+            {
 
-        if( pObjectInfo->ListEntry.fLink == NULL)
-        {
+                ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
 
-            pObjectInfo->VolumeCB->ObjectInfoListTail = (AFSObjectInfoCB *)pObjectInfo->ListEntry.bLink;
+                lCount = AFSObjectInfoDecrement( pParentObjectInfo,
+                                                 AFS_OBJECT_REFERENCE_CHILD);
 
-            if( pObjectInfo->VolumeCB->ObjectInfoListTail != NULL)
-            {
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n",
+                              pParentObjectInfo,
+                              lCount));
 
-                pObjectInfo->VolumeCB->ObjectInfoListTail->ListEntry.fLink = NULL;
+                AFSReleaseObjectInfo( &pParentObjectInfo);
             }
         }
-        else
+
+        //
+        // Remove it from the tree and list if it was inserted
+        //
+
+        if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
         {
 
-            ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.fLink))->ListEntry.bLink = pObjectInfo->ListEntry.bLink;
+            AFSRemoveHashEntry( &pVolume->ObjectInfoTree.TreeHead,
+                                &pObjectInfo->TreeEntry);
         }
 
-        if( pObjectInfo->ListEntry.bLink == NULL)
+        if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
         {
 
-            pObjectInfo->VolumeCB->ObjectInfoListHead = (AFSObjectInfoCB *)pObjectInfo->ListEntry.fLink;
+            if( pObjectInfo->ListEntry.fLink == NULL)
+            {
+
+                pVolume->ObjectInfoListTail = (AFSObjectInfoCB *)pObjectInfo->ListEntry.bLink;
+
+                if( pVolume->ObjectInfoListTail != NULL)
+                {
 
-            if( pObjectInfo->VolumeCB->ObjectInfoListHead != NULL)
+                    pVolume->ObjectInfoListTail->ListEntry.fLink = NULL;
+                }
+            }
+            else
             {
 
-                pObjectInfo->VolumeCB->ObjectInfoListHead->ListEntry.bLink = NULL;
+                ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.fLink))->ListEntry.bLink = pObjectInfo->ListEntry.bLink;
             }
-        }
-        else
-        {
 
-            ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.bLink))->ListEntry.fLink = pObjectInfo->ListEntry.fLink;
-        }
-    }
+            if( pObjectInfo->ListEntry.bLink == NULL)
+            {
 
-    if( pParentObjectInfo != NULL)
-    {
+                pVolume->ObjectInfoListHead = (AFSObjectInfoCB *)pObjectInfo->ListEntry.fLink;
 
-        ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+                if( pVolume->ObjectInfoListHead != NULL)
+                {
 
-        lCount = AFSObjectInfoDecrement( pParentObjectInfo,
-                                         AFS_OBJECT_REFERENCE_CHILD);
+                    pVolume->ObjectInfoListHead->ListEntry.bLink = NULL;
+                }
+            }
+            else
+            {
 
-        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n",
-                      pParentObjectInfo,
-                      lCount));
+                ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.bLink))->ListEntry.fLink = pObjectInfo->ListEntry.fLink;
+            }
+        }
 
-        AFSReleaseObjectInfo( &pParentObjectInfo);
-    }
+        bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
 
-    if( bAcquiredTreeLock)
-    {
+        if( bHeldInService)
+        {
 
-        AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
-    }
+            FileId = pObjectInfo->FileId;
+        }
 
-    if( bHeldInService)
-    {
+        ASSERT( pObjectInfo->ObjectReferenceCount == 0);
 
-        FileId = pObjectInfo->FileId;
-    }
+        ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
 
-    ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+        ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
 
-    ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
+        AFSExFreePoolWithTag( pObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
 
-    AFSExFreePoolWithTag( pObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
+        AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
 
-    AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
+try_exit:
 
-    //
-    // Release the fid in the service
-    //
+        if( bAcquiredTreeLock)
+        {
 
-    if( bHeldInService)
-    {
+            AFSReleaseResource( pVolume->ObjectInfoTree.TreeLock);
+        }
+
+        //
+        // Release the fid in the service
+        //
+
+        if( bHeldInService)
+        {
 
-        AFSReleaseFid( &FileId);
+            AFSReleaseFid( &FileId);
+        }
     }
 
     return;
@@ -8384,7 +7800,11 @@ AFSCloseLibrary()
                           AFSGlobalDotDirEntry->ObjectInformation,
                           lCount));
 
-            AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+            }
 
             ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
 
@@ -8407,7 +7827,11 @@ AFSCloseLibrary()
                           AFSGlobalDotDotDirEntry->ObjectInformation,
                           lCount));
 
-            AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+            }
 
             ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
 
@@ -8437,7 +7861,11 @@ AFSCloseLibrary()
                               pDirNode->ObjectInformation,
                               lCount));
 
-                AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+                if ( lCount == 0)
+                {
+
+                    AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+                }
 
                 ExDeleteResourceLite( &pDirNode->NonPaged->Lock);