Windows: Move Trace Stmts from FILE to CLEANUP
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSGeneric.cpp
index f524fa1..5a1b9c3 100644 (file)
@@ -56,6 +56,7 @@ AFSExceptionFilter( IN CHAR *FunctionString,
                     IN PEXCEPTION_POINTERS ExceptPtrs)
 {
 
+    UNREFERENCED_PARAMETER(Code);
     PEXCEPTION_RECORD ExceptRec;
     PCONTEXT Context;
 
@@ -274,7 +275,7 @@ AFSReleaseResource( IN PERESOURCE Resource)
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
-                  "AFSReleaseResource Releasing lock %08lX Thread %08lX\n",
+                  "AFSReleaseResource Releasing lock %p Thread %08lX\n",
                   Resource,
                   PsGetCurrentThread());
 
@@ -291,7 +292,7 @@ AFSConvertToShared( IN PERESOURCE Resource)
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
-                  "AFSConvertToShared Converting lock %08lX Thread %08lX\n",
+                  "AFSConvertToShared Converting lock %p Thread %08lX\n",
                   Resource,
                   PsGetCurrentThread());
 
@@ -363,7 +364,6 @@ AFSLockSystemBuffer( IN PIRP Irp,
                      IN ULONG Length)
 {
 
-    NTSTATUS Status = STATUS_SUCCESS;
     void *pAddress = NULL;
 
     if( Irp->MdlAddress != NULL)
@@ -423,7 +423,7 @@ AFSLockSystemBuffer( IN PIRP Irp,
 void *
 AFSLockUserBuffer( IN void *UserBuffer,
                    IN ULONG BufferLength,
-                                  OUT MDL ** Mdl)
+                   OUT MDL ** Mdl)
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
@@ -543,7 +543,6 @@ AFSUnmapServiceMappedBuffer( IN void *MappedBuffer,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    void *pMappedBuffer = NULL;
     AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
     KAPC stApcState;
 
@@ -630,8 +629,8 @@ AFSDefaultDispatch( IN PDEVICE_OBJECT DeviceObject,
                     IN PIRP Irp)
 {
 
+    UNREFERENCED_PARAMETER(DeviceObject);
     NTSTATUS            ntStatus = STATUS_INVALID_DEVICE_REQUEST;
-    PIO_STACK_LOCATION  pIrpSp = IoGetCurrentIrpStackLocation( Irp);
 
     AFSCompleteRequest( Irp,
                         ntStatus);
@@ -646,7 +645,6 @@ AFSInitializeGlobalDirectoryEntries()
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSDirectoryCB *pDirNode = NULL;
     ULONG ulEntryLength = 0;
-    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     AFSObjectInfoCB *pObjectInfoCB = NULL;
     AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
     LONG lCount;
@@ -672,11 +670,12 @@ AFSInitializeGlobalDirectoryEntries()
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
-        lCount = AFSObjectInfoIncrement( pObjectInfoCB);
+        lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+                                         AFS_OBJECT_REFERENCE_GLOBAL);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInitializeGlobalDirectoryEntries Increment count on object %08lX Cnt %d\n",
+                      "AFSInitializeGlobalDirectoryEntries Increment count on object %p Cnt %d\n",
                       pObjectInfoCB,
                       lCount);
 
@@ -692,15 +691,20 @@ AFSInitializeGlobalDirectoryEntries()
         if( pDirNode == NULL)
         {
 
-            AFSDeleteObjectInfo( pObjectInfoCB);
+            AFSDeleteObjectInfo( &pObjectInfoCB);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+            AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSInitializeGlobalDirectory AFS_DIR_ENTRY_TAG allocation failure\n");
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
+        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSInitializeGlobalDirectory AFS_DIR_ENTRY_TAG allocated %p\n",
+                      pDirNode);
+
         pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
                                                                                    sizeof( AFSNonPagedDirectoryCB),
                                                                                    AFS_DIR_ENTRY_NP_TAG);
@@ -710,7 +714,7 @@ AFSInitializeGlobalDirectoryEntries()
 
             ExFreePool( pDirNode);
 
-            AFSDeleteObjectInfo( pObjectInfoCB);
+            AFSDeleteObjectInfo( &pObjectInfoCB);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
@@ -779,11 +783,12 @@ AFSInitializeGlobalDirectoryEntries()
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
-        lCount = AFSObjectInfoIncrement( pObjectInfoCB);
+        lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+                                         AFS_OBJECT_REFERENCE_GLOBAL);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInitializeGlobalDirectoryEntries Increment count on object %08lX Cnt %d\n",
+                      "AFSInitializeGlobalDirectoryEntries Increment count on object %p Cnt %d\n",
                       pObjectInfoCB,
                       lCount);
 
@@ -799,11 +804,20 @@ AFSInitializeGlobalDirectoryEntries()
         if( pDirNode == NULL)
         {
 
-            AFSDeleteObjectInfo( pObjectInfoCB);
+            AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSInitializeGlobalDirectoryEntries AFS_DIR_ENTRY_TAG allocation failure\n");
+
+            AFSDeleteObjectInfo( &pObjectInfoCB);
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
+        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSInitializeGlobalDirectoryEntries AFS_DIR_ENTRY_TAG allocated %p\n",
+                      pDirNode);
+
         pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
                                                                                    sizeof( AFSNonPagedDirectoryCB),
                                                                                    AFS_DIR_ENTRY_NP_TAG);
@@ -813,7 +827,7 @@ AFSInitializeGlobalDirectoryEntries()
 
             ExFreePool( pDirNode);
 
-            AFSDeleteObjectInfo( pObjectInfoCB);
+            AFSDeleteObjectInfo( &pObjectInfoCB);
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -870,7 +884,7 @@ try_exit:
             if( AFSGlobalDotDirEntry != NULL)
             {
 
-                AFSDeleteObjectInfo( AFSGlobalDotDirEntry->ObjectInformation);
+                AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
 
                 ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
 
@@ -884,7 +898,7 @@ try_exit:
             if( AFSGlobalDotDotDirEntry != NULL)
             {
 
-                AFSDeleteObjectInfo( AFSGlobalDotDotDirEntry->ObjectInformation);
+                AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
 
                 ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
 
@@ -911,10 +925,6 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
     AFSDirectoryCB *pDirNode = NULL;
     NTSTATUS ntStatus = STATUS_SUCCESS;
     ULONG ulEntryLength = 0;
-    AFSDirEnumEntry *pDirEnumCB = NULL;
-    AFSFileID stTargetFileID;
-    AFSFcb *pVcb = NULL;
-    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     AFSObjectInfoCB *pObjectInfoCB = NULL;
     BOOLEAN bAllocatedObjectCB = FALSE;
     ULONGLONG ullIndex = 0;
@@ -970,17 +980,18 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInitDirEntry initialized object %08lX Parent Object %08lX for %wZ\n",
+                          "AFSInitDirEntry initialized object %p Parent Object %p for %wZ\n",
                           pObjectInfoCB,
                           ParentObjectInfo,
                           FileName);
         }
 
-        lCount = AFSObjectInfoIncrement( pObjectInfoCB);
+        lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+                                         AFS_OBJECT_REFERENCE_DIRENTRY);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInitDirEntry Increment count on object %08lX Cnt %d\n",
+                      "AFSInitDirEntry Increment count on object %p Cnt %d\n",
                       pObjectInfoCB,
                       lCount);
 
@@ -1007,6 +1018,11 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
+        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSInitDirEntry AFS_DIR_ENTRY_TAG allocated %p\n",
+                      pDirNode);
+
         pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
                                                                                 sizeof( AFSNonPagedDirectoryCB),
                                                                                 AFS_DIR_ENTRY_NP_TAG);
@@ -1190,6 +1206,11 @@ try_exit:
             if( pDirNode != NULL)
             {
 
+                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSInitDirEntry AFS_DIR_ENTRY_TAG deallocating %p\n",
+                              pDirNode);
+
                 AFSExFreePoolWithTag( pDirNode, AFS_DIR_ENTRY_TAG);
 
                 pDirNode = NULL;
@@ -1202,11 +1223,12 @@ try_exit:
             if( pObjectInfoCB != NULL)
             {
 
-                lCount = AFSObjectInfoDecrement( pObjectInfoCB);
+                lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                                 AFS_OBJECT_REFERENCE_DIRENTRY);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSInitDirEntry Decrement count on object %08lX Cnt %d\n",
+                              "AFSInitDirEntry Decrement count on object %p Cnt %d\n",
                               pObjectInfoCB,
                               lCount);
 
@@ -1215,7 +1237,7 @@ try_exit:
 
                     ASSERT( pObjectInfoCB->ObjectReferenceCount == 0);
 
-                    AFSDeleteObjectInfo( pObjectInfoCB);
+                    AFSDeleteObjectInfo( &pObjectInfoCB);
                 }
             }
         }
@@ -1303,7 +1325,6 @@ AFSEvaluateNode( IN GUID *AuthGroup,
                  IN AFSDirectoryCB *DirEntry)
 {
 
-    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSDirEnumEntry *pDirEntry = NULL;
     UNICODE_STRING uniTargetName;
@@ -1425,7 +1446,6 @@ AFSValidateSymLink( IN GUID *AuthGroup,
                     IN AFSDirectoryCB *DirEntry)
 {
 
-    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSDirEnumEntry *pDirEntry = NULL;
     UNICODE_STRING uniTargetName;
@@ -1448,6 +1468,11 @@ AFSValidateSymLink( IN GUID *AuthGroup,
             pDirEntry->FileType == AFS_FILE_TYPE_INVALID)
         {
 
+            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_VERBOSE_2,
+                          "AFSValidateSymLink Invalid type Status %08lX\n",
+                          STATUS_OBJECT_NAME_NOT_FOUND);
+
             try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
         }
 
@@ -1566,6 +1591,7 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
     NTSTATUS ntStatus = STATUS_SUCCESS;
     IO_STATUS_BLOCK stIoStatus;
     ULONG ulFilter = 0;
+    AFSObjectInfoCB * pParentObjectInfo = NULL;
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
@@ -1577,6 +1603,13 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                   (*ppObjectInfo)->FileId.Unique,
                   Reason);
 
+    if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+    {
+
+        pParentObjectInfo = AFSFindObjectInfo( (*ppObjectInfo)->VolumeCB,
+                                               &(*ppObjectInfo)->ParentFileId);
+    }
+
     if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_SYMLINK ||
         (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DFSLINK ||
         (*ppObjectInfo)->FileType == AFS_FILE_TYPE_MOUNTPOINT)
@@ -1619,27 +1652,31 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
             SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY);
         }
 
-        ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
-
-        if( Reason == AFS_INVALIDATE_CREDS)
+        if ( pParentObjectInfo != NULL)
         {
-            ulFilter |= FILE_NOTIFY_CHANGE_SECURITY;
-        }
 
-        if( Reason == AFS_INVALIDATE_DATA_VERSION ||
-            Reason == AFS_INVALIDATE_FLUSHED)
-        {
-            ulFilter |= FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE;
-        }
-        else
-        {
-            ulFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
-        }
+            ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
+
+            if( Reason == AFS_INVALIDATE_CREDS)
+            {
+                ulFilter |= FILE_NOTIFY_CHANGE_SECURITY;
+            }
+
+            if( Reason == AFS_INVALIDATE_DATA_VERSION ||
+                Reason == AFS_INVALIDATE_FLUSHED)
+            {
+                ulFilter |= FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE;
+            }
+            else
+            {
+                ulFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
+            }
 
-        AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
-                                        NULL,
-                                        ulFilter,
-                                        FILE_ACTION_MODIFIED);
+            AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+                                            NULL,
+                                            ulFilter,
+                                            FILE_ACTION_MODIFIED);
+        }
 
         try_return( ntStatus);
     }
@@ -1670,37 +1707,37 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                           (*ppObjectInfo)->FileId.Vnode,
                           (*ppObjectInfo)->FileId.Unique);
 
-            if( (*ppObjectInfo)->ParentObjectInformation != NULL)
+            if( pParentObjectInfo != NULL)
             {
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSInvalidateObject Set VERIFY flag on parent fid %08lX-%08lX-%08lX-%08lX\n",
-                              (*ppObjectInfo)->ParentObjectInformation->FileId.Cell,
-                              (*ppObjectInfo)->ParentObjectInformation->FileId.Volume,
-                              (*ppObjectInfo)->ParentObjectInformation->FileId.Vnode,
-                              (*ppObjectInfo)->ParentObjectInformation->FileId.Unique);
+                              pParentObjectInfo->FileId.Cell,
+                              pParentObjectInfo->FileId.Volume,
+                              pParentObjectInfo->FileId.Vnode,
+                              pParentObjectInfo->FileId.Unique);
 
-                SetFlag( (*ppObjectInfo)->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                (*ppObjectInfo)->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+                pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
 
-                (*ppObjectInfo)->ParentObjectInformation->Expiration.QuadPart = 0;
-            }
+                pParentObjectInfo->Expiration.QuadPart = 0;
 
-            if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DIRECTORY)
-            {
-                ulFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
-            }
-            else
-            {
-                ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
-            }
+                if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DIRECTORY)
+                {
+                    ulFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
+                }
+                else
+                {
+                    ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
+                }
 
-            AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
-                                            NULL,
-                                            ulFilter,
-                                            FILE_ACTION_REMOVED);
+                AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+                                                NULL,
+                                                ulFilter,
+                                                FILE_ACTION_REMOVED);
+            }
 
             if( NT_SUCCESS( AFSQueueInvalidateObject( (*ppObjectInfo),
                                                       Reason)))
@@ -1858,10 +1895,10 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                                                 ulFilter,
                                                 FILE_ACTION_MODIFIED);
             }
-            else
+            else if ( pParentObjectInfo != NULL)
             {
 
-                AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
+                AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
                                                 NULL,
                                                 ulFilter,
                                                 FILE_ACTION_MODIFIED);
@@ -1902,6 +1939,12 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
 
   try_exit:
 
+    if ( pParentObjectInfo != NULL)
+    {
+
+        AFSReleaseObjectInfo( &pParentObjectInfo);
+    }
+
     return ntStatus;
 }
 
@@ -1910,12 +1953,8 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB)
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSFcb      *pDcb = NULL, *pFcb = NULL, *pNextFcb = NULL;
     AFSVolumeCB *pVolumeCB = NULL;
-    AFSFcb      *pTargetDcb = NULL;
     AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
-    AFSDirectoryCB *pCurrentDirEntry = NULL;
-    BOOLEAN     bIsChild = FALSE;
     ULONGLONG   ullIndex = 0;
     AFSObjectInfoCB *pObjectInfo = NULL;
     LONG lCount;
@@ -1940,7 +1979,7 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB)
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInvalidateCache Acquiring RDR VolumeTreeLock lock %08lX SHARED %08lX\n",
+                      "AFSInvalidateCache Acquiring RDR VolumeTreeLock lock %p SHARED %08lX\n",
                       &pDevExt->Specific.RDR.VolumeTreeLock,
                       PsGetCurrentThread());
 
@@ -1963,11 +2002,12 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB)
         if( pVolumeCB != NULL)
         {
 
-            lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+            lCount = AFSVolumeIncrement( pVolumeCB,
+                                         AFS_VOLUME_REFERENCE_INVALIDATE);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInvalidateCache Increment count on volume %08lX Cnt %d\n",
+                          "AFSInvalidateCache Increment count on volume %p Cnt %d\n",
                           pVolumeCB,
                           lCount);
         }
@@ -2028,11 +2068,12 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB)
             // Reference the node so it won't be torn down
             //
 
-            lCount = AFSObjectInfoIncrement( pObjectInfo);
+            lCount = AFSObjectInfoIncrement( pObjectInfo,
+                                             AFS_OBJECT_REFERENCE_INVALIDATION);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInvalidateCache Increment count on object %08lX Cnt %d\n",
+                          "AFSInvalidateCache Increment count on object %p Cnt %d\n",
                           pObjectInfo,
                           lCount);
         }
@@ -2063,11 +2104,12 @@ try_exit:
         if( pObjectInfo != NULL)
         {
 
-            lCount = AFSObjectInfoDecrement( pObjectInfo);
+            lCount = AFSObjectInfoDecrement( pObjectInfo,
+                                             AFS_OBJECT_REFERENCE_INVALIDATION);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInvalidateCache Decrement count on object %08lX Cnt %d\n",
+                          "AFSInvalidateCache Decrement count on object %p Cnt %d\n",
                           pObjectInfo,
                           lCount);
         }
@@ -2075,11 +2117,12 @@ try_exit:
         if ( pVolumeCB != NULL)
         {
 
-            lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+            lCount = AFSVolumeDecrement( pVolumeCB,
+                                         AFS_VOLUME_REFERENCE_INVALIDATE);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInvalidateCache Decrement count on volume %08lX Cnt %d\n",
+                          "AFSInvalidateCache Decrement count on volume %p Cnt %d\n",
                           pVolumeCB,
                           lCount);
         }
@@ -2095,11 +2138,13 @@ AFSIsChildOfParent( IN AFSFcb *Dcb,
 
     BOOLEAN bIsChild = FALSE;
     AFSFcb *pCurrentFcb = Fcb;
+    AFSObjectInfoCB * pParentObjectInfo = NULL;
 
     while( pCurrentFcb != NULL)
     {
 
-        if( pCurrentFcb->ObjectInformation->ParentObjectInformation == Dcb->ObjectInformation)
+        if( BooleanFlagOn( pCurrentFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+            AFSIsEqualFID( &pCurrentFcb->ObjectInformation->ParentFileId, &Dcb->ObjectInformation->FileId))
         {
 
             bIsChild = TRUE;
@@ -2107,7 +2152,21 @@ AFSIsChildOfParent( IN AFSFcb *Dcb,
             break;
         }
 
-        pCurrentFcb = pCurrentFcb->ObjectInformation->ParentObjectInformation->Fcb;
+        pParentObjectInfo = AFSFindObjectInfo( pCurrentFcb->ObjectInformation->VolumeCB,
+                                               &pCurrentFcb->ObjectInformation->ParentFileId);
+
+        if ( pParentObjectInfo != NULL)
+        {
+
+            pCurrentFcb = pParentObjectInfo->Fcb;
+
+            AFSReleaseObjectInfo( &pParentObjectInfo);
+        }
+        else
+        {
+
+            pCurrentFcb = NULL;
+        }
     }
 
     return bIsChild;
@@ -2241,7 +2300,7 @@ AFSSubstituteSysName( IN UNICODE_STRING *ComponentName,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSSubstituteSysName Acquiring SysName lock %08lX SHARED %08lX\n",
+                      "AFSSubstituteSysName Acquiring SysName lock %p SHARED %08lX\n",
                       pSysNameLock,
                       PsGetCurrentThread());
 
@@ -2264,6 +2323,12 @@ AFSSubstituteSysName( IN UNICODE_STRING *ComponentName,
         if( pSysName == NULL)
         {
 
+            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_VERBOSE_2,
+                          "AFSSubstituteSysName No sysname %wZ Status %08lX\n",
+                          &ComponentName,
+                          STATUS_OBJECT_NAME_NOT_FOUND);
+
             try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
         }
 
@@ -2473,8 +2538,6 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
     AFSObjectInfoCB *pCurrentObject = NULL;
     AFSObjectInfoCB *pNextObject = NULL;
     LONG lCount;
-    AFSFcb *pFcb = NULL;
-    ULONG ulFilter = 0;
 
     __Enter
     {
@@ -2519,11 +2582,12 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
         if ( pCurrentObject )
         {
 
-            lCount = AFSObjectInfoIncrement( pCurrentObject);
+            lCount = AFSObjectInfoIncrement( pCurrentObject,
+                                             AFS_OBJECT_REFERENCE_INVALIDATION);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInvalidateVolumeObjects Increment count on object %08lX Cnt %d\n",
+                          "AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
                           pCurrentObject,
                           lCount);
 
@@ -2533,11 +2597,12 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
             if ( pCurrentObject)
             {
 
-                lCount = AFSObjectInfoDecrement( pCurrentObject);
+                lCount = AFSObjectInfoDecrement( pCurrentObject,
+                                                 AFS_OBJECT_REFERENCE_INVALIDATION);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSInvalidateVolumeObjects Decrement count on object %08lX Cnt %d\n",
+                              "AFSInvalidateVolumeObjects Decrement count on object %p Cnt %d\n",
                               pCurrentObject,
                               lCount);
             }
@@ -2559,11 +2624,12 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
             // Reference the node so it won't be torn down
             //
 
-            lCount = AFSObjectInfoIncrement( pCurrentObject);
+            lCount = AFSObjectInfoIncrement( pCurrentObject,
+                                             AFS_OBJECT_REFERENCE_INVALIDATION);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInvalidateVolumeObjects Increment count on object %08lX Cnt %d\n",
+                          "AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
                           pCurrentObject,
                           lCount);
         }
@@ -2580,11 +2646,12 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
                 // Reference the node so it won't be torn down
                 //
 
-                lCount = AFSObjectInfoIncrement( pNextObject);
+                lCount = AFSObjectInfoIncrement( pNextObject,
+                                                 AFS_OBJECT_REFERENCE_INVALIDATION);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSInvalidateVolumeObjects Increment count on object %08lX Cnt %d\n",
+                              "AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
                               pNextObject,
                               lCount);
             }
@@ -2597,11 +2664,12 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
             if ( pCurrentObject )
             {
 
-                lCount = AFSObjectInfoDecrement( pCurrentObject);
+                lCount = AFSObjectInfoDecrement( pCurrentObject,
+                                                 AFS_OBJECT_REFERENCE_INVALIDATION);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSInvalidateVolumeObjects Decrement count on object %08lX Cnt %d\n",
+                              "AFSInvalidateVolumeObjects Decrement count on object %p Cnt %d\n",
                               pCurrentObject,
                               lCount);
             }
@@ -2630,7 +2698,7 @@ AFSInvalidateAllVolumes( VOID)
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
-                  "AFSInvalidateAllVolumes Acquiring RDR VolumeListLock lock %08lX SHARED %08lX\n",
+                  "AFSInvalidateAllVolumes Acquiring RDR VolumeListLock lock %p SHARED %08lX\n",
                   &pRDRDeviceExt->Specific.RDR.VolumeListLock,
                   PsGetCurrentThread());
 
@@ -2644,15 +2712,16 @@ AFSInvalidateAllVolumes( VOID)
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInvalidateAllVolumes Acquiring VolumeRoot ObjectInfoTree lock %08lX SHARED %08lX\n",
+                      "AFSInvalidateAllVolumes Acquiring VolumeRoot ObjectInfoTree lock %p SHARED %08lX\n",
                       pVolumeCB->ObjectInfoTree.TreeLock,
                       PsGetCurrentThread());
 
-        lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+        lCount = AFSVolumeIncrement( pVolumeCB,
+                                     AFS_VOLUME_REFERENCE_INVALIDATE);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInvalidateAllVolumes Increment count on volume %08lX Cnt %d\n",
+                      "AFSInvalidateAllVolumes Increment count on volume %p Cnt %d\n",
                       pVolumeCB,
                       lCount);
     }
@@ -2665,11 +2734,12 @@ AFSInvalidateAllVolumes( VOID)
         if ( pNextVolumeCB)
         {
 
-            lCount = InterlockedIncrement( &pNextVolumeCB->VolumeReferenceCount);
+            lCount = AFSVolumeIncrement( pNextVolumeCB,
+                                         AFS_VOLUME_REFERENCE_INVALIDATE);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInvalidateAllVolumes Increment count on volume %08lX Cnt %d\n",
+                          "AFSInvalidateAllVolumes Increment count on volume %p Cnt %d\n",
                           pVolumeCB,
                           lCount);
         }
@@ -2683,11 +2753,12 @@ AFSInvalidateAllVolumes( VOID)
         AFSAcquireShared( &pRDRDeviceExt->Specific.RDR.VolumeListLock,
                           TRUE);
 
-        lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+        lCount = AFSVolumeDecrement( pVolumeCB,
+                                     AFS_VOLUME_REFERENCE_INVALIDATE);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInvalidateAllVolumes Decrement count on volume %08lX Cnt %d\n",
+                      "AFSInvalidateAllVolumes Decrement count on volume %p Cnt %d\n",
                       pVolumeCB,
                       lCount);
 
@@ -2958,7 +3029,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSVerifyEntry Acquiring Fcb lock %08lX EXCL %08lX\n",
+                                  "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
                                   &pObjectInfo->Fcb->NPFcb->Resource,
                                   PsGetCurrentThread());
 
@@ -2998,7 +3069,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSVerifyEntry Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                                  "AFSVerifyEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                                   &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                   PsGetCurrentThread());
 
@@ -3015,7 +3086,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSVerifyEntry Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+                                  "AFSVerifyEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                                   &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                   PsGetCurrentThread());
 
@@ -3067,9 +3138,6 @@ AFSVerifyEntry( IN GUID *AuthGroup,
             case AFS_FILE_TYPE_DIRECTORY:
             {
 
-                AFSFcb *pCurrentFcb = NULL;
-                AFSDirectoryCB *pCurrentDirEntry = NULL;
-
                 //
                 // For a directory or root entry flush the content of
                 // the directory enumeration.
@@ -3213,8 +3281,6 @@ AFSSetVolumeState( IN AFSVolumeStatusCB *VolumeStatus)
     AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     ULONGLONG   ullIndex = 0;
     AFSVolumeCB *pVolumeCB = NULL;
-    AFSFcb *pFcb = NULL;
-    AFSObjectInfoCB *pCurrentObject = NULL;
     LONG lCount;
 
     __Enter
@@ -3233,7 +3299,7 @@ AFSSetVolumeState( IN AFSVolumeStatusCB *VolumeStatus)
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSSetVolumeState Acquiring RDR VolumeTreeLock lock %08lX SHARED %08lX\n",
+                      "AFSSetVolumeState Acquiring RDR VolumeTreeLock lock %p SHARED %08lX\n",
                       &pDevExt->Specific.RDR.VolumeTreeLock,
                       PsGetCurrentThread());
 
@@ -3252,11 +3318,12 @@ AFSSetVolumeState( IN AFSVolumeStatusCB *VolumeStatus)
         if( pVolumeCB != NULL)
         {
 
-            lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+            lCount = AFSVolumeIncrement( pVolumeCB,
+                                         AFS_VOLUME_REFERENCE_INVALIDATE);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSSetVolumeState Increment count on volume %08lX Cnt %d\n",
+                          "AFSSetVolumeState Increment count on volume %p Cnt %d\n",
                           pVolumeCB,
                           lCount);
 
@@ -3276,96 +3343,6 @@ AFSSetVolumeState( IN AFSVolumeStatusCB *VolumeStatus)
 
                 InterlockedOr( (LONG *)&(pVolumeCB->Flags), AFS_VOLUME_FLAGS_OFFLINE);
             }
-
-            AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
-                              TRUE);
-
-            pCurrentObject = pVolumeCB->ObjectInfoListHead;;
-
-            while( pCurrentObject != NULL)
-            {
-
-                if( VolumeStatus->Online)
-                {
-
-                    ClearFlag( pCurrentObject->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID);
-
-                    SetFlag( pCurrentObject->Flags, AFS_OBJECT_FLAGS_VERIFY);
-
-                    pCurrentObject->DataVersion.QuadPart = (ULONGLONG)-1;
-                }
-                else
-                {
-
-                    SetFlag( pCurrentObject->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID);
-                }
-
-                pFcb = pCurrentObject->Fcb;
-
-                if( pFcb != NULL &&
-                    !(VolumeStatus->Online) &&
-                    pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
-                {
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
-                                  AFS_TRACE_LEVEL_ERROR,
-                                  "AFSSetVolumeState Marking volume offline and canceling extents Volume Cell %08lX Volume %08lX\n",
-                                  VolumeStatus->FileID.Cell,
-                                  VolumeStatus->FileID.Volume);
-
-                    //
-                    // Clear out the extents
-                    //
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSSetVolumeState Acquiring Fcb extents lock %08lX EXCL %08lX\n",
-                                  &pFcb->NPFcb->Specific.File.ExtentsResource,
-                                  PsGetCurrentThread());
-
-                    AFSAcquireExcl( &pFcb->NPFcb->Specific.File.ExtentsResource,
-                                    TRUE);
-
-                    pFcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_CANCELLED;
-
-                    KeSetEvent( &pFcb->NPFcb->Specific.File.ExtentsRequestComplete,
-                                0,
-                                FALSE);
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSSetVolumeState Releasing Fcb extents lock %08lX EXCL %08lX\n",
-                                  &pFcb->NPFcb->Specific.File.ExtentsResource,
-                                  PsGetCurrentThread());
-
-                    AFSReleaseResource( &pFcb->NPFcb->Specific.File.ExtentsResource);
-
-                    //
-                    // And get rid of them (note this involves waiting
-                    // for any writes or reads to the cache to complete)
-                    //
-
-                    AFSTearDownFcbExtents( pFcb,
-                                           NULL);
-                }
-
-                pCurrentObject = (AFSObjectInfoCB *)pCurrentObject->ListEntry.fLink;
-            }
-
-            AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
-
-            lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSSetVolumeState Decrement count on volume %08lX Cnt %d\n",
-                          pVolumeCB,
-                          lCount);
-        }
-        else
-        {
-
-            AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
         }
     }
 
@@ -3424,7 +3401,6 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo,
     AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     BOOLEAN  bAcquiredLock = FALSE;
     AFSDirectoryCB *pCurrentDirEntry = NULL, *pNextDirEntry = NULL;
-    AFSFcb *pFcb = NULL;
 
     __Enter
     {
@@ -3442,7 +3418,7 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSValidateDirectoryCache Acquiring DirectoryNodeHdr.TreeLock lock %08lX EXCL %08lX\n",
+                          "AFSValidateDirectoryCache Acquiring DirectoryNodeHdr.TreeLock lock %p EXCL %08lX\n",
                           ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                           PsGetCurrentThread());
 
@@ -3462,7 +3438,7 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSValidateDirectoryCache Empty Node List but Non-Zero Node Count %08lX for dir FID %08lX-%08lX-%08lX-%08lX\n",
+                          "AFSValidateDirectoryCache Empty Node List but Non-Zero Node Count %d for dir FID %08lX-%08lX-%08lX-%08lX\n",
                           ObjectInfo->Specific.Directory.DirectoryNodeCount,
                           ObjectInfo->FileId.Cell,
                           ObjectInfo->FileId.Volume,
@@ -3508,7 +3484,7 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSValidateDirectoryCache Clear VALID flag on DE %p Reference count %08lX\n",
+                                  "AFSValidateDirectoryCache Clear VALID flag on DE %p Reference count %d\n",
                                   pCurrentDirEntry,
                                   pCurrentDirEntry->DirOpenReferenceCount);
 
@@ -3614,7 +3590,7 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSValidateDirectoryCache Processing INVALID DE %p Reference count %08lX\n",
+                          "AFSValidateDirectoryCache Processing INVALID DE %p Reference count %d\n",
                           pCurrentDirEntry,
                           pCurrentDirEntry->DirOpenReferenceCount);
 
@@ -4023,7 +3999,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSValidateEntry Acquiring Fcb lock %08lX EXCL %08lX\n",
+                                      "AFSValidateEntry Acquiring Fcb lock %p EXCL %08lX\n",
                                       &pCurrentFcb->NPFcb->Resource,
                                       PsGetCurrentThread());
 
@@ -4086,7 +4062,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSValidateEntry Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                                          "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                                           &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                           PsGetCurrentThread());
 
@@ -4166,7 +4142,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSValidateEntry Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                                          "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                                           &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                           PsGetCurrentThread());
 
@@ -4242,7 +4218,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSValidateEntry Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                                      "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                                       &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                       PsGetCurrentThread());
 
@@ -4263,7 +4239,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSValidateEntry Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+                                      "AFSValidateEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                                       &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                       PsGetCurrentThread());
 
@@ -4276,8 +4252,6 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
             case AFS_FILE_TYPE_DIRECTORY:
             {
 
-                AFSDirectoryCB *pCurrentDirEntry = NULL;
-
                 if( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
                 {
 
@@ -4288,7 +4262,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSValidateEntry Acquiring DirectoryNodeHdr.TreeLock lock %08lX EXCL %08lX\n",
+                                  "AFSValidateEntry Acquiring DirectoryNodeHdr.TreeLock lock %p EXCL %08lX\n",
                                   pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                                   PsGetCurrentThread());
 
@@ -4390,6 +4364,7 @@ AFSInitializeSpecialShareNameList()
     UNICODE_STRING uniShareName;
     ULONG ulEntryLength = 0;
     AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
+    LONG lCount;
 
     __Enter
     {
@@ -4406,14 +4381,16 @@ AFSInitializeSpecialShareNameList()
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
+        lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+                                         AFS_OBJECT_REFERENCE_GLOBAL);
+
         AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInitializeSpecialShareNameList (srvsvc) Initializing count (1) on object %08lX\n",
-                      pObjectInfoCB);
-
-        pObjectInfoCB->ObjectReferenceCount = 1;
+                      "AFSInitializeSpecialShareNameList (srvsvc) Increment count on object %p Cnt %d\n",
+                      pObjectInfoCB,
+                      lCount);
 
-        pObjectInfoCB->FileType = AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
+        pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
 
         ulEntryLength = sizeof( AFSDirectoryCB) +
                                      uniShareName.Length;
@@ -4425,11 +4402,16 @@ AFSInitializeSpecialShareNameList()
         if( pDirNode == NULL)
         {
 
-            AFSDeleteObjectInfo( pObjectInfoCB);
+            AFSDeleteObjectInfo( &pObjectInfoCB);
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
+        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSInitializeSpecialShareNameList (srvsvc) AFS_DIR_ENTRY_TAG allocated %p\n",
+                      pDirNode);
+
         pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
                                                                                    sizeof( AFSNonPagedDirectoryCB),
                                                                                    AFS_DIR_ENTRY_NP_TAG);
@@ -4439,7 +4421,7 @@ AFSInitializeSpecialShareNameList()
 
             ExFreePool( pDirNode);
 
-            AFSDeleteObjectInfo( pObjectInfoCB);
+            AFSDeleteObjectInfo( &pObjectInfoCB);
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -4492,14 +4474,16 @@ AFSInitializeSpecialShareNameList()
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
+        lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+                                         AFS_OBJECT_REFERENCE_GLOBAL);
+
         AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInitializeSpecialShareNameList (ipc$) Initializing count (1) on object %08lX\n",
-                      pObjectInfoCB);
-
-        pObjectInfoCB->ObjectReferenceCount = 1;
+                      "AFSInitializeSpecialShareNameList (ipc$) Incrementing count on object %p Cnt %d\n",
+                      pObjectInfoCB,
+                      lCount);
 
-        pObjectInfoCB->FileType = AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
+        pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
 
         ulEntryLength = sizeof( AFSDirectoryCB) +
                                      uniShareName.Length;
@@ -4511,11 +4495,16 @@ AFSInitializeSpecialShareNameList()
         if( pDirNode == NULL)
         {
 
-            AFSDeleteObjectInfo( pObjectInfoCB);
+            AFSDeleteObjectInfo( &pObjectInfoCB);
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
+        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSInitializeSpecialShareNameList (ipc$) AFS_DIR_ENTRY_TAG allocated %p\n",
+                      pDirNode);
+
         pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
                                                                                    sizeof( AFSNonPagedDirectoryCB),
                                                                                    AFS_DIR_ENTRY_NP_TAG);
@@ -4525,7 +4514,7 @@ AFSInitializeSpecialShareNameList()
 
             ExFreePool( pDirNode);
 
-            AFSDeleteObjectInfo( pObjectInfoCB);
+            AFSDeleteObjectInfo( &pObjectInfoCB);
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -4580,7 +4569,7 @@ try_exit:
 
                     pLastDirNode = (AFSDirectoryCB *)pDirNode->ListEntry.fLink;
 
-                    AFSDeleteObjectInfo( pDirNode->ObjectInformation);
+                    AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
 
                     ExDeleteResourceLite( &pDirNode->NonPaged->Lock);
 
@@ -4795,7 +4784,7 @@ AFSEnumerateGlobalRoot( IN GUID *AuthGroup)
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSEnumerateGlobalRoot Acquiring GlobalRoot DirectoryNodeHdr.TreeLock lock %08lX EXCL %08lX\n",
+                      "AFSEnumerateGlobalRoot Acquiring GlobalRoot DirectoryNodeHdr.TreeLock lock %p EXCL %08lX\n",
                       AFSGlobalRoot->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
                       PsGetCurrentThread());
 
@@ -5101,11 +5090,12 @@ AFSInitNameArray( IN AFSDirectoryCB *DirectoryCB,
 
             pNameArray->LinkCount = 0;
 
-            lCount = InterlockedIncrement( &DirectoryCB->DirOpenReferenceCount);
+            lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInitNameArray Increment count on %wZ DE %p Cnt %d\n",
+                          "AFSInitNameArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
+                          pNameArray,
                           &DirectoryCB->NameInformation.FileName,
                           DirectoryCB,
                           lCount);
@@ -5151,11 +5141,6 @@ AFSPopulateNameArray( IN AFSNameArrayHdr *NameArray,
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSNameArrayCB *pCurrentElement = NULL;
-    UNICODE_STRING uniComponentName, uniRemainingPath;
-    AFSObjectInfoCB *pCurrentObject = NULL;
-    ULONG  ulTotalCount = 0;
-    ULONG ulIndex = 0;
-    USHORT usLength = 0;
     LONG lCount;
 
     __Enter
@@ -5188,11 +5173,12 @@ AFSPopulateNameArray( IN AFSNameArrayHdr *NameArray,
 
         pCurrentElement->DirectoryCB = DirectoryCB->ObjectInformation->VolumeCB->DirectoryCB;
 
-        lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->DirOpenReferenceCount);
+        lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSPopulateNameArray Increment count on volume %wZ DE %p Cnt %d\n",
+                      "AFSPopulateNameArray [NA:%p] Increment count on volume %wZ DE %p Cnt %d\n",
+                      NameArray,
                       &pCurrentElement->DirectoryCB->NameInformation.FileName,
                       pCurrentElement->DirectoryCB,
                       lCount);
@@ -5250,11 +5236,6 @@ AFSPopulateNameArrayFromRelatedArray( IN AFSNameArrayHdr *NameArray,
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSNameArrayCB *pCurrentElement = NULL, *pCurrentRelatedElement = NULL;
-    UNICODE_STRING uniComponentName, uniRemainingPath;
-    AFSObjectInfoCB *pObjectInfo = NULL;
-    ULONG  ulTotalCount = 0;
-    ULONG ulIndex = 0;
-    USHORT usLength = 0;
     LONG lCount;
 
     __Enter
@@ -5306,11 +5287,12 @@ AFSPopulateNameArrayFromRelatedArray( IN AFSNameArrayHdr *NameArray,
                 SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
             }
 
-            lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->DirOpenReferenceCount);
+            lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSPopulateNameArrayFromRelatedArray Increment count on %wZ DE %p Cnt %d\n",
+                          "AFSPopulateNameArrayFromRelatedArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
+                          NameArray,
                           &pCurrentElement->DirectoryCB->NameInformation.FileName,
                           pCurrentElement->DirectoryCB,
                           lCount);
@@ -5373,11 +5355,12 @@ AFSFreeNameArray( IN AFSNameArrayHdr *NameArray)
 
             pCurrentElement = &NameArray->ElementArray[ lElement];
 
-            lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->DirOpenReferenceCount);
+            lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSFreeNameArray Decrement count on %wZ DE %p Cnt %d\n",
+                          "AFSFreeNameArray [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
+                          NameArray,
                           &pCurrentElement->DirectoryCB->NameInformation.FileName,
                           pCurrentElement->DirectoryCB,
                           lCount);
@@ -5415,7 +5398,7 @@ AFSInsertNextElement( IN AFSNameArrayHdr *NameArray,
                       &DirectoryCB->NameInformation.FileName,
                       DirectoryCB->ObjectInformation->FileType);
 
-        if( NameArray->Count == NameArray->MaxElementCount)
+        if( NameArray->Count == (LONG) NameArray->MaxElementCount)
         {
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
@@ -5458,16 +5441,17 @@ AFSInsertNextElement( IN AFSNameArrayHdr *NameArray,
 
         lCount = InterlockedIncrement( &NameArray->Count);
 
-        lCount = InterlockedIncrement( &DirectoryCB->DirOpenReferenceCount);
+        lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInsertNextElement Increment count on %wZ DE %p Cnt %d\n",
+                      "AFSInsertNextElement [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
+                      NameArray,
                       &DirectoryCB->NameInformation.FileName,
                       DirectoryCB,
                       lCount);
 
-        ASSERT( lCount >= 2);
+        ASSERT( lCount > 0);
 
         pCurrentElement->DirectoryCB = DirectoryCB;
 
@@ -5532,11 +5516,12 @@ AFSBackupEntry( IN AFSNameArrayHdr *NameArray)
             try_return( pCurrentElement);
         }
 
-        lCount = InterlockedDecrement( &NameArray->CurrentEntry->DirectoryCB->DirOpenReferenceCount);
+        lCount = InterlockedDecrement( &NameArray->CurrentEntry->DirectoryCB->NameArrayReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSBackupEntry Decrement count on %wZ DE %p Cnt %d\n",
+                      "AFSBackupEntry [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
+                      NameArray,
                       &NameArray->CurrentEntry->DirectoryCB->NameInformation.FileName,
                       NameArray->CurrentEntry->DirectoryCB,
                       lCount);
@@ -5690,11 +5675,12 @@ AFSResetNameArray( IN AFSNameArrayHdr *NameArray,
 
             pCurrentElement = &NameArray->ElementArray[ lElement];
 
-            lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->DirOpenReferenceCount);
+            lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSResetNameArray Decrement count on %wZ DE %p Cnt %d\n",
+                          "AFSResetNameArray [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
+                          NameArray,
                           &pCurrentElement->DirectoryCB->NameInformation.FileName,
                           pCurrentElement->DirectoryCB,
                           lCount);
@@ -5719,11 +5705,12 @@ AFSResetNameArray( IN AFSNameArrayHdr *NameArray,
 
             NameArray->LinkCount = 0;
 
-            lCount = InterlockedIncrement( &DirectoryCB->DirOpenReferenceCount);
+            lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSResetNameArray Increment count on %wZ DE %p Cnt %d\n",
+                          "AFSResetNameArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
+                          NameArray,
                           &DirectoryCB->NameInformation.FileName,
                           DirectoryCB,
                           lCount);
@@ -5888,6 +5875,8 @@ AFSVerifyVolume( IN ULONGLONG ProcessId,
                  IN AFSVolumeCB *VolumeCB)
 {
 
+    UNREFERENCED_PARAMETER(ProcessId);
+    UNREFERENCED_PARAMETER(VolumeCB);
     NTSTATUS ntStatus = STATUS_SUCCESS;
 
 
@@ -5895,7 +5884,7 @@ AFSVerifyVolume( IN ULONGLONG ProcessId,
 }
 
 NTSTATUS
-AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ObjectInfo)
+AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ParentObjectInfo)
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
@@ -5908,7 +5897,7 @@ AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ObjectInfo)
     __Enter
     {
 
-        pObjectInfoCB = AFSAllocateObjectInfo( ObjectInfo,
+        pObjectInfoCB = AFSAllocateObjectInfo( ParentObjectInfo,
                                                0);
 
         if( pObjectInfoCB == NULL)
@@ -5917,14 +5906,16 @@ AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ObjectInfo)
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
+        lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+                                         AFS_OBJECT_REFERENCE_DIRENTRY);
+
         AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInitPIOCtlDirectoryCB Initializing count (1) on object %08lX\n",
-                      pObjectInfoCB);
-
-        pObjectInfoCB->ObjectReferenceCount = 1;
+                      "AFSInitPIOCtlDirectoryCB Increment count on object %p Cnt %d\n",
+                      pObjectInfoCB,
+                      lCount);
 
-        pObjectInfoCB->FileType = AFS_FILE_TYPE_PIOCTL;
+        pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_PIOCTL;
 
         pObjectInfoCB->FileAttributes = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
 
@@ -5937,11 +5928,14 @@ AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ObjectInfo)
         if( pDirNode == NULL)
         {
 
-            AFSDeleteObjectInfo( pObjectInfoCB);
-
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
+        AFSDbgLogMsg( 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);
@@ -5985,27 +5979,15 @@ AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ObjectInfo)
         pDirNode->CaseInsensitiveTreeEntry.HashIndex = AFSGenerateCRC( &pDirNode->NameInformation.FileName,
                                                                        TRUE);
 
-        if ( InterlockedCompareExchangePointer( (PVOID *)&ObjectInfo->Specific.Directory.PIOCtlDirectoryCB, pDirNode, NULL) != NULL)
+        if ( InterlockedCompareExchangePointer( (PVOID *)&ParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB, pDirNode, NULL) != NULL)
         {
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_WARNING,
-                          "AFSInitPIOCtlDirectoryCB Raced PIOCtlDirectoryCB %08lX pFcb %08lX\n",
-                          ObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
+                          "AFSInitPIOCtlDirectoryCB Raced PIOCtlDirectoryCB %p pFcb %p\n",
+                          ParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
                           pDirNode);
 
-            //
-            // Increment the open reference and handle on the node
-            //
-
-            lCount = AFSObjectInfoIncrement( pDirNode->ObjectInformation);
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInitPIOCtlDirectoryCB Increment count on Object %08lX Cnt %d\n",
-                          pDirNode->ObjectInformation,
-                          lCount);
-
             try_return( ntStatus = STATUS_REPARSE);
         }
 
@@ -6017,6 +5999,11 @@ try_exit:
             if ( pDirNode != NULL)
             {
 
+                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSInitPIOCtlDirectoryCB AFS_DIR_ENTRY_TAG deallocating %p\n",
+                              pDirNode);
+
                 AFSExFreePoolWithTag( pDirNode, AFS_DIR_ENTRY_TAG);
             }
 
@@ -6031,7 +6018,16 @@ try_exit:
             if ( pObjectInfoCB != NULL)
             {
 
-                AFSDeleteObjectInfo( pObjectInfoCB);
+                lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                                 AFS_OBJECT_REFERENCE_DIRENTRY);
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSInitPIOCtlDirectoryCB Decrement count on object %p Cnt %d\n",
+                              pObjectInfoCB,
+                              lCount);
+
+                AFSDeleteObjectInfo( &pObjectInfoCB);
             }
         }
     }
@@ -6049,11 +6045,15 @@ AFSRetrieveFileAttributes( IN AFSDirectoryCB *ParentDirectoryCB,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSDirEnumEntry *pDirEntry = NULL, *pLastDirEntry = NULL;
-    UNICODE_STRING uniFullPathName;
+    AFSDirEnumEntry *pDirEntry = NULL;
+    UNICODE_STRING uniFullPathName = {0};
     AFSNameArrayHdr    *pNameArray = NULL;
     AFSVolumeCB *pVolumeCB = NULL;
+    LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+    AFSVolumeCB *pNewVolumeCB = NULL;
+    LONG NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
     AFSDirectoryCB *pDirectoryEntry = NULL, *pParentDirEntry = NULL;
+    AFSDirectoryCB *pNewParentDirEntry = NULL;
     WCHAR *pwchBuffer = NULL;
     UNICODE_STRING uniComponentName, uniRemainingPath, uniParsedName;
     ULONG ulNameDifference = 0;
@@ -6305,12 +6305,16 @@ AFSRetrieveFileAttributes( IN AFSDirectoryCB *ParentDirectoryCB,
         // Increment the ref count on the volume and dir entry for correct processing below
         //
 
-        lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+        VolumeReferenceReason = AFS_VOLUME_REFERENCE_FILE_ATTRS;
+
+        lCount = AFSVolumeIncrement( pVolumeCB,
+                                     VolumeReferenceReason);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSRetrieveFileAttributes Increment count on volume %08lX Cnt %d\n",
+                      "AFSRetrieveFileAttributes Increment count on volume %p Reason %u Cnt %d\n",
                       pVolumeCB,
+                      VolumeReferenceReason,
                       lCount);
 
         lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
@@ -6329,68 +6333,62 @@ AFSRetrieveFileAttributes( IN AFSDirectoryCB *ParentDirectoryCB,
                                        &uniParsedName,
                                        pNameArray,
                                        AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL,
-                                       &pVolumeCB,
-                                       &pParentDirEntry,
+                                       pVolumeCB,
+                                       pParentDirEntry,
+                                       &pNewVolumeCB,
+                                       &NewVolumeReferenceReason,
+                                       &pNewParentDirEntry,
                                        &pDirectoryEntry,
                                        NULL);
 
-        if( !NT_SUCCESS( ntStatus) ||
-            ntStatus == STATUS_REPARSE)
-        {
-
-            //
-            // The volume lock was released on failure or reparse above
-            // Except for STATUS_OBJECT_NAME_NOT_FOUND
-            //
+        //
+        // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+        // even if pVolumeCB == pNewVolumeCB.  It is always safe to release
+        // the reference on pVolumeCB that was held prior to the call.
+        // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+        // will be released second.
+        //
 
-            if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND)
-            {
+        lCount = AFSVolumeDecrement( pVolumeCB,
+                                     VolumeReferenceReason);
 
-                if( pVolumeCB != NULL)
-                {
+        AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSRetrieveFileAttributes Decrement count on volume %p Reason %u Cnt %d\n",
+                      pVolumeCB,
+                      VolumeReferenceReason,
+                      lCount);
 
-                    lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+        pVolumeCB = pNewVolumeCB;
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSRetrieveFileAttributes Decrement count on volume %08lX Cnt %d\n",
-                                  pVolumeCB,
-                                  lCount);
-                }
+        pNewVolumeCB = NULL;
 
-                if( pDirectoryEntry != NULL)
-                {
+        VolumeReferenceReason = NewVolumeReferenceReason;
 
-                    lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
+        NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSRetrieveFileAttributes Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
-                                  &pDirectoryEntry->NameInformation.FileName,
-                                  pDirectoryEntry,
-                                  NULL,
-                                  lCount);
+        //
+        // AFSLocateNameEntry does not alter the reference count of
+        // pParentDirectoryCB and it returns pNewParentDirectoryCB with
+        // a reference held.
+        //
 
-                    ASSERT( lCount >= 0);
-                }
-                else
-                {
+        lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
 
-                    lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
+        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSRetrieveFileAttributes DecrementX count on %wZ DE %p Cnt %d\n",
+                      &pParentDirEntry->NameInformation.FileName,
+                      pParentDirEntry,
+                      lCount);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSRetrieveFileAttributes Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
-                                  &pParentDirEntry->NameInformation.FileName,
-                                  pParentDirEntry,
-                                  NULL,
-                                  lCount);
+        pParentDirEntry = pNewParentDirEntry;
 
-                    ASSERT( lCount >= 0);
-                }
-            }
+        pNewParentDirEntry = NULL;
 
-            pVolumeCB = NULL;
+        if( !NT_SUCCESS( ntStatus) ||
+            ntStatus == STATUS_REPARSE)
+        {
 
             try_return( ntStatus);
         }
@@ -6438,22 +6436,6 @@ AFSRetrieveFileAttributes( IN AFSDirectoryCB *ParentDirectoryCB,
 
         FileInfo->ChangeTime = pDirectoryEntry->ObjectInformation->ChangeTime;
 
-        //
-        // Remove the reference made above
-        //
-
-        lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSRetrieveFileAttributes Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
-                      &pDirectoryEntry->NameInformation.FileName,
-                      pDirectoryEntry,
-                      NULL,
-                      lCount);
-
-        ASSERT( lCount >= 0);
-
 try_exit:
 
         if( pDirEntry != NULL)
@@ -6462,15 +6444,49 @@ try_exit:
             AFSExFreePoolWithTag( pDirEntry, AFS_GENERIC_MEMORY_2_TAG);
         }
 
-        if( pVolumeCB != NULL)
+        if( pDirectoryEntry != NULL)
         {
 
-            lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+            lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSRetrieveFileAttributes Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
+                          &pDirectoryEntry->NameInformation.FileName,
+                          pDirectoryEntry,
+                          NULL,
+                          lCount);
+
+            ASSERT( lCount >= 0);
+        }
+
+        if ( pParentDirEntry != NULL)
+        {
+
+            lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSRetrieveFileAttributes Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
+                          &pParentDirEntry->NameInformation.FileName,
+                          pParentDirEntry,
+                          NULL,
+                          lCount);
+
+            ASSERT( lCount >= 0);
+        }
+
+        if( pVolumeCB != NULL)
+        {
+
+            lCount = AFSVolumeDecrement( pVolumeCB,
+                                         VolumeReferenceReason);
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSRetrieveFileAttributes Decrement2 count on volume %08lX Cnt %d\n",
+                          "AFSRetrieveFileAttributes Decrement2 count on volume %p Reason %u Cnt %d\n",
                           pVolumeCB,
+                          VolumeReferenceReason,
                           lCount);
         }
 
@@ -6548,13 +6564,23 @@ AFSAllocateObjectInfo( IN AFSObjectInfoCB *ParentObjectInfo,
 
         pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock = &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock;
 
-        pObjectInfo->VolumeCB = ParentObjectInfo->VolumeCB;
-
-        pObjectInfo->ParentObjectInformation = ParentObjectInfo;
-
         if( ParentObjectInfo != NULL)
         {
-            lCount = AFSObjectInfoIncrement( ParentObjectInfo);
+
+            pObjectInfo->VolumeCB = ParentObjectInfo->VolumeCB;
+
+            pObjectInfo->ParentFileId = ParentObjectInfo->FileId;
+
+            SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
+            lCount = AFSObjectInfoIncrement( ParentObjectInfo,
+                                             AFS_OBJECT_REFERENCE_CHILD);
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSAllocateObjectInfo Increment count on parent object %p Cnt %d\n",
+                          ParentObjectInfo,
+                          lCount);
         }
 
         //
@@ -6566,6 +6592,8 @@ AFSAllocateObjectInfo( IN AFSObjectInfoCB *ParentObjectInfo,
         if( HashIndex != 0)
         {
 
+            ASSERT( ParentObjectInfo);
+
             //
             // Insert the entry into the object tree and list
             //
@@ -6621,7 +6649,8 @@ try_exit:
 }
 
 LONG
-AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo)
+AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo,
+                        IN LONG Reason)
 {
 
     LONG lCount;
@@ -6652,16 +6681,19 @@ AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo)
         }
     }
 
+    InterlockedIncrement( &ObjectInfo->ObjectReferences[ Reason]);
+
     AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
 
     return lCount;
 }
 
 LONG
-AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo)
+AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo,
+                        IN LONG Reason)
 {
 
-    LONG lCount;
+    LONG lCount, lCount2;
 
     AFSAcquireShared( &ObjectInfo->NonPagedInfo->ObjectInfoLock,
                       TRUE);
@@ -6681,21 +6713,74 @@ AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo)
         lCount = InterlockedDecrement( &ObjectInfo->ObjectReferenceCount);
     }
 
+    lCount2 = InterlockedDecrement( &ObjectInfo->ObjectReferences[ Reason]);
+
+    ASSERT( lCount2 >= 0);
+
     AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
 
     return lCount;
 }
 
+AFSObjectInfoCB *
+AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB,
+                   IN AFSFileID   *FileId)
+{
+    DWORD            ntStatus = STATUS_SUCCESS;
+    ULONGLONG        ullIndex;
+    AFSObjectInfoCB *pObjectInfo = NULL;
 
+    if ( AFSIsEqualFID( &VolumeCB->ObjectInformation.FileId, FileId))
+    {
+
+        pObjectInfo = &VolumeCB->ObjectInformation;
+    }
+    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)) {
+
+        AFSObjectInfoIncrement( pObjectInfo,
+                                AFS_OBJECT_REFERENCE_FIND);
+    }
+
+    return pObjectInfo;
+}
 
 void
-AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo)
+AFSReleaseObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
+{
+
+    AFSObjectInfoDecrement( *ppObjectInfo,
+                            AFS_OBJECT_REFERENCE_FIND);
+
+    *ppObjectInfo = NULL;
+}
+
+void
+AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
 {
 
     BOOLEAN bAcquiredTreeLock = FALSE;
+    AFSObjectInfoCB *pObjectInfo = (*ppObjectInfo);
+    BOOLEAN bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
+    AFSObjectInfoCB * pParentObjectInfo = NULL;
+    AFSFileID FileId;
     LONG lCount;
 
-    if ( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_ROOT_VOLUME))
+    if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_ROOT_VOLUME))
     {
 
         //
@@ -6708,95 +6793,123 @@ AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo)
         return;
     }
 
-    if( !ExIsResourceAcquiredExclusiveLite( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock))
+    ASSERT( pObjectInfo->ObjectReferenceCount == 0);
+
+    (*ppObjectInfo) = NULL;
+
+    if( !ExIsResourceAcquiredExclusiveLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock))
     {
 
-        ASSERT( !ExIsResourceAcquiredLite( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock));
+        ASSERT( !ExIsResourceAcquiredLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock));
 
-        AFSAcquireExcl( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+        AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
                         TRUE);
 
         bAcquiredTreeLock = TRUE;
     }
 
+    if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+    {
+
+        pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+                                               &pObjectInfo->ParentFileId);
+    }
+
     //
     // Remove it from the tree and list if it was inserted
     //
 
-    if( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
+    if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
     {
 
-        AFSRemoveHashEntry( &ObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
-                            &ObjectInfo->TreeEntry);
+        AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
+                            &pObjectInfo->TreeEntry);
     }
 
-    if( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
+    if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
     {
 
-        if( ObjectInfo->ListEntry.fLink == NULL)
+        if( pObjectInfo->ListEntry.fLink == NULL)
         {
 
-            ObjectInfo->VolumeCB->ObjectInfoListTail = (AFSObjectInfoCB *)ObjectInfo->ListEntry.bLink;
+            pObjectInfo->VolumeCB->ObjectInfoListTail = (AFSObjectInfoCB *)pObjectInfo->ListEntry.bLink;
 
-            if( ObjectInfo->VolumeCB->ObjectInfoListTail != NULL)
+            if( pObjectInfo->VolumeCB->ObjectInfoListTail != NULL)
             {
 
-                ObjectInfo->VolumeCB->ObjectInfoListTail->ListEntry.fLink = NULL;
+                pObjectInfo->VolumeCB->ObjectInfoListTail->ListEntry.fLink = NULL;
             }
         }
         else
         {
 
-            ((AFSObjectInfoCB *)(ObjectInfo->ListEntry.fLink))->ListEntry.bLink = ObjectInfo->ListEntry.bLink;
+            ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.fLink))->ListEntry.bLink = pObjectInfo->ListEntry.bLink;
         }
 
-        if( ObjectInfo->ListEntry.bLink == NULL)
+        if( pObjectInfo->ListEntry.bLink == NULL)
         {
 
-            ObjectInfo->VolumeCB->ObjectInfoListHead = (AFSObjectInfoCB *)ObjectInfo->ListEntry.fLink;
+            pObjectInfo->VolumeCB->ObjectInfoListHead = (AFSObjectInfoCB *)pObjectInfo->ListEntry.fLink;
 
-            if( ObjectInfo->VolumeCB->ObjectInfoListHead != NULL)
+            if( pObjectInfo->VolumeCB->ObjectInfoListHead != NULL)
             {
 
-                ObjectInfo->VolumeCB->ObjectInfoListHead->ListEntry.bLink = NULL;
+                pObjectInfo->VolumeCB->ObjectInfoListHead->ListEntry.bLink = NULL;
             }
         }
         else
         {
 
-            ((AFSObjectInfoCB *)(ObjectInfo->ListEntry.bLink))->ListEntry.fLink = ObjectInfo->ListEntry.fLink;
+            ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.bLink))->ListEntry.fLink = pObjectInfo->ListEntry.fLink;
         }
     }
 
-    if( ObjectInfo->ParentObjectInformation != NULL)
+    if( pParentObjectInfo != NULL)
     {
 
-        lCount = AFSObjectInfoDecrement( ObjectInfo->ParentObjectInformation);
+        ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
+        lCount = AFSObjectInfoDecrement( pParentObjectInfo,
+                                         AFS_OBJECT_REFERENCE_CHILD);
+
+        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n",
+                      pParentObjectInfo,
+                      lCount);
+
+        AFSReleaseObjectInfo( &pParentObjectInfo);
     }
 
     if( bAcquiredTreeLock)
     {
 
-        AFSReleaseResource( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
+        AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
     }
 
-    //
-    // Release the fid in the service
-    //
-
-    if( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE))
+    if( bHeldInService)
     {
 
-        AFSReleaseFid( &ObjectInfo->FileId);
+        FileId = pObjectInfo->FileId;
     }
 
-    ExDeleteResourceLite( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
+    ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+
+    ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
+
+    AFSExFreePoolWithTag( pObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
 
-    ExDeleteResourceLite( &ObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
+    AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
+
+    //
+    // Release the fid in the service
+    //
 
-    AFSExFreePoolWithTag( ObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
+    if( bHeldInService)
+    {
 
-    AFSExFreePoolWithTag( ObjectInfo, AFS_OBJECT_INFO_TAG);
+        AFSReleaseFid( &FileId);
+    }
 
     return;
 }
@@ -6807,11 +6920,15 @@ AFSEvaluateRootEntry( IN AFSDirectoryCB *DirectoryCB,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSDirEnumEntry *pDirEntry = NULL, *pLastDirEntry = NULL;
-    UNICODE_STRING uniFullPathName;
+    AFSDirEnumEntry *pDirEntry = NULL;
+    UNICODE_STRING uniFullPathName = {0};
     AFSNameArrayHdr    *pNameArray = NULL;
     AFSVolumeCB *pVolumeCB = NULL;
+    LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+    AFSVolumeCB *pNewVolumeCB = NULL;
+    LONG NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
     AFSDirectoryCB *pDirectoryEntry = NULL, *pParentDirEntry = NULL;
+    AFSDirectoryCB *pNewParentDirEntry = NULL;
     WCHAR *pwchBuffer = NULL;
     UNICODE_STRING uniComponentName, uniRemainingPath, uniParsedName;
     ULONG ulNameDifference = 0;
@@ -6970,12 +7087,16 @@ AFSEvaluateRootEntry( IN AFSDirectoryCB *DirectoryCB,
 
         pParentDirEntry = AFSGlobalRoot->DirectoryCB;
 
-        lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+        VolumeReferenceReason = AFS_VOLUME_REFERENCE_EVAL_ROOT;
+
+        lCount = AFSVolumeIncrement( pVolumeCB,
+                                     VolumeReferenceReason);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSEvaluateRootEntry Increment count on volume %08lX Cnt %d\n",
+                      "AFSEvaluateRootEntry Increment count on volume %p Reason %u Cnt %d\n",
                       pVolumeCB,
+                      VolumeReferenceReason,
                       lCount);
 
         lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
@@ -6994,66 +7115,62 @@ AFSEvaluateRootEntry( IN AFSDirectoryCB *DirectoryCB,
                                        &uniParsedName,
                                        pNameArray,
                                        0,
-                                       &pVolumeCB,
-                                       &pParentDirEntry,
+                                       pVolumeCB,
+                                       pParentDirEntry,
+                                       &pNewVolumeCB,
+                                       &VolumeReferenceReason,
+                                       &pNewParentDirEntry,
                                        &pDirectoryEntry,
                                        NULL);
 
-        if( !NT_SUCCESS( ntStatus) ||
-            ntStatus == STATUS_REPARSE)
-        {
+        //
+        // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+        // even if pVolumeCB == pNewVolumeCB.  It is always safe to release
+        // the reference on pVolumeCB that was held prior to the call.
+        // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+        // will be released second.
+        //
 
-            //
-            // The volume lock was released on failure or reparse above
-            // Except for STATUS_OBJECT_NAME_NOT_FOUND
-            //
+        lCount = AFSVolumeDecrement( pVolumeCB,
+                                     VolumeReferenceReason);
 
-            if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND)
-            {
+        AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSEvaluateRootEntry Decrement count on volume %p Reason %u Cnt %d\n",
+                      pVolumeCB,
+                      VolumeReferenceReason,
+                      lCount);
 
-                if( pVolumeCB != NULL)
-                {
+        pVolumeCB = pNewVolumeCB;
 
-                    lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+        pNewVolumeCB = NULL;
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSEvaluateRootEntry Decrement count on volume %08lX Cnt %d\n",
-                                  pVolumeCB,
-                                  lCount);
-                }
+        VolumeReferenceReason = NewVolumeReferenceReason;
 
-                if( pDirectoryEntry != NULL)
-                {
+        NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
 
-                    lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
+        //
+        // AFSLocateNameEntry does not alter the reference count of
+        // pParentDirectoryCB and it returns pNewParentDirectoryCB with
+        // a reference held.
+        //
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSEvaluateRootEntry Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
-                                  &pDirectoryEntry->NameInformation.FileName,
-                                  pDirectoryEntry,
-                                  NULL,
-                                  lCount);
+        lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
 
-                    ASSERT( lCount >= 0);
-                }
-                else
-                {
+        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSEvaluateRootEntry DecrementX count on %wZ DE %p Cnt %d\n",
+                      &pParentDirEntry->NameInformation.FileName,
+                      pParentDirEntry,
+                      lCount);
 
-                    lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
+        pParentDirEntry = pNewParentDirEntry;
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSEvaluateRootEntry Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
-                                  &pParentDirEntry->NameInformation.FileName,
-                                  pParentDirEntry,
-                                  NULL,
-                                  lCount);
+        pNewParentDirEntry = NULL;
 
-                    ASSERT( lCount >= 0);
-                }
-            }
+        if( !NT_SUCCESS( ntStatus) ||
+            ntStatus == STATUS_REPARSE)
+        {
 
             pVolumeCB = NULL;
 
@@ -7062,12 +7179,47 @@ AFSEvaluateRootEntry( IN AFSDirectoryCB *DirectoryCB,
 
         //
         // Pass back the target dir entry for this request
+        // The caller must release the DirOpenReferenceCount
         //
 
         *TargetDirEntry = pDirectoryEntry;
 
+        pDirectoryEntry = NULL;
+
 try_exit:
 
+        if( pDirectoryEntry != NULL)
+        {
+
+            lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSEvaluateRootEntry Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
+                          &pDirectoryEntry->NameInformation.FileName,
+                          pDirectoryEntry,
+                          NULL,
+                          lCount);
+
+            ASSERT( lCount >= 0);
+        }
+
+        if ( pParentDirEntry != NULL)
+        {
+
+            lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSEvaluateRootEntry Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
+                          &pParentDirEntry->NameInformation.FileName,
+                          pParentDirEntry,
+                          NULL,
+                          lCount);
+
+            ASSERT( lCount >= 0);
+        }
+
         if( pDirEntry != NULL)
         {
 
@@ -7077,12 +7229,14 @@ try_exit:
         if( pVolumeCB != NULL)
         {
 
-            lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+            lCount = AFSVolumeDecrement( pVolumeCB,
+                                         VolumeReferenceReason);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSEvaluateRootEntry Decrement2 count on volume %08lX Cnt %d\n",
+                          "AFSEvaluateRootEntry Decrement2 count on volume %p Reason %u Cnt %d\n",
                           pVolumeCB,
+                          VolumeReferenceReason,
                           lCount);
         }
 
@@ -7143,7 +7297,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanupEntry Acquiring Fcb lock %08lX SHARED %08lX\n",
+                              "AFSCleanupEntry Acquiring Fcb lock %p SHARED %08lX\n",
                               &Fcb->NPFcb->Resource,
                               PsGetCurrentThread());
 
@@ -7155,7 +7309,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCleanupEntry Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                                  "AFSCleanupEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                                   &Fcb->NPFcb->SectionObjectResource,
                                   PsGetCurrentThread());
 
@@ -7226,7 +7380,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCleanupFcb Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+                                  "AFSCleanupFcb Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                                   &Fcb->NPFcb->SectionObjectResource,
                                   PsGetCurrentThread());
 
@@ -7235,7 +7389,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanupEntry Releasing Fcb lock %08lX SHARED %08lX\n",
+                              "AFSCleanupEntry Releasing Fcb lock %p SHARED %08lX\n",
                               &Fcb->NPFcb->Resource,
                               PsGetCurrentThread());
 
@@ -7321,7 +7475,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSCleanupFcb Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                          "AFSCleanupFcb Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                           &Fcb->NPFcb->SectionObjectResource,
                           PsGetCurrentThread());
 
@@ -7391,7 +7545,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanupFcb Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+                              "AFSCleanupFcb Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                               &Fcb->NPFcb->SectionObjectResource,
                               PsGetCurrentThread());
 
@@ -7493,7 +7647,6 @@ AFSReadCacheFile( IN void *ReadBuffer,
     PIRP                pIrp = NULL;
     KEVENT              kEvent;
     PIO_STACK_LOCATION  pIoStackLocation = NULL;
-    AFSDeviceExt       *pRdrDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     DEVICE_OBJECT      *pTargetDeviceObject = NULL;
     FILE_OBJECT        *pCacheFileObject = NULL;
 
@@ -7634,6 +7787,8 @@ AFSIrpComplete( IN PDEVICE_OBJECT DeviceObject,
                 IN PVOID          Context)
 {
 
+    UNREFERENCED_PARAMETER(Irp);
+    UNREFERENCED_PARAMETER(DeviceObject);
     KEVENT *pEvent = (KEVENT *)Context;
 
     KeSetEvent( pEvent,
@@ -7699,7 +7854,7 @@ AFSRemoveNameEntry( IN AFSObjectInfoCB *ParentObjectInfo,
         if( BooleanFlagOn( DirEntry->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSRemoveNameEntry DE %p for %wZ has NOT_IN flag set\n",
                           DirEntry,
@@ -7714,7 +7869,7 @@ AFSRemoveNameEntry( IN AFSObjectInfoCB *ParentObjectInfo,
         // Remove the entry from the parent tree
         //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSRemoveNameEntry DE %p for %wZ removing from case sensitive tree\n",
                       DirEntry,
@@ -7723,7 +7878,7 @@ AFSRemoveNameEntry( IN AFSObjectInfoCB *ParentObjectInfo,
         AFSRemoveCaseSensitiveDirEntry( &ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
                                         DirEntry);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSRemoveNameEntry DE %p for %wZ removing from case insensitive tree\n",
                       DirEntry,
@@ -7739,7 +7894,7 @@ AFSRemoveNameEntry( IN AFSObjectInfoCB *ParentObjectInfo,
             // From the short name tree
             //
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSRemoveNameEntry DE %p for %wZ removing from shortname tree\n",
                           DirEntry,
@@ -7751,7 +7906,7 @@ AFSRemoveNameEntry( IN AFSObjectInfoCB *ParentObjectInfo,
             ClearFlag( DirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSRemoveNameEntry DE %p for %wZ setting NOT_IN flag\n",
                       DirEntry,
@@ -7862,6 +8017,7 @@ AFSUnwindFileInfo( IN AFSFcb *Fcb,
                    IN AFSCcb *Ccb)
 {
 
+    UNREFERENCED_PARAMETER(Fcb);
     if( Ccb->FileUnwindInfo.FileAttributes != (ULONG)-1)
     {
         Ccb->DirectoryCB->ObjectInformation->FileAttributes = Ccb->FileUnwindInfo.FileAttributes;
@@ -7926,7 +8082,7 @@ AFSValidateDirList( IN AFSObjectInfoCB *ObjectInfo)
         pCurrentDirEntry = (AFSDirectoryCB *)pCurrentDirEntry->ListEntry.fLink;
     }
 
-    if( ulCount != ObjectInfo->Specific.Directory.DirectoryNodeCount)
+    if( ulCount != (ULONG) ObjectInfo->Specific.Directory.DirectoryNodeCount)
     {
 
         AFSPrint("AFSValidateDirList Count off Calc: %d Stored: %d\n",
@@ -8046,6 +8202,7 @@ AFSInitializeLibrary( IN AFSLibraryInitCB *LibraryInit)
 
         ntStatus = AFSInitVolume( NULL,
                                   &LibraryInit->GlobalRootFid,
+                                  AFS_VOLUME_REFERENCE_GLOBAL_ROOT,
                                   &AFSGlobalRoot);
 
         if( !NT_SUCCESS( ntStatus))
@@ -8070,11 +8227,12 @@ AFSInitializeLibrary( IN AFSLibraryInitCB *LibraryInit)
                           "AFSInitializeLibrary AFSInitRootFcb failure %08lX\n",
                           ntStatus);
 
-            lCount = InterlockedDecrement( &AFSGlobalRoot->VolumeReferenceCount);
+            lCount = AFSVolumeDecrement( AFSGlobalRoot,
+                                         AFS_VOLUME_REFERENCE_GLOBAL_ROOT);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInitializeLibrary Increment count on volume %08lX Cnt %d\n",
+                          "AFSInitializeLibrary Decrement count on volume %p Cnt %d\n",
                           AFSGlobalRoot,
                           lCount);
 
@@ -8104,11 +8262,12 @@ AFSInitializeLibrary( IN AFSLibraryInitCB *LibraryInit)
 
         AFSInitVolumeWorker( AFSGlobalRoot);
 
-        lCount = InterlockedDecrement( &AFSGlobalRoot->VolumeReferenceCount);
+        lCount = AFSVolumeDecrement( AFSGlobalRoot,
+                                     AFS_VOLUME_REFERENCE_GLOBAL_ROOT);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInitializeLibrary Decrement count on volume %08lX Cnt %d\n",
+                      "AFSInitializeLibrary Decrement count on volume %p Cnt %d\n",
                       AFSGlobalRoot,
                       lCount);
 
@@ -8130,6 +8289,7 @@ AFSCloseLibrary()
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSDirectoryCB *pDirNode = NULL, *pLastDirNode = NULL;
+    LONG lCount;
 
     __Enter
     {
@@ -8137,7 +8297,10 @@ AFSCloseLibrary()
         if( AFSGlobalDotDirEntry != NULL)
         {
 
-            AFSDeleteObjectInfo( AFSGlobalDotDirEntry->ObjectInformation);
+            lCount = AFSObjectInfoDecrement( AFSGlobalDotDirEntry->ObjectInformation,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
 
             ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
 
@@ -8151,7 +8314,10 @@ AFSCloseLibrary()
         if( AFSGlobalDotDotDirEntry != NULL)
         {
 
-            AFSDeleteObjectInfo( AFSGlobalDotDotDirEntry->ObjectInformation);
+            lCount = AFSObjectInfoDecrement( AFSGlobalDotDotDirEntry->ObjectInformation,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
 
             ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
 
@@ -8172,7 +8338,10 @@ AFSCloseLibrary()
 
                 pLastDirNode = (AFSDirectoryCB *)pDirNode->ListEntry.fLink;
 
-                AFSDeleteObjectInfo( pDirNode->ObjectInformation);
+                lCount = AFSObjectInfoDecrement( pDirNode->ObjectInformation,
+                                                 AFS_OBJECT_REFERENCE_GLOBAL);
+
+                AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
 
                 ExDeleteResourceLite( &pDirNode->NonPaged->Lock);
 
@@ -8197,6 +8366,8 @@ AFSDefaultLogMsg( IN ULONG Subsystem,
                   ...)
 {
 
+    UNREFERENCED_PARAMETER(Subsystem);
+    UNREFERENCED_PARAMETER(Level);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     va_list va_args;
     char chDebugBuffer[ 256];
@@ -8230,14 +8401,17 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSFcb   *pFcb = NULL;
     AFSVolumeCB *pVolumeCB = NULL;
+    LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+    AFSVolumeCB *pNewVolumeCB = NULL;
+    LONG NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
     AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     AFSObjectInfoCB *pObjectInfo = NULL;
     ULONGLONG   ullIndex = 0;
     UNICODE_STRING uniFullPathName, uniRemainingPath, uniComponentName, uniParsedName;
     AFSNameArrayHdr *pNameArray = NULL;
     AFSDirectoryCB *pDirectoryEntry = NULL, *pParentDirEntry = NULL;
+    AFSDirectoryCB *pNewParentDirEntry = NULL;
     LONG lCount;
 
     __Enter
@@ -8269,12 +8443,16 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
             if( pVolumeCB != NULL)
             {
 
-                lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+                VolumeReferenceReason = AFS_VOLUME_REFERENCE_GET_OBJECT;
+
+                lCount = AFSVolumeIncrement( pVolumeCB,
+                                             VolumeReferenceReason);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSGetObjectStatus Increment count on volume %08lX Cnt %d\n",
+                              "AFSGetObjectStatus Increment count on volume %p Reason %u Cnt %d\n",
                               pVolumeCB,
+                              VolumeReferenceReason,
                               lCount);
             }
 
@@ -8291,14 +8469,13 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
 
                 pObjectInfo = &pVolumeCB->ObjectInformation;
 
-                lCount = AFSObjectInfoIncrement( pObjectInfo);
-
-                lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+                lCount = AFSObjectInfoIncrement( pObjectInfo,
+                                                 AFS_OBJECT_REFERENCE_STATUS);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSGetObjectStatus Decrement count on volume %08lX Cnt %d\n",
-                              pVolumeCB,
+                              "AFSGetObjectStatus Increment1 count on object %p Cnt %d\n",
+                              pObjectInfo,
                               lCount);
             }
             else
@@ -8307,14 +8484,6 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
                 AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
                                   TRUE);
 
-                lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSGetObjectStatus Decrement2 count on volume %08lX Cnt %d\n",
-                              pVolumeCB,
-                              lCount);
-
                 ullIndex = AFSCreateLowIndex( &GetStatusInfo->FileID);
 
                 ntStatus = AFSLocateHashEntry( pVolumeCB->ObjectInfoTree.TreeHead,
@@ -8328,11 +8497,12 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
                     // Reference the node so it won't be torn down
                     //
 
-                    lCount = AFSObjectInfoIncrement( pObjectInfo);
+                    lCount = AFSObjectInfoIncrement( pObjectInfo,
+                                                     AFS_OBJECT_REFERENCE_STATUS);
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSGetObjectStatus Increment count on object %08lX Cnt %d\n",
+                                  "AFSGetObjectStatus Increment2 count on object %p Cnt %d\n",
                                   pObjectInfo,
                                   lCount);
                 }
@@ -8404,12 +8574,16 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
             // Increment the ref count on the volume and dir entry for correct processing below
             //
 
-            lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+            VolumeReferenceReason = AFS_VOLUME_REFERENCE_GET_OBJECT;
+
+            lCount = AFSVolumeIncrement( pVolumeCB,
+                                         VolumeReferenceReason);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSGetObjectStatus Increment2 count on volume %08lX Cnt %d\n",
+                          "AFSGetObjectStatus Increment2 count on volume %p Reason %u Cnt %d\n",
                           pVolumeCB,
+                          VolumeReferenceReason,
                           lCount);
 
             lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
@@ -8428,104 +8602,79 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
                                            &uniParsedName,
                                            pNameArray,
                                            AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
-                                                        AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL,
-                                           &pVolumeCB,
-                                           &pParentDirEntry,
+                                               AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL,
+                                           pVolumeCB,
+                                           pParentDirEntry,
+                                           &pNewVolumeCB,
+                                           &NewVolumeReferenceReason,
+                                           &pNewParentDirEntry,
                                            &pDirectoryEntry,
                                            NULL);
 
-            if( !NT_SUCCESS( ntStatus) ||
-                ntStatus == STATUS_REPARSE)
-            {
+            //
+            // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+            // even if pVolumeCB == pNewVolumeCB.  It is always safe to release
+            // the reference on pVolumeCB that was held prior to the call.
+            // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+            // will be released second.
+            //
 
-                //
-                // The volume lock was released on failure or reparse above
-                // Except for STATUS_OBJECT_NAME_NOT_FOUND
-                //
+            lCount = AFSVolumeDecrement( pVolumeCB,
+                                         VolumeReferenceReason);
 
-                if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND)
-                {
+            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSGetObjectStatus Decrement count on volume %p Reason %u Cnt %d\n",
+                          pVolumeCB,
+                          VolumeReferenceReason,
+                          lCount);
 
-                    if( pVolumeCB != NULL)
-                    {
+            pVolumeCB = pNewVolumeCB;
 
-                        lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+            pNewVolumeCB = NULL;
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
-                                      AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSGetObjectStatus Decrement3 count on volume %08lX Cnt %d\n",
-                                      pVolumeCB,
-                                      lCount);
-                    }
+            VolumeReferenceReason = NewVolumeReferenceReason;
 
-                    if( pDirectoryEntry != NULL)
-                    {
+            NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
 
-                        lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
+            //
+            // AFSLocateNameEntry does not alter the reference count of
+            // pParentDirectoryCB and it returns pNewParentDirectoryCB with
+            // a reference held.
+            //
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                                      AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSGetObjectStatus Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
-                                      &pDirectoryEntry->NameInformation.FileName,
-                                      pDirectoryEntry,
-                                      NULL,
-                                      lCount);
+            lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
 
-                        ASSERT( lCount >= 0);
-                    }
-                    else
-                    {
+            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSGetObjectStatus DecrementX count on %wZ DE %p Cnt %d\n",
+                          &pParentDirEntry->NameInformation.FileName,
+                          pParentDirEntry,
+                          lCount);
 
-                        lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
+            pParentDirEntry = pNewParentDirEntry;
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                                      AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSGetObjectStatus Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
-                                      &pParentDirEntry->NameInformation.FileName,
-                                      pParentDirEntry,
-                                      NULL,
-                                      lCount);
+            pNewParentDirEntry = NULL;
 
-                        ASSERT( lCount >= 0);
-                    }
-                }
+            if( !NT_SUCCESS( ntStatus) ||
+                ntStatus == STATUS_REPARSE)
+            {
 
                 pVolumeCB = NULL;
 
                 try_return( ntStatus);
             }
 
-            //
-            // Remove the reference made above
-            //
+            pObjectInfo = pDirectoryEntry->ObjectInformation;
 
-            lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
+            lCount = AFSObjectInfoIncrement( pObjectInfo,
+                                             AFS_OBJECT_REFERENCE_STATUS);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSGetObjectStatus Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
-                          &pDirectoryEntry->NameInformation.FileName,
-                          pDirectoryEntry,
-                          NULL,
+                          "AFSGetObjectStatus Increment3 count on object %p Cnt %d\n",
+                          pObjectInfo,
                           lCount);
-
-            ASSERT( lCount >= 0);
-
-            pObjectInfo = pDirectoryEntry->ObjectInformation;
-
-            lCount = AFSObjectInfoIncrement( pObjectInfo);
-
-            if( pVolumeCB != NULL)
-            {
-
-                lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSGetObjectStatus Decrement4 count on volume %08lX Cnt %d\n",
-                              pVolumeCB,
-                              lCount);
-            }
         }
 
         //
@@ -8570,10 +8719,63 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
 
 try_exit:
 
+        if( pDirectoryEntry != NULL)
+        {
+
+            lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSGetObjectStatus Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
+                          &pDirectoryEntry->NameInformation.FileName,
+                          pDirectoryEntry,
+                          NULL,
+                          lCount);
+
+            ASSERT( lCount >= 0);
+        }
+
+        if ( pParentDirEntry != NULL)
+        {
+
+            lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSGetObjectStatus Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
+                          &pParentDirEntry->NameInformation.FileName,
+                          pParentDirEntry,
+                          NULL,
+                          lCount);
+
+            ASSERT( lCount >= 0);
+        }
+
         if( pObjectInfo != NULL)
         {
 
-            lCount = AFSObjectInfoDecrement( pObjectInfo);
+            lCount = AFSObjectInfoDecrement( pObjectInfo,
+                                             AFS_OBJECT_REFERENCE_STATUS);
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSGetObjectStatus Decrement count on object %p Cnt %d\n",
+                          pObjectInfo,
+                          lCount);
+        }
+
+        if( pVolumeCB != NULL)
+        {
+
+            lCount = AFSVolumeDecrement( pVolumeCB,
+                                         VolumeReferenceReason);
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSGetObjectStatus Decrement4 count on volume %p Reason %u Cnt %d\n",
+                          pVolumeCB,
+                          VolumeReferenceReason,
+                          lCount);
         }
 
         if( pNameArray != NULL)
@@ -8686,8 +8888,9 @@ AFSCheckSymlinkAccess( IN AFSDirectoryCB *ParentDirectoryCB,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
-                          "AFSCheckSymlinkAccess Failed to locate entry %wZ\n",
-                          ComponentName);
+                          "AFSCheckSymlinkAccess Failed to locate entry %wZ ntStatus %08X\n",
+                          ComponentName,
+                          STATUS_OBJECT_NAME_NOT_FOUND);
 
             try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
         }
@@ -9064,8 +9267,6 @@ AFSRetrieveParentPath( IN UNICODE_STRING *FullFileName,
                        OUT UNICODE_STRING *ParentPath)
 {
 
-    USHORT usIndex = 0;
-
     *ParentPath = *FullFileName;
 
     //
@@ -9200,11 +9401,11 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
 {
 
     NTSTATUS            ntStatus = STATUS_SUCCESS;
-    IO_STATUS_BLOCK     stIoStatus;
     LIST_ENTRY         *le;
     AFSExtent          *pEntry;
     ULONG               ulProcessCount = 0;
     ULONG               ulCount = 0;
+    LONG                lCount;
 
     __Enter
     {
@@ -9266,7 +9467,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSPerformObjectInvalidate Acquiring Fcb extents lock %08lX SHARED %08lX\n",
+                                  "AFSPerformObjectInvalidate Acquiring Fcb extents lock %p SHARED %08lX\n",
                                   &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
                                   PsGetCurrentThread());
 
@@ -9318,7 +9519,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
 
                                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                               AFS_TRACE_LEVEL_VERBOSE,
-                                              "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                                              "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                                               &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                               PsGetCurrentThread());
 
@@ -9374,7 +9575,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
 
                                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                               AFS_TRACE_LEVEL_VERBOSE,
-                                              "AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+                                              "AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                                               &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                               PsGetCurrentThread());
 
@@ -9390,7 +9591,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                                          "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                                           &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                           PsGetCurrentThread());
 
@@ -9614,7 +9815,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+                                          "AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                                           &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                           PsGetCurrentThread());
 
@@ -9646,11 +9847,19 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
             }
         }
 
-        if( ObjectInfo != NULL)
-        {
+        //
+        // Destroy the reference passed in by the caller to AFSInvalidateObject
+        // or AFSQueueInvalidateObject
+        //
 
-            AFSObjectInfoDecrement( ObjectInfo);
-        }
+        lCount = AFSObjectInfoDecrement( ObjectInfo,
+                                         AFS_OBJECT_REFERENCE_INVALIDATION);
+
+        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSPerformObjectInvalidation Decrement count on object %p Cnt %d\n",
+                      ObjectInfo,
+                      lCount);
     }
 
     return ntStatus;