Windows: Additional trace %p and %d changes
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSNameSupport.cpp
index bf13d2d..874634a 100644 (file)
 
 #include "AFSCommon.h"
 
+//
+// AFSLocateNameEntry
+//
+// On entry, *VolumeCB must have a held ReferenceCount provided by
+// the caller which will be released.  On successful exit, *VolumeCB
+// will be assigned the new current volume with a held ReferenceCount.
+//
+// On entry, *ParentDirectoryCB must have a held DirOpenReferenceCount
+// provided by the caller.
+//
+
 NTSTATUS
 AFSLocateNameEntry( IN GUID *AuthGroup,
                     IN PFILE_OBJECT FileObject,
@@ -45,7 +56,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                     IN UNICODE_STRING *ParsedPathName,
                     IN AFSNameArrayHdr *NameArray,
                     IN ULONG Flags,
-                    OUT AFSVolumeCB **VolumeCB,
+                    IN OUT AFSVolumeCB **VolumeCB,
                     IN OUT AFSDirectoryCB **ParentDirectoryCB,
                     OUT AFSDirectoryCB **DirectoryCB,
                     OUT PUNICODE_STRING ComponentName)
@@ -74,7 +85,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
-                      "AFSLocateNameEntry (FO: %08lX) Processing full name %wZ\n",
+                      "AFSLocateNameEntry (FO: %p) Processing full name %wZ\n",
                       FileObject,
                       RootPathName);
 
@@ -121,11 +132,13 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
         uniSearchName.Length = uniSearchName.MaximumLength = 0;
         uniSearchName.Buffer = NULL;
 
-        ASSERT( pCurrentVolume->VolumeReferenceCount > 1);
-
         while( TRUE)
         {
 
+            ASSERT( pCurrentVolume->VolumeReferenceCount > 1);
+
+            ASSERT( pDirEntry->DirOpenReferenceCount > 0);
+
             //
             // Check our total link count for this name array
             //
@@ -149,7 +162,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSLocateNameEntry (FO: %08lX) Deleted parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Deleted parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -166,7 +179,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSLocateNameEntry (FO: %08lX) Delete pending on %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Delete pending on %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -189,7 +202,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSLocateNameEntry (FO: %08lX) Verifying parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Verifying parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -214,7 +227,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSLocateNameEntry (FO: %08lX) Failed to verify parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                  "AFSLocateNameEntry (FO: %p) Failed to verify parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                   FileObject,
                                   &pDirEntry->NameInformation.FileName,
                                   pCurrentObject->FileId.Cell,
@@ -237,7 +250,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSLocateNameEntry (FO: %08lX) Evaluating parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Evaluating parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -259,7 +272,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_ERROR,
-                                          "AFSLocateNameEntry (FO: %08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT NULL Status %08lX\n",
+                                          "AFSLocateNameEntry (FO: %p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT NULL Status %08lX\n",
                                           FileObject,
                                           &pDirEntry->NameInformation.FileName,
                                           pCurrentObject->FileId.Cell,
@@ -273,7 +286,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_ERROR,
-                                          "AFSLocateNameEntry (FO: %08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                          "AFSLocateNameEntry (FO: %p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                           FileObject,
                                           &pDirEntry->NameInformation.FileName,
                                           pCurrentObject->FileId.Cell,
@@ -291,7 +304,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                     {
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
-                                      "AFSLocateNameEntry (FO: %08lX) Failed to evaluate parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Failed to evaluate parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.FileName,
                                       pCurrentObject->FileId.Cell,
@@ -364,7 +377,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSLocateNameEntry (FO: %08lX) Verifying symlink parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Verifying symlink parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.FileName,
                                       pCurrentObject->FileId.Cell,
@@ -386,7 +399,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_ERROR,
-                                          "AFSLocateNameEntry (FO: %08lX) Failed to verify symlink parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                          "AFSLocateNameEntry (FO: %p) Failed to verify symlink parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                           FileObject,
                                           &pDirEntry->NameInformation.FileName,
                                           pCurrentObject->FileId.Cell,
@@ -429,7 +442,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
-                                      "AFSLocateNameEntry (FO: %08lX) Failed to retrieve target name for symlink %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Failed to retrieve target name for symlink %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.FileName,
                                       pCurrentObject->FileId.Cell,
@@ -448,7 +461,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSLocateNameEntry (FO: %08lX) Processing relative symlink target %wZ for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Processing relative symlink target %wZ for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.TargetName,
                                       &pDirEntry->NameInformation.FileName,
@@ -552,7 +565,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                         if( pTmpBuffer != NULL)
                         {
 
-                            AFSExFreePool( pTmpBuffer);
+                            AFSExFreePoolWithTag( pTmpBuffer, 0);
                         }
 
                         AFSReleaseResource( &pDirEntry->NonPaged->Lock);
@@ -561,7 +574,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                         // Dereference the current entry ..
                         //
 
-                        lCount = InterlockedDecrement( &pDirEntry->OpenReferenceCount);
+                        lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                       AFS_TRACE_LEVEL_VERBOSE,
@@ -571,6 +584,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                                       NULL,
                                       lCount);
 
+                        ASSERT( lCount >= 0);
+
                         //
                         // OK, need to back up one entry for the correct parent since the current
                         // entry we are on is the symlink itself
@@ -582,7 +597,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                         // Increment our reference on this dir entry
                         //
 
-                        lCount = InterlockedIncrement( &pDirEntry->OpenReferenceCount);
+                        lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                       AFS_TRACE_LEVEL_VERBOSE,
@@ -610,7 +625,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSLocateNameEntry (FO: %08lX) Processing absolute symlink target %wZ for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Processing absolute symlink target %wZ for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.TargetName,
                                       &pDirEntry->NameInformation.FileName,
@@ -619,6 +634,26 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                                       pCurrentObject->FileId.Vnode,
                                       pCurrentObject->FileId.Unique);
 
+                        if ( !AFSIsAbsoluteAFSName( &pDirEntry->NameInformation.TargetName))
+                        {
+
+                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                          AFS_TRACE_LEVEL_ERROR,
+                                          "AFSLocateNameEntry Name %wZ contains invalid server name\n",
+                                          &pDirEntry->NameInformation.TargetName);
+
+                            //
+                            // The correct response would be STATUS_OBJECT_PATH_INVALID
+                            // but that prevents cmd.exe from performing a recursive
+                            // directory enumeration when opening a directory entry
+                            // that represents a symlink to an invalid path is discovered.
+                            //
+
+                            AFSReleaseResource( &pDirEntry->NonPaged->Lock);
+
+                            try_return( ntStatus = STATUS_OBJECT_PATH_NOT_FOUND);
+                        }
+
                         //
                         // We'll substitute this name into the current process name
                         // starting at where we sit in the path
@@ -664,10 +699,10 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                         //
 
                         RtlCopyMemory( uniTempName.Buffer,
-                                       pDirEntry->NameInformation.TargetName.Buffer,
-                                       pDirEntry->NameInformation.TargetName.Length);
+                                       &pDirEntry->NameInformation.TargetName.Buffer[ AFSMountRootName.Length/sizeof( WCHAR)],
+                                       pDirEntry->NameInformation.TargetName.Length - AFSMountRootName.Length);
 
-                        uniTempName.Length = pDirEntry->NameInformation.TargetName.Length;
+                        uniTempName.Length = pDirEntry->NameInformation.TargetName.Length - AFSMountRootName.Length;
 
                         //
                         // And now any remaining portion of the name
@@ -697,7 +732,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                         if( pTmpBuffer != NULL)
                         {
 
-                            AFSExFreePool( pTmpBuffer);
+                            AFSExFreePoolWithTag( pTmpBuffer, 0);
                         }
 
                         AFSReleaseResource( &pDirEntry->NonPaged->Lock);
@@ -711,7 +746,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSLocateNameEntry (FO: %08lX) Current volume not global, resetting for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                          "AFSLocateNameEntry (FO: %p) Current volume not global, resetting for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                           FileObject,
                                           &pDirEntry->NameInformation.FileName,
                                           pCurrentObject->FileId.Cell,
@@ -723,7 +758,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                                           AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSLocateNameEntry Decrement count on volume %08lX Cnt %d\n",
+                                          "AFSLocateNameEntry Decrement count on volume %p Cnt %d\n",
                                           pCurrentVolume,
                                           lCount);
 
@@ -733,7 +768,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                                           AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSLocateNameEntry Increment count on volume %08lX Cnt %d\n",
+                                          "AFSLocateNameEntry Increment count on volume %p Cnt %d\n",
                                           pCurrentVolume,
                                           lCount);
                         }
@@ -742,7 +777,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                         // Dereference our current dir entry
                         //
 
-                        lCount = InterlockedDecrement( &pDirEntry->OpenReferenceCount);
+                        lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                       AFS_TRACE_LEVEL_VERBOSE,
@@ -752,13 +787,15 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                                       NULL,
                                       lCount);
 
+                        ASSERT( lCount >= 0);
+
                         pDirEntry = pCurrentVolume->DirectoryCB;
 
                         //
                         // Reference the new dir entry
                         //
 
-                        lCount = InterlockedIncrement( &pDirEntry->OpenReferenceCount);
+                        lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                       AFS_TRACE_LEVEL_VERBOSE,
@@ -777,7 +814,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSLocateNameEntry (FO: %08lX) Resetting name array for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Resetting name array for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.FileName,
                                       pCurrentObject->FileId.Cell,
@@ -790,35 +827,6 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         pNameArray->LinkCount = lLinkCount;
 
-                        //
-                        // Process over the \\<Global root> portion of the name
-                        //
-
-                        FsRtlDissectName( uniPathName,
-                                          &uniComponentName,
-                                          &uniRemainingPath);
-
-                        if( RtlCompareUnicodeString( &uniComponentName,
-                                                     &AFSServerName,
-                                                     TRUE) != 0)
-                        {
-
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                          AFS_TRACE_LEVEL_ERROR,
-                                          "AFSLocateNameEntry Name %wZ contains invalid server name\n",
-                                          &uniPathName);
-
-                            //
-                            // The correct response would be STATUS_OBJECT_PATH_INVALID
-                            // but that prevents cmd.exe from performing a recursive
-                            // directory enumeration when opening a directory entry
-                            // that represents a symlink to an invalid path is discovered.
-                            //
-                            try_return( ntStatus = STATUS_OBJECT_PATH_NOT_FOUND);
-                        }
-
-                        uniPathName = uniRemainingPath;
-
                         pParentDirEntry = NULL;
                     }
 
@@ -860,7 +868,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSLocateNameEntry (FO: %08lX) Building MP target for parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                  "AFSLocateNameEntry (FO: %p) Building MP target for parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                   FileObject,
                                   &pDirEntry->NameInformation.FileName,
                                   pCurrentObject->FileId.Cell,
@@ -881,9 +889,9 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSLocateNameEntry Decrement2 count on volume %08lX Cnt %d\n",
+                                  "AFSLocateNameEntry Decrement2 count on volume %p Cnt %d\n",
                                   pCurrentVolume,
-                                  pCurrentVolume->VolumeReferenceCount);
+                                  lCount);
 
                     ntStatus = AFSBuildMountPointTarget( AuthGroup,
                                                          pDirEntry,
@@ -894,7 +902,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
-                                      "AFSLocateNameEntry (FO: %08lX) Failed to build MP target for parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Failed to build MP target for parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.FileName,
                                       pCurrentObject->FileId.Cell,
@@ -915,18 +923,11 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                     ASSERT( pCurrentVolume->VolumeReferenceCount > 1);
 
                     //
-                    // Replace the current name for the mp with the volume root of the target
-                    //
-
-                    AFSReplaceCurrentElement( pNameArray,
-                                              pCurrentVolume->DirectoryCB);
-
-                    //
                     // We want to restart processing here on the new parent ...
                     // Deref and ref count the entries
                     //
 
-                    lCount = InterlockedDecrement( &pDirEntry->OpenReferenceCount);
+                    lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
@@ -936,9 +937,11 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                                   NULL,
                                   lCount);
 
+                    ASSERT( lCount >= 0);
+
                     pDirEntry = pCurrentVolume->DirectoryCB;
 
-                    lCount = InterlockedIncrement( &pDirEntry->OpenReferenceCount);
+                    lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
@@ -948,6 +951,14 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                                   NULL,
                                   lCount);
 
+                    //
+                    // The name array stores both the mount point and the target.
+                    // Insert the target.
+                    //
+
+                    AFSInsertNextElement( pNameArray,
+                                          pDirEntry);
+
                     pParentDirEntry = NULL;
 
                     //
@@ -1010,7 +1021,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
-                                      "AFSLocateNameEntry (FO: %08lX) Failed to process DFSLink parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Failed to process DFSLink parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.FileName,
                                       pCurrentObject->FileId.Cell,
@@ -1046,7 +1057,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSLocateNameEntry (FO: %08lX) Enumerating parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Enumerating parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -1071,7 +1082,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
-                                      "AFSLocateNameEntry (FO: %08lX) Failed to enumerate parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Failed to enumerate parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.FileName,
                                       pCurrentObject->FileId.Cell,
@@ -1096,7 +1107,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSLocateNameEntry (FO: %08lX) Encountered file node %wZ FID %08lX-%08lX-%08lX-%08lX in path processing\n",
+                                  "AFSLocateNameEntry (FO: %p) Encountered file node %wZ FID %08lX-%08lX-%08lX-%08lX in path processing\n",
                                   FileObject,
                                   &pDirEntry->NameInformation.FileName,
                                   pCurrentObject->FileId.Cell,
@@ -1118,7 +1129,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSLocateNameEntry (FO: %08lX) Returning file %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                  "AFSLocateNameEntry (FO: %p) Returning file %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                   FileObject,
                                   &pDirEntry->NameInformation.FileName,
                                   pCurrentObject->FileId.Cell,
@@ -1151,7 +1162,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSLocateNameEntry (FO: %08lX) Completed processing returning %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Completed processing returning %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -1181,7 +1192,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                 uniSearchName.Buffer != NULL)
             {
 
-                AFSExFreePool( uniSearchName.Buffer);
+                AFSExFreePoolWithTag( uniSearchName.Buffer, 0);
 
                 bSubstituteName = FALSE;
 
@@ -1222,7 +1233,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSLocateNameEntry (FO: %08lX) Backing up entry from %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Backing up entry from %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -1233,7 +1244,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                 //
                 // Need to back up one entry in the name array
                 //
-                lCount = InterlockedDecrement( &pDirEntry->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
@@ -1243,6 +1254,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                               NULL,
                               lCount);
 
+                ASSERT( lCount >= 0);
+
                 pDirEntry = AFSBackupEntry( NameArray);
 
                 if( pDirEntry == NULL)
@@ -1255,7 +1268,15 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                     try_return(ntStatus = STATUS_OBJECT_PATH_INVALID);
                 }
 
-                lCount = InterlockedIncrement( &pDirEntry->OpenReferenceCount);
+                lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSLocateNameEntry Increment4 count on %wZ DE %p Ccb %p Cnt %d\n",
+                              &pDirEntry->NameInformation.FileName,
+                              pDirEntry,
+                              NULL,
+                              lCount);
 
                 if( BooleanFlagOn( pDirEntry->ObjectInformation->Flags, AFS_OBJECT_ROOT_VOLUME))
                 {
@@ -1270,14 +1291,6 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                     ASSERT( pParentDirEntry != pDirEntry);
                 }
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSLocateNameEntry Increment4 count on %wZ DE %p Ccb %p Cnt %d\n",
-                              &pDirEntry->NameInformation.FileName,
-                              pDirEntry,
-                              NULL,
-                              pDirEntry->OpenReferenceCount);
-
                 uniPathName = uniRemainingPath;
 
                 continue;
@@ -1310,7 +1323,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE_2,
-                                  "AFSLocateNameEntry (FO: %08lX) Processing @SYS substitution for %wZ Index %08lX\n",
+                                  "AFSLocateNameEntry (FO: %p) Processing @SYS substitution for %wZ Index %08lX\n",
                                   FileObject,
                                   &uniComponentName,
                                   ulSubstituteIndex);
@@ -1324,7 +1337,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE_2,
-                                      "AFSLocateNameEntry (FO: %08lX) Located substitution %wZ for %wZ Index %08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Located substitution %wZ for %wZ Index %08lX\n",
                                       FileObject,
                                       &uniSearchName,
                                       &uniComponentName,
@@ -1345,7 +1358,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
-                                      "AFSLocateNameEntry (FO: %08lX) Failed to locate substitute string for %wZ Index %08lX Status %08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Failed to locate substitute string for %wZ Index %08lX Status %08lX\n",
                                       FileObject,
                                       &uniComponentName,
                                       ulSubstituteIndex,
@@ -1386,7 +1399,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE_2,
-                              "AFSLocateNameEntry (FO: %08lX) Searching for entry %wZ case sensitive\n",
+                              "AFSLocateNameEntry (FO: %p) Searching for entry %wZ case sensitive\n",
                               FileObject,
                               &uniSearchName);
 
@@ -1409,7 +1422,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE_2,
-                                  "AFSLocateNameEntry (FO: %08lX) Searching for entry %wZ case insensitive\n",
+                                  "AFSLocateNameEntry (FO: %p) Searching for entry %wZ case insensitive\n",
                                   FileObject,
                                   &uniSearchName);
 
@@ -1428,14 +1441,15 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                         // a lookup in the short name tree
                         //
 
-                        if( RtlIsNameLegalDOS8Dot3( &uniSearchName,
+                        if( !BooleanFlagOn( pDevExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+                            RtlIsNameLegalDOS8Dot3( &uniSearchName,
                                                     NULL,
                                                     NULL))
                         {
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE_2,
-                                          "AFSLocateNameEntry (FO: %08lX) Searching for entry %wZ short name\n",
+                                          "AFSLocateNameEntry (FO: %p) Searching for entry %wZ short name\n",
                                           FileObject,
                                           &uniSearchName);
 
@@ -1444,6 +1458,26 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                                                         &pDirEntry);
                         }
 
+                        if ( pDirEntry == NULL &&
+                             pParentDirEntry->ObjectInformation->VolumeCB == AFSGlobalRoot)
+                        {
+
+                            //
+                            // Check with the service to see if this is a valid cell name
+                            // that can be automatically resolved.  Drop the shared TreeLock
+                            // since AFSCheckCellName must acquire it exclusively.
+                            //
+
+                            AFSReleaseResource( pParentDirEntry->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+                            ntStatus = AFSCheckCellName( AuthGroup,
+                                                         &uniSearchName,
+                                                         &pDirEntry);
+
+                            AFSAcquireShared( pParentDirEntry->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                                              TRUE);
+                        }
+
                         if( pDirEntry == NULL)
                         {
 
@@ -1454,7 +1488,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                             if( bSubstituteName)
                             {
 
-                                AFSExFreePool( uniSearchName.Buffer);
+                                AFSExFreePoolWithTag( uniSearchName.Buffer, 0);
 
                                 uniSearchName = uniComponentName;
 
@@ -1469,6 +1503,16 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                             {
 
                                 ntStatus = STATUS_OBJECT_PATH_NOT_FOUND;
+
+                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                              AFS_TRACE_LEVEL_VERBOSE,
+                                              "AFSLocateNameEntry (FO: %p) Returning path not found for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                              FileObject,
+                                              &uniSearchName,
+                                              pCurrentObject->FileId.Cell,
+                                              pCurrentObject->FileId.Volume,
+                                              pCurrentObject->FileId.Vnode,
+                                              pCurrentObject->FileId.Unique);
                             }
                             else
                             {
@@ -1477,7 +1521,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                               AFS_TRACE_LEVEL_VERBOSE,
-                                              "AFSLocateNameEntry (FO: %08lX) Returning name not found for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                              "AFSLocateNameEntry (FO: %p) Returning name not found for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                               FileObject,
                                               &uniSearchName,
                                               pCurrentObject->FileId.Cell,
@@ -1525,6 +1569,20 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                             pDirEntry->CaseInsensitiveList.fLink != NULL)
                         {
 
+                            //
+                            // Increment our dir entry ref count since we will decrement it on exit
+                            //
+
+                            lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
+
+                            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                                          AFS_TRACE_LEVEL_VERBOSE,
+                                          "AFSLocateNameEntry Increment5 count on %wZ DE %p Ccb %p Cnt %d\n",
+                                          &pDirEntry->NameInformation.FileName,
+                                          pDirEntry,
+                                          NULL,
+                                          lCount);
+
                             AFSReleaseResource( pParentDirEntry->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
 
                             try_return(ntStatus = STATUS_OBJECT_NAME_COLLISION);
@@ -1548,7 +1606,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSLocateNameEntry (FO: %08lX) Verifying(2) parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Verifying(2) parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                       FileObject,
                                       &pParentDirEntry->NameInformation.FileName,
                                       pParentDirEntry->ObjectInformation->FileId.Cell,
@@ -1573,7 +1631,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_ERROR,
-                                          "AFSLocateNameEntry (FO: %08lX) Failed to verify(2) parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                          "AFSLocateNameEntry (FO: %p) Failed to verify(2) parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                           FileObject,
                                           &pParentDirEntry->NameInformation.FileName,
                                           pParentDirEntry->ObjectInformation->FileId.Cell,
@@ -1587,7 +1645,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSLocateNameEntry (FO: %08lX) Reprocessing component %wZ in parent %wZ\n",
+                                      "AFSLocateNameEntry (FO: %p) Reprocessing component %wZ in parent %wZ\n",
                                       FileObject,
                                       &uniSearchName,
                                       &pParentDirEntry->NameInformation.FileName);
@@ -1602,7 +1660,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                     // Increment our dir entry ref count
                     //
 
-                    lCount = InterlockedIncrement( &pDirEntry->OpenReferenceCount);
+                    lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
@@ -1629,7 +1687,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSLocateNameEntry (FO: %08lX) Deleted entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Deleted entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -1642,22 +1700,34 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                 // on the entry
                 //
 
-                ASSERT( pCurrentObject->ParentObjectInformation != NULL);
+                pParentObjectInfo = pCurrentObject->ParentObjectInformation;
 
-                AFSAcquireExcl( pCurrentObject->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                ASSERT( pParentObjectInfo != NULL);
+
+                AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                                 TRUE);
 
                 AFSAcquireExcl( pCurrentObject->VolumeCB->ObjectInfoTree.TreeLock,
                                 TRUE);
 
-                lCount = InterlockedDecrement( &pDirEntry->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSLocateNameEntry Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+                              &pDirEntry->NameInformation.FileName,
+                              pDirEntry,
+                              NULL,
+                              lCount);
 
-                if( lCount == 0)
+                ASSERT( lCount >= 0);
+
+                if( lCount <= 0)
                 {
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING|AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSLocateNameEntry Deleting dir entry %08lX (%08lX) for %wZ\n",
+                                  "AFSLocateNameEntry Deleting dir entry %p (%p) for %wZ\n",
                                   pDirEntry,
                                   pCurrentObject,
                                   &pDirEntry->NameInformation.FileName);
@@ -1666,10 +1736,13 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                     // Remove and delete the directory entry from the parent list
                     //
 
-                    AFSDeleteDirEntry( pCurrentObject->ParentObjectInformation,
+                    AFSDeleteDirEntry( pParentObjectInfo,
                                        pDirEntry);
 
-                    if( pCurrentObject->ObjectReferenceCount == 0)
+                    AFSAcquireShared( &pCurrentObject->NonPagedInfo->ObjectInfoLock,
+                                      TRUE);
+
+                    if( pCurrentObject->ObjectReferenceCount <= 0)
                     {
 
                         if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
@@ -1677,7 +1750,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSLocateNameEntry Removing object %08lX from volume tree\n",
+                                          "AFSLocateNameEntry Removing object %p from volume tree\n",
                                           pCurrentObject);
 
                             AFSRemoveHashEntry( &pCurrentObject->VolumeCB->ObjectInfoTree.TreeHead,
@@ -1686,6 +1759,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                             ClearFlag( pCurrentObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
                         }
                     }
+
+                    AFSReleaseResource( &pCurrentObject->NonPagedInfo->ObjectInfoLock);
                 }
                 else
                 {
@@ -1698,11 +1773,11 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
 
-                    AFSRemoveNameEntry( pCurrentObject->ParentObjectInformation,
+                    AFSRemoveNameEntry( pParentObjectInfo,
                                         pDirEntry);
                 }
 
-                AFSReleaseResource( pCurrentObject->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+                AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
 
                 AFSReleaseResource( pCurrentObject->VolumeCB->ObjectInfoTree.TreeLock);
 
@@ -1713,7 +1788,18 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 if( uniRemainingPath.Length > 0)
                 {
+
                     ntStatus = STATUS_OBJECT_PATH_NOT_FOUND;
+
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSLocateNameEntry (FO: %p) Returning path not found(2) for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                  FileObject,
+                                  &uniComponentName,
+                                  pCurrentObject->FileId.Cell,
+                                  pCurrentObject->FileId.Volume,
+                                  pCurrentObject->FileId.Vnode,
+                                  pCurrentObject->FileId.Unique);
                 }
                 else
                 {
@@ -1722,7 +1808,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSLocateNameEntry (FO: %08lX) Returning name not found(2) for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                  "AFSLocateNameEntry (FO: %p) Returning name not found(2) for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                   FileObject,
                                   &uniComponentName,
                                   pCurrentObject->FileId.Cell,
@@ -1760,7 +1846,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
             // Decrement the previous parent
             //
 
-            lCount = InterlockedDecrement( &pParentDirEntry->OpenReferenceCount);
+            lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
@@ -1770,6 +1856,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                           NULL,
                           lCount);
 
+            ASSERT( lCount >= 0);
+
             //
             // If we ended up substituting a name in the component then update
             // the full path and update the pointers
@@ -1782,7 +1870,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE_2,
-                              "AFSLocateNameEntry (FO: %08lX) Substituting %wZ into %wZ Index %08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Substituting %wZ into %wZ Index %08lX\n",
                               FileObject,
                               &uniSearchName,
                               &uniComponentName,
@@ -1814,7 +1902,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSLocateNameEntry (FO: %08lX) Failure to substitute %wZ into %wZ Index %08lX Status %08lX\n",
+                                  "AFSLocateNameEntry (FO: %p) Failure to substitute %wZ into %wZ Index %08lX Status %08lX\n",
                                   FileObject,
                                   &uniSearchName,
                                   &uniComponentName,
@@ -1844,9 +1932,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
             //
 
             if( pCurrentObject->FileType == AFS_FILE_TYPE_SYMLINK &&
-                pCurrentObject->TargetFileId.Vnode == 0 &&
-                pCurrentObject->TargetFileId.Unique == 0 &&
-                pDirEntry->NameInformation.TargetName.Length == 0)
+                ( pCurrentObject->TargetFileId.Vnode == 0 ||
+                  pDirEntry->NameInformation.TargetName.Length == 0))
             {
 
                 ntStatus = AFSValidateSymLink( AuthGroup,
@@ -1857,7 +1944,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSLocateNameEntry (FO: %08lX) Failed to evaluate possible DFS Link %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                  "AFSLocateNameEntry (FO: %p) Failed to evaluate possible DFS Link %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                   FileObject,
                                   &pDirEntry->NameInformation.FileName,
                                   pCurrentObject->FileId.Cell,
@@ -1876,7 +1963,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSLocateNameEntry (FO: %08lX) Inserting name array entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                          "AFSLocateNameEntry (FO: %p) Inserting name array entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                           FileObject,
                           &pDirEntry->NameInformation.FileName,
                           pCurrentObject->FileId.Cell,
@@ -1898,7 +1985,7 @@ try_exit:
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSLocateNameEntry (FO: %08lX) Completed processing %wZ Status %08lX\n",
+                      "AFSLocateNameEntry (FO: %p) Completed processing %wZ Status %08lX\n",
                       FileObject,
                       RootPathName,
                       ntStatus);
@@ -1911,7 +1998,7 @@ try_exit:
             if( pDirEntry != NULL)
             {
 
-                lCount = InterlockedDecrement( &pDirEntry->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
@@ -1920,11 +2007,13 @@ try_exit:
                               pDirEntry,
                               NULL,
                               lCount);
+
+                ASSERT( lCount >= 0);
             }
             else if( pParentDirEntry != NULL)
             {
 
-                lCount = InterlockedDecrement( &pParentDirEntry->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
@@ -1933,6 +2022,8 @@ try_exit:
                               pParentDirEntry,
                               NULL,
                               lCount);
+
+                ASSERT( lCount >= 0);
             }
 
             if( bReleaseCurrentVolume)
@@ -1944,7 +2035,7 @@ try_exit:
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSLocateNameEntry Decrement3 count on volume %08lX Cnt %d\n",
+                              "AFSLocateNameEntry Decrement3 count on volume %p Cnt %d\n",
                               pCurrentVolume,
                               lCount);
             }
@@ -1952,7 +2043,7 @@ try_exit:
             if( RootPathName->Buffer != uniFullPathName.Buffer)
             {
 
-                AFSExFreePool( uniFullPathName.Buffer);
+                AFSExFreePoolWithTag( uniFullPathName.Buffer, 0);
             }
         }
         else
@@ -1967,7 +2058,7 @@ try_exit:
                               &(*ParentDirectoryCB)->NameInformation.FileName,
                               *ParentDirectoryCB,
                               NULL,
-                              (*ParentDirectoryCB)->OpenReferenceCount);
+                              (*ParentDirectoryCB)->DirOpenReferenceCount);
             }
 
             if( *DirectoryCB != NULL)
@@ -1979,7 +2070,7 @@ try_exit:
                               &(*DirectoryCB)->NameInformation.FileName,
                               *DirectoryCB,
                               NULL,
-                              (*DirectoryCB)->OpenReferenceCount);
+                              (*DirectoryCB)->DirOpenReferenceCount);
             }
         }
 
@@ -1987,7 +2078,7 @@ try_exit:
             uniSearchName.Buffer != NULL)
         {
 
-            AFSExFreePool( uniSearchName.Buffer);
+            AFSExFreePoolWithTag( uniSearchName.Buffer, 0);
         }
     }
 
@@ -2004,9 +2095,9 @@ AFSCreateDirEntry( IN GUID            *AuthGroup,
                    IN OUT AFSDirectoryCB **DirEntry)
 {
 
+    UNREFERENCED_PARAMETER(FileName);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSDirectoryCB *pDirNode = NULL, *pExistingDirNode = NULL;
-    UNICODE_STRING uniShortName;
     LARGE_INTEGER liFileSize = {0,0};
     LONG lCount;
 
@@ -2068,6 +2159,11 @@ AFSCreateDirEntry( IN GUID            *AuthGroup,
             try_return( ntStatus);
         }
 
+        //
+        // If AFSNotifyFileCreate returns pDirNode != NULL, then its
+        // DirOpenReferenceCount is held.
+        //
+
         AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                         TRUE);
 
@@ -2123,19 +2219,32 @@ AFSCreateDirEntry( IN GUID            *AuthGroup,
                                &pExistingDirNode->ObjectInformation->FileId))
             {
 
-                AFSDeleteDirEntry( ParentObjectInfo,
-                                   pDirNode);
+                if ( pExistingDirNode != pDirNode)
+                {
 
-                lCount = InterlockedIncrement( &pExistingDirNode->OpenReferenceCount);
+                    lCount = InterlockedDecrement( &pDirNode->DirOpenReferenceCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreateDirEntry Increment count on %wZ DE %p Cnt %d\n",
-                              &pExistingDirNode->NameInformation.FileName,
-                              pExistingDirNode,
-                              lCount);
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSCreateDirEntry Decrement count on %wZ DE %p Cnt %d\n",
+                                  &pDirNode->NameInformation.FileName,
+                                  pDirNode,
+                                  lCount);
+
+                    AFSDeleteDirEntry( ParentObjectInfo,
+                                       pDirNode);
+
+                    lCount = InterlockedIncrement( &pExistingDirNode->DirOpenReferenceCount);
+
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSCreateDirEntry Increment count on %wZ DE %p Cnt %d\n",
+                                  &pExistingDirNode->NameInformation.FileName,
+                                  pExistingDirNode,
+                                  lCount);
 
-                *DirEntry = pExistingDirNode;
+                    *DirEntry = pExistingDirNode;
+                }
 
                 AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
 
@@ -2148,7 +2257,7 @@ AFSCreateDirEntry( IN GUID            *AuthGroup,
                 // Need to tear down this entry and rebuild it below
                 //
 
-                if( pExistingDirNode->OpenReferenceCount == 0)
+                if( pExistingDirNode->DirOpenReferenceCount <= 0)
                 {
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
@@ -2190,7 +2299,6 @@ AFSCreateDirEntry( IN GUID            *AuthGroup,
                     AFSRemoveNameEntry( ParentObjectInfo,
                                         pExistingDirNode);
                 }
-
             }
         }
 
@@ -2212,15 +2320,6 @@ AFSCreateDirEntry( IN GUID            *AuthGroup,
                                 pDirNode,
                                 TRUE);
 
-        lCount = InterlockedIncrement( &pDirNode->OpenReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSCreateDirEntry Increment2 count on %wZ DE %p Cnt %d\n",
-                      &pDirNode->NameInformation.FileName,
-                      pDirNode,
-                      lCount);
-
         //
         // Pass back the dir entry
         //
@@ -2366,7 +2465,7 @@ AFSInsertDirectoryNode( IN AFSObjectInfoCB *ParentObjectInfo,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInsertDirectoryNode Inserting entry %08lX %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                          "AFSInsertDirectoryNode Inserting entry %p %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                           DirEntry,
                           &DirEntry->NameInformation.FileName,
                           DirEntry->ObjectInformation->FileId.Cell,
@@ -2419,16 +2518,19 @@ AFSDeleteDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
     __Enter
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSDeleteDirEntry Deleting dir entry in parent %08lX Entry %08lX %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                      "AFSDeleteDirEntry Deleting dir entry in parent %p Entry %p %wZ FID %08lX-%08lX-%08lX-%08lX RefCount %d\n",
                       ParentObjectInfo,
                       DirEntry,
                       &DirEntry->NameInformation.FileName,
                       DirEntry->ObjectInformation->FileId.Cell,
                       DirEntry->ObjectInformation->FileId.Volume,
                       DirEntry->ObjectInformation->FileId.Vnode,
-                      DirEntry->ObjectInformation->FileId.Unique);
+                      DirEntry->ObjectInformation->FileId.Unique,
+                      DirEntry->DirOpenReferenceCount);
+
+        ASSERT( DirEntry->DirOpenReferenceCount == 0);
 
         AFSRemoveDirNodeFromParent( ParentObjectInfo,
                                     DirEntry,
@@ -2441,43 +2543,49 @@ AFSDeleteDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
         if( BooleanFlagOn( DirEntry->Flags, AFS_DIR_RELEASE_NAME_BUFFER))
         {
 
-            AFSExFreePool( DirEntry->NameInformation.FileName.Buffer);
+            AFSExFreePoolWithTag( DirEntry->NameInformation.FileName.Buffer, 0);
         }
 
         if( BooleanFlagOn( DirEntry->Flags, AFS_DIR_RELEASE_TARGET_NAME_BUFFER))
         {
 
-            AFSExFreePool( DirEntry->NameInformation.TargetName.Buffer);
+            AFSExFreePoolWithTag( DirEntry->NameInformation.TargetName.Buffer, 0);
         }
 
         //
         // Dereference the object for this dir entry
         //
 
-        ASSERT( DirEntry->ObjectInformation->ObjectReferenceCount > 0);
+        lCount = AFSObjectInfoDecrement( DirEntry->ObjectInformation,
+                                         AFS_OBJECT_REFERENCE_DIRENTRY);
 
-        lCount = InterlockedDecrement( &DirEntry->ObjectInformation->ObjectReferenceCount);
+        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSDeleteDirEntry Decrement count on object %p Cnt %d\n",
+                      DirEntry->ObjectInformation,
+                      lCount);
 
-        if( lCount == 0)
+        if( BooleanFlagOn( DirEntry->Flags, AFS_DIR_ENTRY_DELETED) &&
+            DirEntry->ObjectInformation->Links == 0)
         {
+
             SetFlag( DirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSDeleteDirEntry Decrement count on object %08lX Cnt %d\n",
-                      DirEntry->ObjectInformation,
-                      DirEntry->ObjectInformation->ObjectReferenceCount);
-
         ExDeleteResourceLite( &DirEntry->NonPaged->Lock);
 
-        AFSExFreePool( DirEntry->NonPaged);
+        AFSExFreePoolWithTag( DirEntry->NonPaged, AFS_DIR_ENTRY_NP_TAG);
 
         //
         // Free up the dir entry
         //
 
-        AFSExFreePool( DirEntry);
+        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSDeleteDirEntry AFS_DIR_ENTRY_TAG deallocating %p\n",
+                      DirEntry);
+
+        AFSExFreePoolWithTag( DirEntry, AFS_DIR_ENTRY_TAG);
     }
 
     return ntStatus;
@@ -2500,7 +2608,7 @@ AFSRemoveDirNodeFromParent( IN AFSObjectInfoCB *ParentObjectInfo,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSRemoveDirNodeFromParent Removing DirEntry %08lX %wZ FID %08lX-%08lX-%08lX-%08lX from Parent %08lX\n",
+                      "AFSRemoveDirNodeFromParent Removing DirEntry %p %wZ FID %08lX-%08lX-%08lX-%08lX from Parent %p\n",
                       DirEntry,
                       &DirEntry->NameInformation.FileName,
                       DirEntry->ObjectInformation->FileId.Cell,
@@ -2514,7 +2622,7 @@ AFSRemoveDirNodeFromParent( IN AFSObjectInfoCB *ParentObjectInfo,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSRemoveDirNodeFromParent Removing DirEntry %08lX name %wZ\n",
+                          "AFSRemoveDirNodeFromParent Removing DirEntry %p name %wZ\n",
                           DirEntry,
                           &DirEntry->NameInformation.FileName);
 
@@ -2681,7 +2789,7 @@ AFSParseName( IN PIRP Irp,
     AFSDeviceExt       *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     UNICODE_STRING      uniFullName, uniComponentName, uniRemainingPath;
     ULONG               ulCRC = 0;
-    AFSDirectoryCB     *pDirEntry = NULL, *pShareDirEntry = NULL, *pTargetDirEntry = NULL;
+    AFSDirectoryCB     *pDirEntry = NULL;
     USHORT              usIndex = 0, usDriveIndex = 0;
     AFSCcb             *pRelatedCcb = NULL;
     AFSNameArrayHdr    *pNameArray = NULL, *pRelatedNameArray = NULL;
@@ -2702,6 +2810,8 @@ AFSParseName( IN PIRP Irp,
 
         *ParseFlags = AFS_PARSE_FLAG_ROOT_ACCESS;
 
+        *ParentDirectoryCB = NULL;
+
         if( pIrpSp->FileObject->RelatedFileObject != NULL)
         {
 
@@ -2721,7 +2831,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
-                          "AFSParseName (%08lX) Relative open for %wZ FID %08lX-%08lX-%08lX-%08lX component %wZ\n",
+                          "AFSParseName (%p) Relative open for %wZ FID %08lX-%08lX-%08lX-%08lX component %wZ\n",
                           Irp,
                           &pRelatedCcb->DirectoryCB->NameInformation.FileName,
                           pRelatedCcb->DirectoryCB->ObjectInformation->FileId.Cell,
@@ -2735,7 +2845,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%08lX) Component %wZ contains wild cards\n",
+                              "AFSParseName (%p) Component %wZ contains wild cards\n",
                               Irp,
                               &uniFullName);
 
@@ -2765,7 +2875,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%08lX) Volume %08lX:%08lX OFFLINE/INVALID\n",
+                              "AFSParseName (%p) Volume %08lX:%08lX OFFLINE/INVALID\n",
                               Irp,
                               pVolumeCB->ObjectInformation.FileId.Cell,
                               pVolumeCB->ObjectInformation.FileId.Volume);
@@ -2780,7 +2890,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSParseName (%08lX) Verifying root of volume %08lX:%08lX\n",
+                              "AFSParseName (%p) Verifying root of volume %08lX:%08lX\n",
                               Irp,
                               pVolumeCB->ObjectInformation.FileId.Cell,
                               pVolumeCB->ObjectInformation.FileId.Volume);
@@ -2793,7 +2903,7 @@ AFSParseName( IN PIRP Irp,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSParseName (%08lX) Failed verification of root Status %08lX\n",
+                                  "AFSParseName (%p) Failed verification of root Status %08lX\n",
                                   Irp,
                                   ntStatus);
 
@@ -2810,7 +2920,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSParseName (%08lX) Verifying parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              "AFSParseName (%p) Verifying parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               Irp,
                               &pDirEntry->NameInformation.FileName,
                               pDirEntry->ObjectInformation->FileId.Cell,
@@ -2835,7 +2945,7 @@ AFSParseName( IN PIRP Irp,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSParseName (%08lX) Failed verification of parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                  "AFSParseName (%p) Failed verification of parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                   Irp,
                                   &pDirEntry->NameInformation.FileName,
                                   pDirEntry->ObjectInformation->FileId.Cell,
@@ -2868,7 +2978,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%08lX) Failed to allocate full name buffer\n",
+                              "AFSParseName (%p) Failed to allocate full name buffer\n",
                               Irp);
 
                 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
@@ -2905,7 +3015,7 @@ AFSParseName( IN PIRP Irp,
 
                 RtlCopyMemory( &uniFullName.Buffer[ uniFullName.Length/sizeof( WCHAR)],
                                pIrpSp->FileObject->FileName.Buffer,
-                               pIr\epSp->FileObject->FileName.Length);
+                               pIrpSp->FileObject->FileName.Length);
 
                 uniFullName.Length += pIrpSp->FileObject->FileName.Length;
             }
@@ -2931,10 +3041,10 @@ AFSParseName( IN PIRP Irp,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSParseName (%08lX) Failed to initialize name array\n",
+                                  "AFSParseName (%p) Failed to initialize name array\n",
                                   Irp);
 
-                    AFSExFreePool( uniFullName.Buffer);
+                    AFSExFreePoolWithTag( uniFullName.Buffer, 0);
 
                     try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
                 }
@@ -2958,10 +3068,10 @@ AFSParseName( IN PIRP Irp,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSParseName (%08lX) Failed to initialize name array\n",
+                                  "AFSParseName (%p) Failed to initialize name array\n",
                                   Irp);
 
-                    AFSExFreePool( uniFullName.Buffer);
+                    AFSExFreePoolWithTag( uniFullName.Buffer, 0);
 
                     try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
                 }
@@ -2976,10 +3086,10 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSParseName (%08lX) Failed to populate name array\n",
+                              "AFSParseName (%p) Failed to populate name array\n",
                               Irp);
 
-                AFSExFreePool( uniFullName.Buffer);
+                AFSExFreePoolWithTag( uniFullName.Buffer, 0);
 
                 try_return( ntStatus);
             }
@@ -2997,8 +3107,6 @@ AFSParseName( IN PIRP Irp,
 
             *NameArray = pNameArray;
 
-            *VolumeCB = pVolumeCB;
-
             //
             // Increment our volume reference count
             //
@@ -3007,25 +3115,17 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSParseName Increment count on volume %08lX Cnt %d\n",
+                          "AFSParseName Increment count on volume %p Cnt %d\n",
                           pVolumeCB,
                           lCount);
 
-            *ParentDirectoryCB = pDirEntry;
-
-            lCount = InterlockedIncrement( &pDirEntry->OpenReferenceCount);
+            *VolumeCB = pVolumeCB;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSParseName Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
-                          &pDirEntry->NameInformation.FileName,
-                          pDirEntry,
-                          NULL,
-                          lCount);
+            *ParentDirectoryCB = pDirEntry;
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
-                          "AFSParseName (%08lX) Returning full name %wZ\n",
+                          "AFSParseName (%p) Returning full name %wZ\n",
                           Irp,
                           &uniFullName);
 
@@ -3044,7 +3144,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSParseName (%08lX) Name %wZ contains wild cards or too short\n",
+                          "AFSParseName (%p) Name %wZ contains wild cards or too short\n",
                           Irp,
                           &uniFullName);
 
@@ -3117,7 +3217,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%08lX) Name %wZ does not have server name\n",
+                              "AFSParseName (%p) Name %wZ does not have server name\n",
                               Irp,
                               &pIrpSp->FileObject->FileName);
 
@@ -3134,7 +3234,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%08lX) Name %wZ contains invalid drive mapping\n",
+                              "AFSParseName (%p) Name %wZ contains invalid drive mapping\n",
                               Irp,
                               &pIrpSp->FileObject->FileName);
 
@@ -3147,7 +3247,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSParseName (%08lX) Component %wZ contains wild cards\n",
+                          "AFSParseName (%p) Component %wZ contains wild cards\n",
                           Irp,
                           &uniFullName);
 
@@ -3156,7 +3256,7 @@ AFSParseName( IN PIRP Irp,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
-                      "AFSParseName (%08lX) Processing full name %wZ\n",
+                      "AFSParseName (%p) Processing full name %wZ\n",
                       Irp,
                       &uniFullName);
 
@@ -3184,7 +3284,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSParseName (%08lX) Volume %08lX:%08lX OFFLINE/INVALID\n",
+                          "AFSParseName (%p) Volume %08lX:%08lX OFFLINE/INVALID\n",
                           Irp,
                           AFSGlobalRoot->ObjectInformation.FileId.Cell,
                           AFSGlobalRoot->ObjectInformation.FileId.Volume);
@@ -3199,7 +3299,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSParseName (%08lX) Verifying root of volume %08lX:%08lX\n",
+                          "AFSParseName (%p) Verifying root of volume %08lX:%08lX\n",
                           Irp,
                           AFSGlobalRoot->ObjectInformation.FileId.Cell,
                           AFSGlobalRoot->ObjectInformation.FileId.Volume);
@@ -3212,7 +3312,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%08lX) Failed verification of root Status %08lX\n",
+                              "AFSParseName (%p) Failed verification of root Status %08lX\n",
                               Irp,
                               ntStatus);
 
@@ -3229,7 +3329,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSParseName (%08lX) Enumerating global root of volume %08lX:%08lX\n",
+                          "AFSParseName (%p) Enumerating global root of volume %08lX:%08lX\n",
                           Irp,
                           AFSGlobalRoot->ObjectInformation.FileId.Cell,
                           AFSGlobalRoot->ObjectInformation.FileId.Volume);
@@ -3241,7 +3341,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%08lX) Failed enumeraiton of root Status %08lX\n",
+                              "AFSParseName (%p) Failed enumeraiton of root Status %08lX\n",
                               Irp,
                               ntStatus);
 
@@ -3250,7 +3350,7 @@ AFSParseName( IN PIRP Irp,
         }
 
         //
-        // Check for the \\Server access and return it as though it where \\Server\Globalroot
+        // Check for the \\Server access and return it as though it were \\Server\Globalroot
         //
 
         if( uniRemainingPath.Buffer == NULL ||
@@ -3260,10 +3360,10 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
-                          "AFSParseName (%08lX) Returning global root access\n",
+                          "AFSParseName (%p) Returning global root access\n",
                           Irp);
 
-            lCount = InterlockedIncrement( &AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
+            lCount = InterlockedIncrement( &AFSGlobalRoot->DirectoryCB->DirOpenReferenceCount);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
@@ -3308,7 +3408,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSParseName (%08lX) Component %wZ contains wild cards\n",
+                          "AFSParseName (%p) Component %wZ contains wild cards\n",
                           Irp,
                           &uniComponentName);
 
@@ -3339,10 +3439,10 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE_2,
-                              "AFSParseName (%08lX) Returning global root access\n",
+                              "AFSParseName (%p) Returning global root access\n",
                               Irp);
 
-                lCount = InterlockedIncrement( &AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
+                lCount = InterlockedIncrement( &AFSGlobalRoot->DirectoryCB->DirOpenReferenceCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
@@ -3382,10 +3482,10 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE_2,
-                              "AFSParseName (%08lX) Returning root PIOCtl access\n",
+                              "AFSParseName (%p) Returning root PIOCtl access\n",
                               Irp);
 
-                lCount = InterlockedIncrement( &AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
+                lCount = InterlockedIncrement( &AFSGlobalRoot->DirectoryCB->DirOpenReferenceCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
@@ -3410,7 +3510,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
-                          "AFSParseName (%08lX) Returning root share name %wZ access\n",
+                          "AFSParseName (%p) Returning root share name %wZ access\n",
                           Irp,
                           &uniComponentName);
 
@@ -3444,19 +3544,9 @@ AFSParseName( IN PIRP Irp,
 
             *FileName = uniComponentName;
 
-            *ParentDirectoryCB = pDirEntry;
-
             ClearFlag( *ParseFlags, AFS_PARSE_FLAG_ROOT_ACCESS);
 
-            lCount = InterlockedIncrement( &pDirEntry->OpenReferenceCount);
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSParseName Increment5 count on %wZ DE %p Ccb %p Cnt %d\n",
-                          &pDirEntry->NameInformation.FileName,
-                          pDirEntry,
-                          NULL,
-                          lCount);
+            *ParentDirectoryCB = pDirEntry;
 
             try_return( ntStatus = STATUS_SUCCESS);
         }
@@ -3495,7 +3585,8 @@ AFSParseName( IN PIRP Irp,
                 // a lookup in the short name tree
                 //
 
-                if( RtlIsNameLegalDOS8Dot3( &uniComponentName,
+                if( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+                    RtlIsNameLegalDOS8Dot3( &uniComponentName,
                                             NULL,
                                             NULL))
                 {
@@ -3528,6 +3619,13 @@ AFSParseName( IN PIRP Irp,
                              ntStatus == STATUS_OBJECT_PATH_NOT_FOUND)
                         {
 
+                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                          AFS_TRACE_LEVEL_VERBOSE,
+                                          "AFSParseName (%p) AFSCheckCellName %wZ returned path not found; ntStatus %08X\n",
+                                          Irp,
+                                          &uniComponentName,
+                                          STATUS_OBJECT_NAME_NOT_FOUND);
+
                             ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
                         }
 
@@ -3542,6 +3640,7 @@ AFSParseName( IN PIRP Irp,
             AFSReleaseResource( AFSGlobalRoot->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
         }
 
+
         //
         // Be sure we are starting from the correct volume
         //
@@ -3557,6 +3656,38 @@ AFSParseName( IN PIRP Irp,
             pVolumeCB = pDirEntry->ObjectInformation->VolumeCB;
 
             //
+            // Init our name array
+            //
+
+            pNameArray = AFSInitNameArray( AFSGlobalRoot->DirectoryCB,
+                                           0);
+
+            if( pNameArray == NULL)
+            {
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSParseName (%p) Failed to initialize name array\n",
+                              Irp);
+
+                try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+            }
+
+            ntStatus = AFSInsertNextElement( pNameArray,
+                                             pVolumeCB->DirectoryCB);
+
+            if ( ntStatus)
+            {
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSParseName (%p) Failed to insert name array element\n",
+                              Irp);
+
+                try_return( ntStatus);
+            }
+
+            //
             // In this case don't add back in the 'share' name since that is where we are
             // starting. Just put the leading slash back in
             //
@@ -3596,8 +3727,6 @@ AFSParseName( IN PIRP Irp,
                 //
                 // This is a root open so pass back no parent
                 //
-
-                *ParentDirectoryCB = NULL;
             }
         }
         else
@@ -3606,6 +3735,23 @@ AFSParseName( IN PIRP Irp,
             pVolumeCB = AFSGlobalRoot;
 
             //
+            // Init our name array
+            //
+
+            pNameArray = AFSInitNameArray( AFSGlobalRoot->DirectoryCB,
+                                           0);
+            if( pNameArray == NULL)
+            {
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSParseName (%p) Failed to initialize name array\n",
+                              Irp);
+
+                try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+            }
+
+            //
             // Add back in the 'share' portion of the name since we will parse it out on return
             //
 
@@ -3648,16 +3794,6 @@ AFSParseName( IN PIRP Irp,
             uniRemainingPath.Length += sizeof( WCHAR);
             uniRemainingPath.MaximumLength += sizeof( WCHAR);
 
-            lCount = InterlockedIncrement( &pVolumeCB->DirectoryCB->OpenReferenceCount);
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSParseName Increment6 count on %wZ DE %p Ccb %p Cnt %d\n",
-                          &pVolumeCB->DirectoryCB->NameInformation.FileName,
-                          pVolumeCB->DirectoryCB,
-                          NULL,
-                          lCount = pVolumeCB->DirectoryCB->OpenReferenceCount);
-
             //
             // Pass back the parent being the volume root
             //
@@ -3666,24 +3802,6 @@ AFSParseName( IN PIRP Irp,
         }
 
         //
-        // Init our name array
-        //
-
-        pNameArray = AFSInitNameArray( pVolumeCB->DirectoryCB,
-                                       0);
-
-        if( pNameArray == NULL)
-        {
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSParseName (%08lX) Failed to initialize name array\n",
-                          Irp);
-
-            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
-        }
-
-        //
         // Return the remaining portion as the file name
         //
 
@@ -3703,7 +3821,7 @@ AFSParseName( IN PIRP Irp,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSParseName Increment2 count on global volume %08lX Cnt %d\n",
+                      "AFSParseName Increment2 count on global volume %p Cnt %d\n",
                       pVolumeCB,
                       lCount);
 
@@ -3715,13 +3833,15 @@ try_exit:
             if( *ParentDirectoryCB != NULL)
             {
 
+                lCount = InterlockedIncrement( &(*ParentDirectoryCB)->DirOpenReferenceCount);
+
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSParseName Count on %wZ DE %p Ccb %p Cnt %d\n",
+                              "AFSParseName Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
                               &(*ParentDirectoryCB)->NameInformation.FileName,
-                              *ParentDirectoryCB,
+                              (*ParentDirectoryCB),
                               NULL,
-                              (*ParentDirectoryCB)->OpenReferenceCount);
+                              lCount);
             }
         }
 
@@ -3753,7 +3873,6 @@ AFSCheckCellName( IN GUID *AuthGroup,
     NTSTATUS ntStatus = STATUS_SUCCESS;
     UNICODE_STRING uniName;
     AFSDirEnumEntry *pDirEnumEntry = NULL;
-    AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     AFSDirHdr *pDirHdr = &AFSGlobalRoot->ObjectInformation.Specific.Directory.DirectoryNodeHdr;
     AFSDirectoryCB *pDirNode = NULL;
     UNICODE_STRING uniDirName, uniTargetName;
@@ -3826,7 +3945,7 @@ AFSCheckCellName( IN GUID *AuthGroup,
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_WARNING,
                           "AFSCheckCellName entry %wZ does not exist parent FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
-                          &CellName,
+                          CellName,
                           AFSGlobalRoot->ObjectInformation.FileId.Cell,
                           AFSGlobalRoot->ObjectInformation.FileId.Volume,
                           AFSGlobalRoot->ObjectInformation.FileId.Vnode,
@@ -3869,7 +3988,7 @@ AFSCheckCellName( IN GUID *AuthGroup,
 
             *ShareDirEntry = pVolumeCB->DirectoryCB;
 
-            lCount = InterlockedIncrement( &pVolumeCB->DirectoryCB->OpenReferenceCount);
+            lCount = InterlockedIncrement( &pVolumeCB->DirectoryCB->DirOpenReferenceCount);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
@@ -3880,6 +3999,12 @@ AFSCheckCellName( IN GUID *AuthGroup,
                           lCount);
 
             lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSCheckCellName Increment count on volume %p Cnt %d\n",
+                          pVolumeCB,
+                          lCount);
         }
         else
         {
@@ -3987,7 +4112,7 @@ AFSCheckCellName( IN GUID *AuthGroup,
                           AFSGlobalRoot->ObjectInformation.FileId.Vnode,
                           AFSGlobalRoot->ObjectInformation.FileId.Unique);
 
-            lCount = InterlockedIncrement( &pDirNode->OpenReferenceCount);
+            lCount = InterlockedIncrement( &pDirNode->DirOpenReferenceCount);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
@@ -4011,7 +4136,7 @@ try_exit:
         if( pDirEnumEntry != NULL)
         {
 
-            AFSExFreePool( pDirEnumEntry);
+            AFSExFreePoolWithTag( pDirEnumEntry, AFS_GENERIC_MEMORY_31_TAG);
         }
     }
 
@@ -4027,12 +4152,11 @@ AFSBuildMountPointTarget( IN GUID *AuthGroup,
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     AFSDirEnumEntry *pDirEntry = NULL;
-    AFSDirectoryCB *pDirNode = NULL;
-    UNICODE_STRING uniDirName, uniTargetName;
     ULONGLONG       ullIndex = 0;
     AFSVolumeCB *pVolumeCB = NULL;
     AFSFileID stTargetFileID;
     LONG lCount;
+    BOOLEAN bReleaseVolumeLock = FALSE;
 
     __Enter
     {
@@ -4135,7 +4259,7 @@ AFSBuildMountPointTarget( IN GUID *AuthGroup,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSBuildMountPointTarget Acquiring RDR VolumeTreeLock lock %08lX EXCL %08lX\n",
+                      "AFSBuildMountPointTarget Acquiring RDR VolumeTreeLock lock %p EXCL %08lX\n",
                       &pDevExt->Specific.RDR.VolumeTreeLock,
                       PsGetCurrentThread());
 
@@ -4187,40 +4311,46 @@ AFSBuildMountPointTarget( IN GUID *AuthGroup,
 
                 try_return( ntStatus);
             }
-        }
-        else
-        {
 
             //
-            // Check if this volume has been deleted or taken offline
+            // pVolumeCB->VolumeLock held exclusive and
+            // pVolumeCB->VolumeReferenceCount has been incremented
+            // pVolumeCB->RootFcb == NULL
             //
 
-            if( BooleanFlagOn( pVolumeCB->Flags, AFS_VOLUME_FLAGS_OFFLINE))
-            {
-
-                AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
-
-                try_return( ntStatus = STATUS_FILE_IS_OFFLINE);
-            }
+            bReleaseVolumeLock = TRUE;
+        }
+        else
+        {
 
             //
-            // Just to ensure that things don't get torn down AND we don't create a
-            // deadlock with invalidation
+            // AFSInitVolume returns with a VolumeReferenceCount
+            // obtain one to match
             //
 
             lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
 
-            AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
-
-            AFSAcquireExcl( pVolumeCB->VolumeLock,
-                            TRUE);
+            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSBuildMountPointTarget Increment count on volume %p Cnt %d\n",
+                          pVolumeCB,
+                          lCount);
 
-            lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+            AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
         }
 
         if( pVolumeCB->RootFcb == NULL)
         {
 
+            if ( bReleaseVolumeLock == FALSE)
+            {
+
+                AFSAcquireExcl( pVolumeCB->VolumeLock,
+                                TRUE);
+
+                bReleaseVolumeLock = TRUE;
+            }
+
             //
             // Initialize the root fcb for this volume
             //
@@ -4231,6 +4361,14 @@ AFSBuildMountPointTarget( IN GUID *AuthGroup,
             if( !NT_SUCCESS( ntStatus))
             {
 
+                lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSBuildMountPoint Decrement count on volume %p Cnt %d\n",
+                              pVolumeCB,
+                              lCount);
+
                 AFSReleaseResource( pVolumeCB->VolumeLock);
 
                 try_return( ntStatus);
@@ -4243,6 +4381,12 @@ AFSBuildMountPointTarget( IN GUID *AuthGroup,
             AFSReleaseResource( &pVolumeCB->RootFcb->NPFcb->Resource);
         }
 
+        if ( bReleaseVolumeLock == TRUE)
+        {
+
+            AFSReleaseResource( pVolumeCB->VolumeLock);
+        }
+
         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
                       "AFSBuildMountPointTarget Evaluated target of %wZ FID %08lX-%08lX-%08lX-%08lX as root volume\n",
@@ -4252,16 +4396,6 @@ AFSBuildMountPointTarget( IN GUID *AuthGroup,
                       pVolumeCB->ObjectInformation.FileId.Vnode,
                       pVolumeCB->ObjectInformation.FileId.Unique);
 
-        lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
-
-        AFSReleaseResource( pVolumeCB->VolumeLock);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSBuildMountPointTarget Increment count on volume %08lX Cnt %d\n",
-                      pVolumeCB,
-                      lCount);
-
         *TargetVolumeCB = pVolumeCB;
 
 try_exit:
@@ -4269,7 +4403,7 @@ try_exit:
         if( pDirEntry)
         {
 
-            AFSExFreePool( pDirEntry);
+            AFSExFreePoolWithTag( pDirEntry, AFS_GENERIC_MEMORY_2_TAG);
         }
     }
 
@@ -4284,11 +4418,10 @@ AFSBuildRootVolume( IN GUID *AuthGroup,
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
-    AFSDirectoryCB *pDirNode = NULL;
-    UNICODE_STRING uniDirName, uniTargetName;
     ULONGLONG       ullIndex = 0;
     AFSVolumeCB *pVolumeCB = NULL;
     LONG lCount;
+    BOOLEAN bReleaseVolumeLock = FALSE;
 
     __Enter
     {
@@ -4305,7 +4438,7 @@ AFSBuildRootVolume( IN GUID *AuthGroup,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSBuildRootVolume Acquiring RDR VolumeTreeLock lock %08lX EXCL %08lX\n",
+                      "AFSBuildRootVolume Acquiring RDR VolumeTreeLock lock %p EXCL %08lX\n",
                       &pDevExt->Specific.RDR.VolumeTreeLock,
                       PsGetCurrentThread());
 
@@ -4340,7 +4473,7 @@ AFSBuildRootVolume( IN GUID *AuthGroup,
             //
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE_2,
+                         AFS_TRACE_LEVEL_VERBOSE_2,
                           "AFSBuildRootVolume Initializing root for FID %08lX-%08lX-%08lX-%08lX\n",
                           FileId->Cell,
                           FileId->Volume,
@@ -4356,29 +4489,47 @@ AFSBuildRootVolume( IN GUID *AuthGroup,
 
                 try_return( ntStatus);
             }
+
+            //
+            // pVolumeCB->VolumeLock is held exclusive
+            // pVolumeCB->VolumeReferenceCount has been incremented
+            // pVolumeCB->RootFcb == NULL
+            //
+
+            bReleaseVolumeLock = TRUE;
         }
         else
         {
 
             //
-            // Just to ensure that things don't get torn down AND we don't create a
-            // deadlock with invalidation
+            // AFSInitVolume returns with a VolumeReferenceCount
+            // obtain one to match
             //
 
             lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
 
-            AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
-
-            AFSAcquireExcl( pVolumeCB->VolumeLock,
-                            TRUE);
+            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSBuildRootVolume Increment count on volume %p Cnt %d\n",
+                          pVolumeCB,
+                          lCount);
 
-            lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+            AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
         }
 
 
         if( pVolumeCB->RootFcb == NULL)
         {
 
+            if ( bReleaseVolumeLock == FALSE)
+            {
+
+                AFSAcquireExcl( pVolumeCB->VolumeLock,
+                                TRUE);
+
+                bReleaseVolumeLock = TRUE;
+            }
+
             //
             // Initialize the root fcb for this volume
             //
@@ -4389,6 +4540,14 @@ AFSBuildRootVolume( IN GUID *AuthGroup,
             if( !NT_SUCCESS( ntStatus))
             {
 
+                lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSBuildRootVolume Decrement count on volume %p Cnt %d\n",
+                              pVolumeCB,
+                              lCount);
+
                 AFSReleaseResource( pVolumeCB->VolumeLock);
 
                 try_return( ntStatus);
@@ -4401,6 +4560,12 @@ AFSBuildRootVolume( IN GUID *AuthGroup,
             AFSReleaseResource( &pVolumeCB->RootFcb->NPFcb->Resource);
         }
 
+        if ( bReleaseVolumeLock == TRUE)
+        {
+
+            AFSReleaseResource( pVolumeCB->VolumeLock);
+        }
+
         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
                       "AFSBuildRootVolume Evaluated target of %wZ FID %08lX-%08lX-%08lX-%08lX as root volume\n",
@@ -4410,16 +4575,6 @@ AFSBuildRootVolume( IN GUID *AuthGroup,
                       pVolumeCB->ObjectInformation.FileId.Vnode,
                       pVolumeCB->ObjectInformation.FileId.Unique);
 
-        lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
-
-        AFSReleaseResource( pVolumeCB->VolumeLock);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSBuildRootVolume Increment count on volume %08lX Cnt %d\n",
-                      pVolumeCB,
-                      lCount);
-
         *TargetVolumeCB = pVolumeCB;
 
 try_exit:
@@ -4440,6 +4595,7 @@ AFSProcessDFSLink( IN AFSDirectoryCB *DirEntry,
     NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
     UNICODE_STRING uniReparseName;
     UNICODE_STRING uniMUPDeviceName;
+    UNICODE_STRING uniIOMgrDeviceName;
     AFSDirEnumEntry *pDirEntry = NULL;
 
     __Enter
@@ -4452,6 +4608,9 @@ AFSProcessDFSLink( IN AFSDirectoryCB *DirEntry,
         RtlInitUnicodeString( &uniMUPDeviceName,
                               L"\\Device\\MUP");
 
+        RtlInitUnicodeString( &uniIOMgrDeviceName,
+                              L"\\??\\");
+
         uniReparseName.Length = 0;
         uniReparseName.Buffer = NULL;
 
@@ -4570,18 +4729,32 @@ AFSProcessDFSLink( IN AFSDirectoryCB *DirEntry,
         // Start building the name
         //
 
-        RtlCopyMemory( uniReparseName.Buffer,
-                       uniMUPDeviceName.Buffer,
-                       uniMUPDeviceName.Length);
+        if ( DirEntry->NameInformation.TargetName.Buffer[ 0] != L'\\' &&
+             DirEntry->NameInformation.TargetName.Buffer[ 1] == L':')
+        {
 
-        uniReparseName.Length = uniMUPDeviceName.Length;
+            RtlCopyMemory( uniReparseName.Buffer,
+                           uniIOMgrDeviceName.Buffer,
+                           uniIOMgrDeviceName.Length);
 
-        if( DirEntry->NameInformation.TargetName.Buffer[ 0] != L'\\')
+            uniReparseName.Length = uniIOMgrDeviceName.Length;
+        }
+        else
         {
 
-            uniReparseName.Buffer[ uniReparseName.Length/sizeof( WCHAR)] = L'\\';
+            RtlCopyMemory( uniReparseName.Buffer,
+                           uniMUPDeviceName.Buffer,
+                           uniMUPDeviceName.Length);
+
+            uniReparseName.Length = uniMUPDeviceName.Length;
 
-            uniReparseName.Length += sizeof( WCHAR);
+            if( DirEntry->NameInformation.TargetName.Buffer[ 0] != L'\\')
+            {
+
+                uniReparseName.Buffer[ uniReparseName.Length/sizeof( WCHAR)] = L'\\';
+
+                uniReparseName.Length += sizeof( WCHAR);
+            }
         }
 
         RtlCopyMemory( &uniReparseName.Buffer[ uniReparseName.Length/sizeof( WCHAR)],
@@ -4619,7 +4792,7 @@ AFSProcessDFSLink( IN AFSDirectoryCB *DirEntry,
         if( FileObject->FileName.Buffer != NULL)
         {
 
-            AFSExFreePool( FileObject->FileName.Buffer);
+            AFSExFreePoolWithTag( FileObject->FileName.Buffer, 0);
         }
 
         FileObject->FileName = uniReparseName;
@@ -4645,7 +4818,7 @@ try_exit:
         if ( pDirEntry)
         {
 
-            AFSExFreePool( pDirEntry);
+            AFSExFreePoolWithTag( pDirEntry, AFS_GENERIC_MEMORY_2_TAG);
         }
     }