Windows: Use AFSLibExAllocatePool for library local
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSCommSupport.cpp
index 1f684d0..c29dbc5 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
- * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Kernel Drivers, LLC.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013 Your File System, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * - Redistributions of source code must retain the above copyright notice,
  *   this list of conditions and the following disclaimer.
  * - Redistributions in binary form must reproduce the above copyright
- *   notice,
- *   this list of conditions and the following disclaimer in the
- *   documentation
- *   and/or other materials provided with the distribution.
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
  * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
  *   nor the names of their contributors may be used to endorse or promote
  *   products derived from this software without specific prior written
@@ -56,12 +54,19 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
     ULONG   ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
     ULONG ulCRC = 0;
     UNICODE_STRING uniGUID;
+    AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
 
     __Enter
     {
 
         ASSERT( ExIsResourceAcquiredExclusiveLite( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock));
 
+        if( BooleanFlagOn( ObjectInfoCB->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
+        {
+
+            try_return( ntStatus = STATUS_SUCCESS);
+        }
+
         uniGUID.Length = 0;
         uniGUID.MaximumLength = 0;
         uniGUID.Buffer = NULL;
@@ -72,14 +77,14 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                                &uniGUID);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSEnumerateDirectory Enumerating FID %08lX-%08lX-%08lX-%08lX AuthGroup %wZ\n",
                       ObjectInfoCB->FileId.Cell,
                       ObjectInfoCB->FileId.Volume,
                       ObjectInfoCB->FileId.Vnode,
                       ObjectInfoCB->FileId.Unique,
-                      &uniGUID);
+                      &uniGUID));
 
         if( AuthGroup != NULL)
         {
@@ -90,9 +95,9 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
         // Initialize the directory enumeration buffer for the directory
         //
 
-        pBuffer = AFSExAllocatePoolWithTag( PagedPool,
-                                            AFS_DIR_ENUM_BUFFER_LEN,
-                                            AFS_DIR_BUFFER_TAG);
+       pBuffer = AFSLibExAllocatePoolWithTag( PagedPool,
+                                              AFS_DIR_ENUM_BUFFER_LEN,
+                                              AFS_DIR_BUFFER_TAG);
 
         if( pBuffer == NULL)
         {
@@ -147,6 +152,8 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                                               AuthGroup,
                                               NULL,
                                               &ObjectInfoCB->FileId,
+                                              ObjectInfoCB->VolumeCB->VolumeInformation.Cell,
+                                              ObjectInfoCB->VolumeCB->VolumeInformation.CellLength,
                                               (void *)pDirQueryCB,
                                               sizeof( AFSDirQueryCB),
                                               pBuffer,
@@ -168,7 +175,7 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                     AFSAcquireExcl( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock,
                                     TRUE);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSEnumerateDirectory Directory Complete FID %08lX-%08lX-%08lX-%08lX Snapshot-DV %08lX:%08lX Current-DV %08lX:%08lX Status %08lX\n",
                                   ObjectInfoCB->FileId.Cell,
@@ -179,7 +186,7 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                                   pDirEnumResponse->SnapshotDataVersion.LowPart,
                                   pDirEnumResponse->CurrentDataVersion.HighPart,
                                   pDirEnumResponse->CurrentDataVersion.LowPart,
-                                  ntStatus);
+                                  ntStatus));
 
                     ObjectInfoCB->DataVersion = pDirEnumResponse->SnapshotDataVersion;
 
@@ -190,13 +197,13 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
 
                         ObjectInfoCB->DataVersion.QuadPart = (ULONGLONG)-1;
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSEnumerateDirectory Force Verify due to DV change during enumeration FID %08lX-%08lX-%08lX-%08lX\n",
                                       ObjectInfoCB->FileId.Cell,
                                       ObjectInfoCB->FileId.Volume,
                                       ObjectInfoCB->FileId.Vnode,
-                                      ObjectInfoCB->FileId.Unique);
+                                      ObjectInfoCB->FileId.Unique));
                     }
 
                     AFSReleaseResource( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock);
@@ -204,7 +211,7 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                 else
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSEnumerateDirectory Failed to enumerate directory FID %08lX-%08lX-%08lX-%08lX AuthGroup %wZ Status %08lX\n",
                                   ObjectInfoCB->FileId.Cell,
@@ -212,7 +219,7 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                                   ObjectInfoCB->FileId.Vnode,
                                   ObjectInfoCB->FileId.Unique,
                                   &uniGUID,
-                                  ntStatus);
+                                  ntStatus));
                 }
 
                 break;
@@ -222,7 +229,7 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
 
             pCurrentDirEntry = (AFSDirEnumEntry *)pDirEnumResponse->Entry;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSEnumerateDirectory Enumerating FID %08lX-%08lX-%08lX-%08lX Snapshot-DV %08lX:%08lX Current-DV %08lX:%08lX\n",
                           ObjectInfoCB->FileId.Cell,
@@ -232,7 +239,7 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                           pDirEnumResponse->SnapshotDataVersion.HighPart,
                           pDirEnumResponse->SnapshotDataVersion.LowPart,
                           pDirEnumResponse->CurrentDataVersion.HighPart,
-                          pDirEnumResponse->CurrentDataVersion.LowPart);
+                          pDirEnumResponse->CurrentDataVersion.LowPart));
 
             //
             // Remove the leading header from the processed length
@@ -303,12 +310,6 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                         if( pDirNode->ObjectInformation->DataVersion.QuadPart != pCurrentDirEntry->DataVersion.QuadPart)
                         {
 
-                            AFSInvalidateObject( &pDirNode->ObjectInformation,
-+                                                 AFS_INVALIDATE_DATA_VERSION);
-                        }
-                        else
-                        {
-
                             AFSUpdateMetaData( pDirNode,
                                                pCurrentDirEntry);
                         }
@@ -322,10 +323,11 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                         // Need to tear down this entry and rebuild it below
                         //
 
-                        if( pDirNode->OpenReferenceCount == 0)
+                        if( pDirNode->DirOpenReferenceCount <= 0 &&
+                            pDirNode->NameArrayReferenceCount <= 0)
                         {
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
                                           "AFSEnumerateDirectory Different FIDs - Deleting DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
                                           pDirNode,
@@ -337,17 +339,17 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                                           pCurrentDirEntry->FileId.Cell,
                                           pCurrentDirEntry->FileId.Volume,
                                           pCurrentDirEntry->FileId.Vnode,
-                                          pCurrentDirEntry->FileId.Unique);
+                                          pCurrentDirEntry->FileId.Unique));
 
                             AFSDeleteDirEntry( ObjectInfoCB,
-                                               pDirNode);
+                                               &pDirNode);
                         }
                         else
                         {
 
                             SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_DELETED);
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
                                           "AFSEnumerateDirectory Different FIDs - Removing DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
                                           pDirNode,
@@ -359,7 +361,7 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                                           pCurrentDirEntry->FileId.Cell,
                                           pCurrentDirEntry->FileId.Volume,
                                           pCurrentDirEntry->FileId.Vnode,
-                                          pCurrentDirEntry->FileId.Unique);
+                                          pCurrentDirEntry->FileId.Unique));
 
                             AFSRemoveNameEntry( ObjectInfoCB,
                                                 pDirNode);
@@ -389,14 +391,14 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                 if( pDirNode->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSEnumerateDirectory Setting VERIFY on entry %wZ for FID %08lX-%08lX-%08lX-%08lX\n",
                                   &uniDirName,
                                   pDirNode->ObjectInformation->FileId.Cell,
                                   pDirNode->ObjectInformation->FileId.Volume,
                                   pDirNode->ObjectInformation->FileId.Vnode,
-                                  pDirNode->ObjectInformation->FileId.Unique);
+                                  pDirNode->ObjectInformation->FileId.Unique));
 
                     AFSAcquireExcl( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
                                     TRUE);
@@ -420,7 +422,8 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                 // Init the short name if we have one
                 //
 
-                if( pCurrentDirEntry->ShortNameLength > 0)
+                if( !BooleanFlagOn( pDevExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+                    pCurrentDirEntry->ShortNameLength > 0)
                 {
 
                     UNICODE_STRING uniShortName;
@@ -447,7 +450,7 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                         pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
                                                                                            TRUE);
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSEnumerateDirectory Initialized short name %wZ for DE %p for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                       &uniShortName,
@@ -456,7 +459,7 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                                       pCurrentDirEntry->FileId.Cell,
                                       pCurrentDirEntry->FileId.Volume,
                                       pCurrentDirEntry->FileId.Vnode,
-                                      pCurrentDirEntry->FileId.Unique);
+                                      pCurrentDirEntry->FileId.Unique));
                     }
                     else
                     {
@@ -466,6 +469,15 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                                        (12 * sizeof( WCHAR)));
                     }
                 }
+                else
+                {
+
+                    //
+                    // No short name or short names are disabled
+                    //
+
+                    pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = 0;
+                }
 
                 //
                 // Insert the node into the name tree
@@ -476,20 +488,20 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
 
                     ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead = pDirNode;
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSEnumerateDirectory Insert DE %p to head of case sensitive tree for %wZ\n",
                                   pDirNode,
-                                  &pDirNode->NameInformation.FileName);
+                                  &pDirNode->NameInformation.FileName));
                 }
                 else
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSEnumerateDirectory Insert DE %p to case sensitive tree for %wZ\n",
                                   pDirNode,
-                                  &pDirNode->NameInformation.FileName);
+                                  &pDirNode->NameInformation.FileName));
 
                     if( !NT_SUCCESS( AFSInsertCaseSensitiveDirEntry( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
                                                                      pDirNode)))
@@ -500,7 +512,7 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                         //
 
                         AFSDeleteDirEntry( ObjectInfoCB,
-                                           pDirNode);
+                                           &pDirNode);
 
                         pCurrentDirEntry = (AFSDirEnumEntry *)((char *)pCurrentDirEntry + ulEntryLength);
 
@@ -522,11 +534,11 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                 if( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead == NULL)
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSEnumerateDirectory Insert DE %p to head of case insensitive tree for %wZ\n",
                                   pDirNode,
-                                  &pDirNode->NameInformation.FileName);
+                                  &pDirNode->NameInformation.FileName));
 
                     ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead = pDirNode;
 
@@ -535,11 +547,11 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                 else
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSEnumerateDirectory Insert DE %p to case insensitive tree for %wZ\n",
                                   pDirNode,
-                                  &pDirNode->NameInformation.FileName);
+                                  &pDirNode->NameInformation.FileName));
 
                     AFSInsertCaseInsensitiveDirEntry( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
                                                       pDirNode);
@@ -564,7 +576,7 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
 
                 InterlockedIncrement( &ObjectInfoCB->Specific.Directory.DirectoryNodeCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIR_NODE_COUNT,
+                AFSDbgTrace(( AFS_SUBSYSTEM_DIR_NODE_COUNT,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSEnumerateDirectory Adding entry %wZ Inc Count %d to parent FID %08lX-%08lX-%08lX-%08lX\n",
                               &pDirNode->NameInformation.FileName,
@@ -572,7 +584,7 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                               ObjectInfoCB->FileId.Cell,
                               ObjectInfoCB->FileId.Volume,
                               ObjectInfoCB->FileId.Vnode,
-                              ObjectInfoCB->FileId.Unique);
+                              ObjectInfoCB->FileId.Unique));
 
                 if( pDirNode->Type.Data.ShortNameTreeEntry.HashIndex != 0)
                 {
@@ -584,11 +596,11 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                     if( ObjectInfoCB->Specific.Directory.ShortNameTree == NULL)
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSEnumerateDirectory Insert DE %p to head of shortname tree for %wZ\n",
                                       pDirNode,
-                                      &pDirNode->NameInformation.FileName);
+                                      &pDirNode->NameInformation.FileName));
 
                         ObjectInfoCB->Specific.Directory.ShortNameTree = pDirNode;
 
@@ -602,11 +614,11 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                         {
                             SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
                                           "AFSEnumerateDirectory Insert DE %p to shortname tree for %wZ\n",
                                           pDirNode,
-                                          &pDirNode->NameInformation.FileName);
+                                          &pDirNode->NameInformation.FileName));
                         }
                     }
                 }
@@ -636,10 +648,10 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
 
             pDirQueryCB->EnumHandle = pDirEnumResponse->EnumHandle;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSEnumerateDirectory EnumHandle %08lX\n",
-                          pDirQueryCB->EnumHandle);
+                          pDirQueryCB->EnumHandle));
         }
 
 try_exit:
@@ -651,25 +663,30 @@ try_exit:
         if( pBuffer != NULL)
         {
 
-            AFSExFreePool( pBuffer);
+            AFSExFreePoolWithTag( pBuffer, AFS_DIR_BUFFER_TAG);
         }
 
-        //
-        // If the processing failed then we should reset the directory content in the event
-        // it is re-enumerated
-        //
+        if ( NT_SUCCESS( ntStatus))
+        {
 
-        if( !NT_SUCCESS( ntStatus))
+            SetFlag( ObjectInfoCB->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
+        }
+        else
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            //
+            // If the processing failed then we should reset the directory
+            // content in the event it is re-enumerated
+            //
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSEnumerateDirectory Resetting content for FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                           ObjectInfoCB->FileId.Cell,
                           ObjectInfoCB->FileId.Volume,
                           ObjectInfoCB->FileId.Vnode,
                           ObjectInfoCB->FileId.Unique,
-                          ntStatus);
+                          ntStatus));
 
             AFSResetDirectoryContent( ObjectInfoCB);
         }
@@ -701,6 +718,8 @@ AFSEnumerateDirectoryNoResponse( IN GUID *AuthGroup,
                                       AuthGroup,
                                       NULL,
                                       FileId,
+                                      NULL,
+                                      0,
                                       (void *)&stDirQueryCB,
                                       sizeof( AFSDirQueryCB),
                                       NULL,
@@ -718,10 +737,10 @@ AFSEnumerateDirectoryNoResponse( IN GUID *AuthGroup,
             else
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSEnumerateDirectoryNoResponse Failed to enumerate directory Status %08lX\n",
-                              ntStatus);
+                              ntStatus));
             }
         }
     }
@@ -748,6 +767,8 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
     AFSObjectInfoCB *pObjectInfo = NULL;
     ULONGLONG ullIndex = 0;
     UNICODE_STRING uniGUID;
+    LONG lCount;
+    AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
 
     __Enter
     {
@@ -764,14 +785,14 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                &uniGUID);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSVerifyDirectoryContent Verifying content for FID %08lX-%08lX-%08lX-%08lX AuthGroup %wZ\n",
                       ObjectInfoCB->FileId.Cell,
                       ObjectInfoCB->FileId.Volume,
                       ObjectInfoCB->FileId.Vnode,
                       ObjectInfoCB->FileId.Unique,
-                      &uniGUID);
+                      &uniGUID));
 
         if( AuthGroup != NULL)
         {
@@ -782,9 +803,9 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
         // Initialize the directory enumeration buffer for the directory
         //
 
-        pBuffer = AFSExAllocatePoolWithTag( PagedPool,
-                                            AFS_DIR_ENUM_BUFFER_LEN,
-                                            AFS_DIR_BUFFER_TAG);
+       pBuffer = AFSLibExAllocatePoolWithTag( PagedPool,
+                                              AFS_DIR_ENUM_BUFFER_LEN,
+                                              AFS_DIR_BUFFER_TAG);
 
         if( pBuffer == NULL)
         {
@@ -833,6 +854,8 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                               AuthGroup,
                                               NULL,
                                               &ObjectInfoCB->FileId,
+                                              ObjectInfoCB->VolumeCB->VolumeInformation.Cell,
+                                              ObjectInfoCB->VolumeCB->VolumeInformation.CellLength,
                                               (void *)pDirQueryCB,
                                               sizeof( AFSDirQueryCB),
                                               pBuffer,
@@ -852,7 +875,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                     AFSAcquireExcl( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock,
                                     TRUE);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSVerifyDirectoryContent Directory Complete FID %08lX-%08lX-%08lX-%08lX Snapshot-DV %08lX:%08lX Current-DV %08lX:%08lX Status %08lX\n",
                                   ObjectInfoCB->FileId.Cell,
@@ -863,7 +886,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                   pDirEnumResponse->SnapshotDataVersion.LowPart,
                                   pDirEnumResponse->CurrentDataVersion.HighPart,
                                   pDirEnumResponse->CurrentDataVersion.LowPart,
-                                  ntStatus);
+                                  ntStatus));
 
                     ntStatus = STATUS_SUCCESS;
 
@@ -874,13 +897,13 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
 
                         ObjectInfoCB->DataVersion.QuadPart = (ULONGLONG)-1;
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSVerifyDirectoryContent Force Verify due to DV change during enumeration FID %08lX-%08lX-%08lX-%08lX\n",
                                       ObjectInfoCB->FileId.Cell,
                                       ObjectInfoCB->FileId.Volume,
                                       ObjectInfoCB->FileId.Vnode,
-                                      ObjectInfoCB->FileId.Unique);
+                                      ObjectInfoCB->FileId.Unique));
                     }
                     else
                     {
@@ -893,7 +916,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                 else
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSVerifyDirectoryContent Failed to enumerate directory FID %08lX-%08lX-%08lX-%08lX AuthGroup %wZ Status %08lX\n",
                                   ObjectInfoCB->FileId.Cell,
@@ -901,7 +924,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                   ObjectInfoCB->FileId.Vnode,
                                   ObjectInfoCB->FileId.Unique,
                                   &uniGUID,
-                                  ntStatus);
+                                  ntStatus));
                 }
 
                 break;
@@ -911,7 +934,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
 
             pCurrentDirEntry = (AFSDirEnumEntry *)pDirEnumResponse->Entry;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSVerifyDirectoryContent EnumResponse FID %08lX-%08lX-%08lX-%08lX Snapshot-DV %08lX:%08lX Current-DV %08lX:%08lX\n",
                           ObjectInfoCB->FileId.Cell,
@@ -921,7 +944,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                           pDirEnumResponse->SnapshotDataVersion.HighPart,
                           pDirEnumResponse->SnapshotDataVersion.LowPart,
                           pDirEnumResponse->CurrentDataVersion.HighPart,
-                          pDirEnumResponse->CurrentDataVersion.LowPart);
+                          pDirEnumResponse->CurrentDataVersion.LowPart));
 
             //
             // Remove the leading header from the processed length
@@ -994,10 +1017,12 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
 
                         SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID);
 
+                        KeQueryTickCount( &ObjectInfoCB->LastAccessCount);
+
                         if( pCurrentDirEntry->ShortNameLength > 0 &&
                             pDirNode->NameInformation.ShortNameLength > 0)
                         {
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
                                           "AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name %S New short name %S\n",
                                           &uniDirName,
@@ -1007,13 +1032,13 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                           ObjectInfoCB->FileId.Vnode,
                                           ObjectInfoCB->FileId.Unique,
                                           pDirNode->NameInformation.ShortName,
-                                          pCurrentDirEntry->ShortName);
+                                          pCurrentDirEntry->ShortName));
                         }
                         else if( pCurrentDirEntry->ShortNameLength == 0 &&
                                  pDirNode->NameInformation.ShortNameLength > 0)
                         {
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
                                           "AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name %S New short name NULL\n",
                                           &uniDirName,
@@ -1022,12 +1047,12 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                           ObjectInfoCB->FileId.Volume,
                                           ObjectInfoCB->FileId.Vnode,
                                           ObjectInfoCB->FileId.Unique,
-                                          pDirNode->NameInformation.ShortName);
+                                          pDirNode->NameInformation.ShortName));
                         }
                         else if( pCurrentDirEntry->ShortNameLength > 0 &&
                                  pDirNode->NameInformation.ShortNameLength == 0)
                         {
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
                                           "AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name NULL New short name %S\n",
                                           &uniDirName,
@@ -1036,11 +1061,11 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                           ObjectInfoCB->FileId.Volume,
                                           ObjectInfoCB->FileId.Vnode,
                                           ObjectInfoCB->FileId.Unique,
-                                          pCurrentDirEntry->ShortName);
+                                          pCurrentDirEntry->ShortName));
                         }
                         else
                         {
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
                                           "AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name NULL New short name NULL\n",
                                           &uniDirName,
@@ -1048,7 +1073,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                           ObjectInfoCB->FileId.Cell,
                                           ObjectInfoCB->FileId.Volume,
                                           ObjectInfoCB->FileId.Vnode,
-                                          ObjectInfoCB->FileId.Unique);
+                                          ObjectInfoCB->FileId.Unique));
                         }
 
                         //
@@ -1058,12 +1083,6 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                         if( pObjectInfo->DataVersion.QuadPart != pCurrentDirEntry->DataVersion.QuadPart)
                         {
 
-                            AFSInvalidateObject( &pObjectInfo,
-                                                 AFS_INVALIDATE_DATA_VERSION);
-                        }
-                        else
-                        {
-
                             AFSUpdateMetaData( pDirNode,
                                                pCurrentDirEntry);
                         }
@@ -1093,7 +1112,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                     // File name matches but FileID does not.
                     //
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSVerifyDirectoryContent Processing dir entry %p %wZ with different FID, same name in parent FID %08lX-%08lX-%08lX-%08lX\n",
                                   pDirNode,
@@ -1101,16 +1120,17 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                   ObjectInfoCB->FileId.Cell,
                                   ObjectInfoCB->FileId.Volume,
                                   ObjectInfoCB->FileId.Vnode,
-                                  ObjectInfoCB->FileId.Unique);
+                                  ObjectInfoCB->FileId.Unique));
 
                     //
                     // Need to tear down this entry and rebuild it below
                     //
 
-                    if( pDirNode->OpenReferenceCount == 0)
+                    if( pDirNode->DirOpenReferenceCount <= 0 &&
+                        pDirNode->NameArrayReferenceCount <= 0)
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSVerifyDirectoryContent Different FIDs - Deleting DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
                                       pDirNode,
@@ -1122,17 +1142,17 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                       pCurrentDirEntry->FileId.Cell,
                                       pCurrentDirEntry->FileId.Volume,
                                       pCurrentDirEntry->FileId.Vnode,
-                                      pCurrentDirEntry->FileId.Unique);
+                                      pCurrentDirEntry->FileId.Unique));
 
                         AFSDeleteDirEntry( ObjectInfoCB,
-                                           pDirNode);
+                                           &pDirNode);
                     }
                     else
                     {
 
                         SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_DELETED);
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_WARNING,
                                       "AFSVerifyDirectoryContent Different FIDs - removing DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
                                       pDirNode,
@@ -1144,7 +1164,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                       pCurrentDirEntry->FileId.Cell,
                                       pCurrentDirEntry->FileId.Volume,
                                       pCurrentDirEntry->FileId.Vnode,
-                                      pCurrentDirEntry->FileId.Unique);
+                                      pCurrentDirEntry->FileId.Unique));
 
                         AFSRemoveNameEntry( ObjectInfoCB,
                                             pDirNode);
@@ -1153,14 +1173,14 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                 else
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSVerifyDirectoryContent New entry %wZ for parent FID %08lX-%08lX-%08lX-%08lX\n",
                                   &uniDirName,
                                   ObjectInfoCB->FileId.Cell,
                                   ObjectInfoCB->FileId.Volume,
                                   ObjectInfoCB->FileId.Vnode,
-                                  ObjectInfoCB->FileId.Unique);
+                                  ObjectInfoCB->FileId.Unique));
                 }
 
                 pDirNode = AFSInitDirEntry( ObjectInfoCB,
@@ -1183,14 +1203,14 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                 if( pDirNode->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSVerifyDirectoryContent Setting VERIFY on entry %wZ for FID %08lX-%08lX-%08lX-%08lX\n",
                                   &uniDirName,
                                   pDirNode->ObjectInformation->FileId.Cell,
                                   pDirNode->ObjectInformation->FileId.Volume,
                                   pDirNode->ObjectInformation->FileId.Vnode,
-                                  pDirNode->ObjectInformation->FileId.Unique);
+                                  pDirNode->ObjectInformation->FileId.Unique));
 
                     AFSAcquireExcl( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
                                     TRUE);
@@ -1206,7 +1226,8 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                 // Init the short name if we have one
                 //
 
-                if( pCurrentDirEntry->ShortNameLength > 0)
+                if( !BooleanFlagOn( pDevExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+                    pCurrentDirEntry->ShortNameLength > 0)
                 {
 
                     UNICODE_STRING uniShortName;
@@ -1233,7 +1254,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                         pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
                                                                                            TRUE);
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSVerifyDirectoryContent Initialized short name %wZ for DE %p for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                       &uniShortName,
@@ -1242,7 +1263,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                       pCurrentDirEntry->FileId.Cell,
                                       pCurrentDirEntry->FileId.Volume,
                                       pCurrentDirEntry->FileId.Vnode,
-                                      pCurrentDirEntry->FileId.Unique);
+                                      pCurrentDirEntry->FileId.Unique));
                     }
                     else
                     {
@@ -1255,15 +1276,11 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                 else
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSVerifyDirectoryContent NO short name for DE %p for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
-                                  pDirNode,
-                                  &pDirNode->NameInformation.FileName,
-                                  pCurrentDirEntry->FileId.Cell,
-                                  pCurrentDirEntry->FileId.Volume,
-                                  pCurrentDirEntry->FileId.Vnode,
-                                  pCurrentDirEntry->FileId.Unique);
+                    //
+                    // No short name or short names have been disabled
+                    //
+
+                    pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = 0;
                 }
 
                 //
@@ -1277,11 +1294,11 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
 
                     ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead = pDirNode;
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSVerifyDirectoryContent Insert DE %p to head of case sensitive tree for %wZ\n",
                                   pDirNode,
-                                  &pDirNode->NameInformation.FileName);
+                                  &pDirNode->NameInformation.FileName));
                 }
                 else
                 {
@@ -1289,18 +1306,18 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                     if( !NT_SUCCESS( AFSInsertCaseSensitiveDirEntry( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
                                                                      pDirNode)))
                     {
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSVerifyDirectoryContent Failed to insert DE %p to case sensitive tree for %wZ\n",
                                       pDirNode,
-                                      &pDirNode->NameInformation.FileName);
+                                      &pDirNode->NameInformation.FileName));
 
                         //
                         // Delete this dir entry and continue on
                         //
 
                         AFSDeleteDirEntry( ObjectInfoCB,
-                                           pDirNode);
+                                           &pDirNode);
 
                         pCurrentDirEntry = (AFSDirEnumEntry *)((char *)pCurrentDirEntry + ulEntryLength);
 
@@ -1317,11 +1334,11 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                     }
                     else
                     {
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSVerifyDirectoryContent Insert DE %p to case sensitive tree for %wZ\n",
                                       pDirNode,
-                                      &pDirNode->NameInformation.FileName);
+                                      &pDirNode->NameInformation.FileName));
                     }
                 }
 
@@ -1334,11 +1351,11 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
 
                     SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_CASE_INSENSTIVE_LIST_HEAD);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSVerifyDirectoryContent Insert DE %p to head of case insensitive tree for %wZ\n",
                                   pDirNode,
-                                  &pDirNode->NameInformation.FileName);
+                                  &pDirNode->NameInformation.FileName));
                 }
                 else
                 {
@@ -1346,11 +1363,11 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                     AFSInsertCaseInsensitiveDirEntry( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
                                                       pDirNode);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSVerifyDirectoryContent Insert DE %p to case insensitive tree for %wZ\n",
                                   pDirNode,
-                                  &pDirNode->NameInformation.FileName);
+                                  &pDirNode->NameInformation.FileName));
                 }
 
                 if( ObjectInfoCB->Specific.Directory.DirectoryNodeListHead == NULL)
@@ -1372,7 +1389,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
 
                 InterlockedIncrement( &ObjectInfoCB->Specific.Directory.DirectoryNodeCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIR_NODE_COUNT,
+                AFSDbgTrace(( AFS_SUBSYSTEM_DIR_NODE_COUNT,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSVerifyDirectoryContent Adding entry %wZ Inc Count %d to parent FID %08lX-%08lX-%08lX-%08lX\n",
                               &pDirNode->NameInformation.FileName,
@@ -1380,7 +1397,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                               ObjectInfoCB->FileId.Cell,
                               ObjectInfoCB->FileId.Volume,
                               ObjectInfoCB->FileId.Vnode,
-                              ObjectInfoCB->FileId.Unique);
+                              ObjectInfoCB->FileId.Unique));
 
                 if( pDirNode->Type.Data.ShortNameTreeEntry.HashIndex != 0)
                 {
@@ -1394,11 +1411,11 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
 
                         ObjectInfoCB->Specific.Directory.ShortNameTree = pDirNode;
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSVerifyDirectoryContent Insert DE %p to head of shortname tree for %wZ\n",
                                       pDirNode,
-                                      &pDirNode->NameInformation.FileName);
+                                      &pDirNode->NameInformation.FileName));
 
                         SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
                     }
@@ -1408,22 +1425,22 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                         if( !NT_SUCCESS( AFSInsertShortNameDirEntry( ObjectInfoCB->Specific.Directory.ShortNameTree,
                                                                      pDirNode)))
                         {
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
                                           "AFSVerifyDirectoryContent Failed to insert DE %p (%08lX) to shortname tree for %wZ\n",
                                           pDirNode,
                                           pDirNode->Type.Data.ShortNameTreeEntry.HashIndex,
-                                          &pDirNode->NameInformation.FileName);
+                                          &pDirNode->NameInformation.FileName));
                         }
                         else
                         {
                             SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
                                           "AFSVerifyDirectoryContent Insert DE %p to shortname tree for %wZ\n",
                                           pDirNode,
-                                          &pDirNode->NameInformation.FileName);
+                                          &pDirNode->NameInformation.FileName));
                         }
                     }
                 }
@@ -1465,7 +1482,7 @@ try_exit:
         if( pBuffer != NULL)
         {
 
-            AFSExFreePool( pBuffer);
+            AFSExFreePoolWithTag( pBuffer, AFS_DIR_BUFFER_TAG);
         }
     }
 
@@ -1488,11 +1505,16 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
     UNICODE_STRING uniTargetName;
     AFSDirectoryCB *pDirNode = NULL;
     ULONG     ulCRC = 0;
+    LONG       lCount;
     LARGE_INTEGER liOldDataVersion;
+    AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
+    BOOLEAN bReleaseParentTreeLock = FALSE;
 
     __Enter
     {
 
+        *DirNode = NULL;
+
         //
         // Init the control block for the request
         //
@@ -1514,9 +1536,9 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
         // Allocate our return buffer
         //
 
-        pResultCB = (AFSFileCreateResultCB *)AFSExAllocatePoolWithTag( PagedPool,
-                                                                       PAGE_SIZE,
-                                                                       AFS_GENERIC_MEMORY_1_TAG);
+       pResultCB = (AFSFileCreateResultCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+                                                                         PAGE_SIZE,
+                                                                         AFS_GENERIC_MEMORY_1_TAG);
 
         if( pResultCB == NULL)
         {
@@ -1538,6 +1560,8 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
                                       AuthGroup,
                                       FileName,
                                       NULL,
+                                      NULL,
+                                      0,
                                       &stCreateCB,
                                       sizeof( AFSFileCreateCB),
                                       pResultCB,
@@ -1565,10 +1589,12 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
         AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                         TRUE);
 
+        bReleaseParentTreeLock = TRUE;
+
         if( ParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_WARNING,
                           "AFSNotifyFileCreate Raced with an invalidate call and a re-enumeration for entry %wZ ParentFID %08lX-%08lX-%08lX-%08lX Version (%08lX:%08lX != %08lX:%08lX - 1)\n",
                           FileName,
@@ -1576,8 +1602,10 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
                           ParentObjectInfo->FileId.Volume,
                           ParentObjectInfo->FileId.Vnode,
                           ParentObjectInfo->FileId.Unique,
-                          ParentObjectInfo->DataVersion.QuadPart,
-                          pResultCB->ParentDataVersion.QuadPart);
+                          ParentObjectInfo->DataVersion.HighPart,
+                          ParentObjectInfo->DataVersion.LowPart,
+                          pResultCB->ParentDataVersion.HighPart,
+                          pResultCB->ParentDataVersion.LowPart));
 
             //
             // We raced so go and lookup the directory entry in the parent
@@ -1593,29 +1621,18 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
             if( pDirNode != NULL)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSNotifyFileCreate Located dir entry %p for file %wZ\n",
                               pDirNode,
-                              FileName);
+                              FileName));
 
                 if ( AFSIsEqualFID( &pDirNode->ObjectInformation->FileId,
                                     &pResultCB->DirEnum.FileId))
                 {
 
-                    InterlockedIncrement( &pDirNode->OpenReferenceCount);
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSNotifyFileCreate Increment count on %wZ DE %p Cnt %d\n",
-                                  &pDirNode->NameInformation.FileName,
-                                  pDirNode,
-                                  pDirNode->OpenReferenceCount);
-
                     *DirNode = pDirNode;
 
-                    AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
                     try_return( ntStatus = STATUS_REPARSE);
                 }
                 else
@@ -1626,7 +1643,7 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
                     // same as the one that was created for us by the file server.
                     //
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSNotifyFileCreate Found matching name entry %wZ DE %p FID %08lX-%08lX-%08lX-%08lX != FID %08lX-%08lX-%08lX-%08lX\n",
                                   FileName,
@@ -1638,12 +1655,13 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
                                   pResultCB->DirEnum.FileId.Cell,
                                   pResultCB->DirEnum.FileId.Volume,
                                   pResultCB->DirEnum.FileId.Vnode,
-                                  pResultCB->DirEnum.FileId.Unique);
+                                  pResultCB->DirEnum.FileId.Unique));
 
-                    if( pDirNode->OpenReferenceCount == 0)
+                    if( pDirNode->DirOpenReferenceCount <= 0 &&
+                        pDirNode->NameArrayReferenceCount <= 0)
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSNotifyFileCreate Different FIDs - Deleting DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
                                       pDirNode,
@@ -1655,17 +1673,17 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
                                       pResultCB->DirEnum.FileId.Cell,
                                       pResultCB->DirEnum.FileId.Volume,
                                       pResultCB->DirEnum.FileId.Vnode,
-                                      pResultCB->DirEnum.FileId.Unique);
+                                      pResultCB->DirEnum.FileId.Unique));
 
                         AFSDeleteDirEntry( ParentObjectInfo,
-                                           pDirNode);
+                                           &pDirNode);
                     }
                     else
                     {
 
                         SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_DELETED);
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSNotifyFileCreate Different FIDs - Removing DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
                                       pDirNode,
@@ -1677,7 +1695,7 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
                                       pResultCB->DirEnum.FileId.Cell,
                                       pResultCB->DirEnum.FileId.Volume,
                                       pResultCB->DirEnum.FileId.Vnode,
-                                      pResultCB->DirEnum.FileId.Unique);
+                                      pResultCB->DirEnum.FileId.Unique));
 
                         AFSRemoveNameEntry( ParentObjectInfo,
                                             pDirNode);
@@ -1697,10 +1715,10 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
             ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSNotifyFileCreate Creating new entry %wZ\n",
-                      FileName);
+                      FileName));
 
         //
         // Initialize the directory entry
@@ -1725,8 +1743,6 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
 
             ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
 
-            AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
@@ -1734,7 +1750,8 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
         // Init the short name if we have one
         //
 
-        if( pResultCB->DirEnum.ShortNameLength > 0)
+        if( !BooleanFlagOn( pDevExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+            pResultCB->DirEnum.ShortNameLength > 0)
         {
 
             UNICODE_STRING uniShortName;
@@ -1755,12 +1772,20 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
             pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
                                                                                TRUE);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSNotifyFileCreate Initialized short name %wZ for DE %p for %wZ\n",
                           &uniShortName,
                           pDirNode,
-                          &pDirNode->NameInformation.FileName);
+                          &pDirNode->NameInformation.FileName));
+        }
+        else
+        {
+            //
+            // No short name or short names are disabled
+            //
+
+            pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = 0;
         }
 
         if ( !BooleanFlagOn( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY))
@@ -1772,7 +1797,7 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
 
             ParentObjectInfo->DataVersion = pResultCB->ParentDataVersion;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSNotifyFileCreate entry %wZ ParentFID %08lX-%08lX-%08lX-%08lX Version %08lX:%08lX\n",
                           FileName,
@@ -1780,11 +1805,9 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
                           ParentObjectInfo->FileId.Volume,
                           ParentObjectInfo->FileId.Vnode,
                           ParentObjectInfo->FileId.Unique,
-                          ParentObjectInfo->DataVersion.QuadPart);
+                          ParentObjectInfo->DataVersion.QuadPart));
         }
 
-        AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
         //
         // Return the directory node
         //
@@ -1793,10 +1816,31 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
 
 try_exit:
 
+        if ( *DirNode != NULL)
+        {
+
+            lCount = InterlockedIncrement( &(*DirNode)->DirOpenReferenceCount);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSNotifyFileCreate Increment count on %wZ DE %p Cnt %d\n",
+                          &(*DirNode)->NameInformation.FileName,
+                          *DirNode,
+                          lCount));
+
+            ASSERT( lCount >= 0);
+        }
+
+        if ( bReleaseParentTreeLock)
+        {
+
+            AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+        }
+
         if( pResultCB != NULL)
         {
 
-            AFSExFreePool( pResultCB);
+            AFSExFreePoolWithTag( pResultCB, AFS_GENERIC_MEMORY_1_TAG);
         }
     }
 
@@ -1810,7 +1854,6 @@ AFSUpdateFileInformation( IN AFSFileID *ParentFid,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     AFSFileUpdateCB stUpdateCB;
     ULONG ulResultLen = 0;
     AFSFileUpdateResultCB *pUpdateResultCB = NULL;
@@ -1841,9 +1884,9 @@ AFSUpdateFileInformation( IN AFSFileID *ParentFid,
 
         stUpdateCB.LastWriteTime = ObjectInfo->LastWriteTime;
 
-        pUpdateResultCB = (AFSFileUpdateResultCB *)AFSExAllocatePoolWithTag( PagedPool,
-                                                                             PAGE_SIZE,
-                                                                             AFS_UPDATE_RESULT_TAG);
+       pUpdateResultCB = (AFSFileUpdateResultCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+                                                                               PAGE_SIZE,
+                                                                               AFS_UPDATE_RESULT_TAG);
 
         if( pUpdateResultCB == NULL)
         {
@@ -1858,6 +1901,8 @@ AFSUpdateFileInformation( IN AFSFileID *ParentFid,
                                       AuthGroup,
                                       NULL,
                                       &ObjectInfo->FileId,
+                                      ObjectInfo->VolumeCB->VolumeInformation.Cell,
+                                      ObjectInfo->VolumeCB->VolumeInformation.CellLength,
                                       &stUpdateCB,
                                       sizeof( AFSFileUpdateCB),
                                       pUpdateResultCB,
@@ -1866,14 +1911,14 @@ AFSUpdateFileInformation( IN AFSFileID *ParentFid,
         if( ntStatus != STATUS_SUCCESS)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSUpdateFileInformation failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                           ObjectInfo->FileId.Cell,
                           ObjectInfo->FileId.Volume,
                           ObjectInfo->FileId.Vnode,
                           ObjectInfo->FileId.Unique,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1898,7 +1943,7 @@ try_exit:
         if( pUpdateResultCB != NULL)
         {
 
-            AFSExFreePool( pUpdateResultCB);
+            AFSExFreePoolWithTag( pUpdateResultCB, AFS_UPDATE_RESULT_TAG);
         }
     }
 
@@ -1915,11 +1960,19 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
     AFSFileDeleteCB stDelete;
     AFSFileDeleteResultCB stDeleteResult;
     ULONG ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
+    AFSObjectInfoCB *pObjectInfo = NULL;
+    AFSObjectInfoCB *pParentObjectInfo = NULL;
 
     __Enter
     {
 
-        stDelete.ParentId = DirectoryCB->ObjectInformation->ParentObjectInformation->FileId;
+        pObjectInfo = DirectoryCB->ObjectInformation;
+
+        pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+                                               &pObjectInfo->ParentFileId,
+                                               FALSE);
+
+        stDelete.ParentId = pObjectInfo->ParentFileId;
 
         stDelete.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
 
@@ -1934,7 +1987,9 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
                                       ulRequestFlags,
                                       AuthGroup,
                                       &DirectoryCB->NameInformation.FileName,
-                                      &DirectoryCB->ObjectInformation->FileId,
+                                      &pObjectInfo->FileId,
+                                      pObjectInfo->VolumeCB->VolumeInformation.Cell,
+                                      pObjectInfo->VolumeCB->VolumeInformation.CellLength,
                                       &stDelete,
                                       sizeof( AFSFileDeleteCB),
                                       &stDeleteResult,
@@ -1943,7 +1998,7 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
         if( ntStatus != STATUS_SUCCESS)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSNotifyDelete failed ParentFID %08lX-%08lX-%08lX-%08lX %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                           stDelete.ParentId.Cell,
@@ -1951,16 +2006,16 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
                           stDelete.ParentId.Vnode,
                           stDelete.ParentId.Unique,
                           &DirectoryCB->NameInformation.FileName,
-                          DirectoryCB->ObjectInformation->FileId.Cell,
-                          DirectoryCB->ObjectInformation->FileId.Volume,
-                          DirectoryCB->ObjectInformation->FileId.Vnode,
-                          DirectoryCB->ObjectInformation->FileId.Unique,
-                          ntStatus);
+                          pObjectInfo->FileId.Cell,
+                          pObjectInfo->FileId.Volume,
+                          pObjectInfo->FileId.Vnode,
+                          pObjectInfo->FileId.Unique,
+                          ntStatus));
 
             try_return( ntStatus);
         }
 
-        AFSAcquireExcl( DirectoryCB->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+        AFSAcquireExcl( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                         TRUE);
 
         if( CheckOnly)
@@ -1970,12 +2025,12 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
             // Validate the parent data version
             //
 
-            if( DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart)
+            if( pParentObjectInfo->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart)
             {
 
-                SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+                pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
             }
         }
         else
@@ -1985,12 +2040,12 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
             // Update the parent data version
             //
 
-            if( DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart - 1)
+            if( pParentObjectInfo->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart - 1)
             {
 
-                SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+                pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
             }
             else
             {
@@ -2000,39 +2055,50 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
                 // Directory data version number can be updated.  Until then we must force
                 // a verification.
                 //
-                // DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = stDeleteResult.ParentDataVersion.QuadPart;
+                // pParentObjectInfor->DataVersion.QuadPart = stDeleteResult.ParentDataVersion.QuadPart;
                 //
 
-                SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+                pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
             }
         }
 
-        AFSReleaseResource( DirectoryCB->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+        AFSReleaseResource( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
 
 try_exit:
 
-        NOTHING;
+        if ( pParentObjectInfo)
+        {
+
+            AFSReleaseObjectInfo( &pParentObjectInfo);
+        }
     }
 
     return ntStatus;
 }
 
+
 NTSTATUS
-AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
-                 IN GUID            *AuthGroup,
-                 IN AFSObjectInfoCB *ParentObjectInfo,
-                 IN AFSObjectInfoCB *TargetParentObjectInfo,
-                 IN AFSDirectoryCB *DirectoryCB,
-                 IN UNICODE_STRING *TargetName,
-                 OUT AFSFileID  *UpdatedFID)
+AFSNotifyHardLink( IN AFSObjectInfoCB *ObjectInfo,
+                   IN GUID            *AuthGroup,
+                   IN AFSObjectInfoCB *ParentObjectInfo,
+                   IN AFSObjectInfoCB *TargetParentObjectInfo,
+                   IN AFSDirectoryCB  *SourceDirectoryCB,
+                   IN UNICODE_STRING  *TargetName,
+                   IN BOOLEAN          bReplaceIfExists,
+                   OUT AFSDirectoryCB **TargetDirectoryCB)
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSFileRenameCB *pRenameCB = NULL;
-    AFSFileRenameResultCB *pRenameResultCB = NULL;
+    AFSFileHardLinkCB *pHardLinkCB = NULL;
+    AFSFileHardLinkResultCB *pResultCB = NULL;
     ULONG ulResultLen = 0;
+    AFSDirectoryCB *pDirNode = NULL;
+    ULONG     ulCRC = 0;
+    BOOLEAN bReleaseParentLock = FALSE, bReleaseTargetParentLock = FALSE;
+    AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
+    LONG lCount;
 
     __Enter
     {
@@ -2041,58 +2107,62 @@ AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
         // Init the control block for the request
         //
 
-        pRenameCB = (AFSFileRenameCB *)AFSExAllocatePoolWithTag( PagedPool,
-                                                                 PAGE_SIZE,
-                                                                 AFS_RENAME_REQUEST_TAG);
+       pHardLinkCB = (AFSFileHardLinkCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+                                                                       PAGE_SIZE,
+                                                                       AFS_HARDLINK_REQUEST_TAG);
 
-        if( pRenameCB == NULL)
+        if( pHardLinkCB == NULL)
         {
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
-        RtlZeroMemory( pRenameCB,
+        RtlZeroMemory( pHardLinkCB,
                        PAGE_SIZE);
 
-        pRenameCB->SourceParentId = ParentObjectInfo->FileId;
+        pHardLinkCB->SourceParentId = ParentObjectInfo->FileId;
 
-        pRenameCB->TargetParentId = TargetParentObjectInfo->FileId;
+        pHardLinkCB->TargetParentId = TargetParentObjectInfo->FileId;
 
-        pRenameCB->TargetNameLength = TargetName->Length;
+        pHardLinkCB->TargetNameLength = TargetName->Length;
 
-        RtlCopyMemory( pRenameCB->TargetName,
+        RtlCopyMemory( pHardLinkCB->TargetName,
                        TargetName->Buffer,
                        TargetName->Length);
 
+        pHardLinkCB->bReplaceIfExists = bReplaceIfExists;
+
         //
         // Use the same buffer for the result control block
         //
 
-        pRenameResultCB = (AFSFileRenameResultCB *)pRenameCB;
+        pResultCB = (AFSFileHardLinkResultCB *)pHardLinkCB;
 
         ulResultLen = PAGE_SIZE;
 
-        ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_RENAME_FILE,
+        ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_HARDLINK_FILE,
                                       AFS_REQUEST_FLAG_SYNCHRONOUS,
                                       AuthGroup,
-                                      &DirectoryCB->NameInformation.FileName,
+                                      &SourceDirectoryCB->NameInformation.FileName,
                                       &ObjectInfo->FileId,
-                                      pRenameCB,
-                                      sizeof( AFSFileRenameCB) + TargetName->Length,
-                                      pRenameResultCB,
+                                      ObjectInfo->VolumeCB->VolumeInformation.Cell,
+                                      ObjectInfo->VolumeCB->VolumeInformation.CellLength,
+                                      pHardLinkCB,
+                                      sizeof( AFSFileHardLinkCB) + TargetName->Length,
+                                      pResultCB,
                                       &ulResultLen);
 
         if( ntStatus != STATUS_SUCCESS)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSNotifyRename failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                          "AFSNotifyHardLink failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                           ObjectInfo->FileId.Cell,
                           ObjectInfo->FileId.Volume,
                           ObjectInfo->FileId.Vnode,
                           ObjectInfo->FileId.Unique,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2101,151 +2171,539 @@ AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
         // Update the information from the returned data
         //
 
-        AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
-                        TRUE);
-
-        if ( ParentObjectInfo->DataVersion.QuadPart == pRenameResultCB->SourceParentDataVersion.QuadPart - 1)
-        {
-
-            ParentObjectInfo->DataVersion = pRenameResultCB->SourceParentDataVersion;
-        }
-        else
+        if ( ParentObjectInfo != TargetParentObjectInfo)
         {
 
-            SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
-
-            ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
-        }
+            AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                            TRUE);
 
-        if ( ParentObjectInfo != TargetParentObjectInfo)
-        {
+            bReleaseParentLock = TRUE;
 
-            if ( TargetParentObjectInfo->DataVersion.QuadPart == pRenameResultCB->TargetParentDataVersion.QuadPart - 1)
+            if ( ParentObjectInfo->DataVersion.QuadPart == pResultCB->SourceParentDataVersion.QuadPart - 1)
             {
 
-                TargetParentObjectInfo->DataVersion = pRenameResultCB->TargetParentDataVersion;
+                ParentObjectInfo->DataVersion = pResultCB->SourceParentDataVersion;
             }
             else
             {
 
-                SetFlag( TargetParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                TargetParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+                ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
             }
         }
 
-        //
-        // Move over the short name
-        //
+        AFSAcquireExcl( TargetParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                        TRUE);
 
-        DirectoryCB->NameInformation.ShortNameLength = pRenameResultCB->DirEnum.ShortNameLength;
+        bReleaseTargetParentLock = TRUE;
 
-        if( DirectoryCB->NameInformation.ShortNameLength > 0)
+        if ( TargetParentObjectInfo->DataVersion.QuadPart == pResultCB->TargetParentDataVersion.QuadPart - 1)
         {
 
-            UNICODE_STRING uniShortName;
-
-            uniShortName.Length = DirectoryCB->NameInformation.ShortNameLength;
-            uniShortName.MaximumLength = uniShortName.Length;
-            uniShortName.Buffer = DirectoryCB->NameInformation.ShortName;
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSNotifyRename Update old short name %wZ for DE %p for %wZ\n",
-                          &uniShortName,
-                          DirectoryCB,
-                          &DirectoryCB->NameInformation.FileName);
-
-            DirectoryCB->NameInformation.ShortNameLength = pRenameResultCB->DirEnum.ShortNameLength;
-
-            RtlCopyMemory( DirectoryCB->NameInformation.ShortName,
-                           pRenameResultCB->DirEnum.ShortName,
-                           DirectoryCB->NameInformation.ShortNameLength);
-
-            uniShortName.Length = DirectoryCB->NameInformation.ShortNameLength;
-            uniShortName.MaximumLength = uniShortName.Length;
-            uniShortName.Buffer = DirectoryCB->NameInformation.ShortName;
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSNotifyRename Initialized short name %wZ for DE %p for %wZ\n",
-                          &uniShortName,
-                          DirectoryCB,
-                          &DirectoryCB->NameInformation.FileName);
+            TargetParentObjectInfo->DataVersion = pResultCB->TargetParentDataVersion;
         }
         else
         {
 
-            UNICODE_STRING uniShortName;
-
-            uniShortName.Length = DirectoryCB->NameInformation.ShortNameLength;
-            uniShortName.MaximumLength = uniShortName.Length;
-            uniShortName.Buffer = DirectoryCB->NameInformation.ShortName;
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_WARNING,
+                          "AFSNotifyHardLink Raced with an invalidate call and a re-enumeration for entry %wZ ParentFID %08lX-%08lX-%08lX-%08lX Version (%08lX:%08lX != %08lX:%08lX - 1)\n",
+                          TargetName,
+                          TargetParentObjectInfo->FileId.Cell,
+                          TargetParentObjectInfo->FileId.Volume,
+                          TargetParentObjectInfo->FileId.Vnode,
+                          TargetParentObjectInfo->FileId.Unique,
+                          TargetParentObjectInfo->DataVersion.HighPart,
+                          TargetParentObjectInfo->DataVersion.LowPart,
+                          pResultCB->TargetParentDataVersion.HighPart,
+                          pResultCB->TargetParentDataVersion.LowPart));
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSNotifyRename Removing old short name %wZ for DE %p for %wZ\n",
-                          &uniShortName,
-                          DirectoryCB,
-                          &DirectoryCB->NameInformation.FileName);
+            //
+            // We raced so go and lookup the directory entry in the parent
+            //
 
-            DirectoryCB->NameInformation.ShortNameLength = 0;
+            ulCRC = AFSGenerateCRC( TargetName,
+                                    FALSE);
 
-            DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = 0;
-        }
+            AFSLocateCaseSensitiveDirEntry( TargetParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
+                                            ulCRC,
+                                            &pDirNode);
 
-        AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+            if( pDirNode != NULL)
+            {
 
-        if( UpdatedFID != NULL)
-        {
-            *UpdatedFID = pRenameResultCB->DirEnum.FileId;
-        }
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSNotifyHardLink Located dir entry %p for file %wZ\n",
+                              pDirNode,
+                              TargetName));
 
-try_exit:
+                if ( AFSIsEqualFID( &pDirNode->ObjectInformation->FileId,
+                                    &pResultCB->DirEnum.FileId))
+                {
 
-        if( pRenameCB != NULL)
-        {
+                    try_return( ntStatus = STATUS_REPARSE);
+                }
+                else
+                {
 
-            AFSExFreePool( pRenameCB);
-        }
-    }
+                    //
+                    // We found an entry that matches the desired name but it is not the
+                    // same as the one that was created for us by the file server.
+                    //
 
-    return ntStatus;
-}
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                  AFS_TRACE_LEVEL_ERROR,
+                                  "AFSNotifyHardLink Found matching name entry %wZ DE %p FID %08lX-%08lX-%08lX-%08lX != FID %08lX-%08lX-%08lX-%08lX\n",
+                                  TargetName,
+                                  pDirNode,
+                                  pDirNode->ObjectInformation->FileId.Cell,
+                                  pDirNode->ObjectInformation->FileId.Volume,
+                                  pDirNode->ObjectInformation->FileId.Vnode,
+                                  pDirNode->ObjectInformation->FileId.Unique,
+                                  pResultCB->DirEnum.FileId.Cell,
+                                  pResultCB->DirEnum.FileId.Volume,
+                                  pResultCB->DirEnum.FileId.Vnode,
+                                  pResultCB->DirEnum.FileId.Unique));
 
-NTSTATUS
-AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
-                       IN GUID *AuthGroup,
-                       IN BOOLEAN FastCall,
-                       OUT AFSDirEnumEntry **DirEnumEntry)
-{
+                    if( pDirNode->DirOpenReferenceCount <= 0 &&
+                        pDirNode->NameArrayReferenceCount <= 0)
+                    {
 
-    NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSEvalTargetCB stTargetID;
-    ULONG ulResultBufferLength;
-    AFSFileEvalResultCB *pEvalResultCB = NULL;
-    AFSDirEnumEntry *pDirEnumCB = NULL;
-    ULONG ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                      AFS_TRACE_LEVEL_VERBOSE,
+                                      "AFSNotifyHardLink Different FIDs - Deleting DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
+                                      pDirNode,
+                                      &pDirNode->NameInformation.FileName,
+                                      pDirNode->ObjectInformation->FileId.Cell,
+                                      pDirNode->ObjectInformation->FileId.Volume,
+                                      pDirNode->ObjectInformation->FileId.Vnode,
+                                      pDirNode->ObjectInformation->FileId.Unique,
+                                      pResultCB->DirEnum.FileId.Cell,
+                                      pResultCB->DirEnum.FileId.Volume,
+                                      pResultCB->DirEnum.FileId.Vnode,
+                                      pResultCB->DirEnum.FileId.Unique));
 
-    __Enter
-    {
+                        AFSDeleteDirEntry( TargetParentObjectInfo,
+                                           &pDirNode);
+                    }
+                    else
+                    {
 
-        RtlZeroMemory( &stTargetID,
-                       sizeof( AFSEvalTargetCB));
+                        SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_DELETED);
 
-        if( ObjectInfo->ParentObjectInformation != NULL)
-        {
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                      AFS_TRACE_LEVEL_VERBOSE,
+                                      "AFSNotifyHardLink Different FIDs - Removing DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
+                                      pDirNode,
+                                      &pDirNode->NameInformation.FileName,
+                                      pDirNode->ObjectInformation->FileId.Cell,
+                                      pDirNode->ObjectInformation->FileId.Volume,
+                                      pDirNode->ObjectInformation->FileId.Vnode,
+                                      pDirNode->ObjectInformation->FileId.Unique,
+                                      pResultCB->DirEnum.FileId.Cell,
+                                      pResultCB->DirEnum.FileId.Volume,
+                                      pResultCB->DirEnum.FileId.Vnode,
+                                      pResultCB->DirEnum.FileId.Unique));
 
-            stTargetID.ParentId = ObjectInfo->ParentObjectInformation->FileId;
-        }
+                        AFSRemoveNameEntry( TargetParentObjectInfo,
+                                            pDirNode);
+                    }
+
+                    pDirNode = NULL;
+                }
+            }
+
+            //
+            // We are unsure of our current data so set the verify flag. It may already be set
+            // but no big deal to reset it
+            //
+
+            SetFlag( TargetParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+            TargetParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+        }
+
+        //
+        // Create the hard link entry
+        //
+
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSNotifyHardLink Creating new entry %wZ\n",
+                      TargetName));
+
+        //
+        // Initialize the directory entry
+        //
+
+        pDirNode = AFSInitDirEntry( TargetParentObjectInfo,
+                                    TargetName,
+                                    NULL,
+                                    &pResultCB->DirEnum,
+                                    (ULONG)InterlockedIncrement( &TargetParentObjectInfo->Specific.Directory.DirectoryNodeHdr.ContentIndex));
+
+        if( pDirNode == NULL)
+        {
+
+            SetFlag( TargetParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+            TargetParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+
+            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+        }
+
+        //
+        // Init the short name if we have one
+        //
+
+        if( !BooleanFlagOn( pDevExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+            pResultCB->DirEnum.ShortNameLength > 0)
+        {
+
+            UNICODE_STRING uniShortName;
+
+            pDirNode->NameInformation.ShortNameLength = pResultCB->DirEnum.ShortNameLength;
+
+            RtlCopyMemory( pDirNode->NameInformation.ShortName,
+                           pResultCB->DirEnum.ShortName,
+                           pDirNode->NameInformation.ShortNameLength);
+
+            //
+            // Generate the short name index
+            //
+
+            uniShortName.Length = pDirNode->NameInformation.ShortNameLength;
+            uniShortName.Buffer = pDirNode->NameInformation.ShortName;
+
+            pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
+                                                                               TRUE);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSNotifyHardLink Initialized short name %wZ for DE %p for %wZ\n",
+                          &uniShortName,
+                          pDirNode,
+                          &pDirNode->NameInformation.FileName));
+        }
+        else
+        {
+            //
+            // No short name or short names are disabled
+            //
+
+            pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = 0;
+        }
+
+        if ( !BooleanFlagOn( TargetParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY))
+        {
+
+            //
+            // Update the target parent data version
+            //
+
+            TargetParentObjectInfo->DataVersion = pResultCB->TargetParentDataVersion;
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSNotifyHardLink entry %wZ ParentFID %08lX-%08lX-%08lX-%08lX Version %08lX:%08lX\n",
+                          TargetName,
+                          TargetParentObjectInfo->FileId.Cell,
+                          TargetParentObjectInfo->FileId.Volume,
+                          TargetParentObjectInfo->FileId.Vnode,
+                          TargetParentObjectInfo->FileId.Unique,
+                          TargetParentObjectInfo->DataVersion.QuadPart));
+        }
+
+try_exit:
+
+        if ( TargetDirectoryCB != NULL)
+        {
+
+            lCount = InterlockedIncrement( &pDirNode->DirOpenReferenceCount);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSNotifyHardLink Increment count on %wZ DE %p Cnt %d\n",
+                          &pDirNode->NameInformation.FileName,
+                          pDirNode,
+                          lCount));
+
+            ASSERT( lCount >= 0);
+
+            *TargetDirectoryCB = pDirNode;
+        }
+
+        if ( bReleaseTargetParentLock)
+        {
+
+            AFSReleaseResource( TargetParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+        }
+
+        if ( bReleaseParentLock)
+        {
+
+            AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+        }
+
+        if( pHardLinkCB != NULL)
+        {
+
+            AFSExFreePoolWithTag( pHardLinkCB, AFS_HARDLINK_REQUEST_TAG);
+        }
+    }
+
+    return ntStatus;
+}
+
+
+
+NTSTATUS
+AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
+                 IN GUID            *AuthGroup,
+                 IN AFSObjectInfoCB *ParentObjectInfo,
+                 IN AFSObjectInfoCB *TargetParentObjectInfo,
+                 IN AFSDirectoryCB *DirectoryCB,
+                 IN UNICODE_STRING *TargetName,
+                 OUT AFSFileID  *UpdatedFID)
+{
+
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+    AFSFileRenameCB *pRenameCB = NULL;
+    AFSFileRenameResultCB *pRenameResultCB = NULL;
+    ULONG ulResultLen = 0;
+    AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
+
+    __Enter
+    {
+
+        //
+        // Init the control block for the request
+        //
+
+       pRenameCB = (AFSFileRenameCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+                                                                   PAGE_SIZE,
+                                                                   AFS_RENAME_REQUEST_TAG);
+
+        if( pRenameCB == NULL)
+        {
+
+            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+        }
+
+        RtlZeroMemory( pRenameCB,
+                       PAGE_SIZE);
+
+        pRenameCB->SourceParentId = ParentObjectInfo->FileId;
+
+        pRenameCB->TargetParentId = TargetParentObjectInfo->FileId;
+
+        pRenameCB->TargetNameLength = TargetName->Length;
+
+        RtlCopyMemory( pRenameCB->TargetName,
+                       TargetName->Buffer,
+                       TargetName->Length);
+
+        //
+        // Use the same buffer for the result control block
+        //
+
+        pRenameResultCB = (AFSFileRenameResultCB *)pRenameCB;
+
+        ulResultLen = PAGE_SIZE;
+
+        ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_RENAME_FILE,
+                                      AFS_REQUEST_FLAG_SYNCHRONOUS,
+                                      AuthGroup,
+                                      &DirectoryCB->NameInformation.FileName,
+                                      &ObjectInfo->FileId,
+                                      ObjectInfo->VolumeCB->VolumeInformation.Cell,
+                                      ObjectInfo->VolumeCB->VolumeInformation.CellLength,
+                                      pRenameCB,
+                                      sizeof( AFSFileRenameCB) + TargetName->Length,
+                                      pRenameResultCB,
+                                      &ulResultLen);
+
+        if( ntStatus != STATUS_SUCCESS)
+        {
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSNotifyRename failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                          ObjectInfo->FileId.Cell,
+                          ObjectInfo->FileId.Volume,
+                          ObjectInfo->FileId.Vnode,
+                          ObjectInfo->FileId.Unique,
+                          ntStatus));
+
+            try_return( ntStatus);
+        }
+
+        //
+        // Update the information from the returned data
+        //
+
+        AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                        TRUE);
+
+        if ( ParentObjectInfo->DataVersion.QuadPart == pRenameResultCB->SourceParentDataVersion.QuadPart - 1)
+        {
+
+            ParentObjectInfo->DataVersion = pRenameResultCB->SourceParentDataVersion;
+        }
+        else
+        {
+
+            SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+            ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+        }
+
+        if ( ParentObjectInfo != TargetParentObjectInfo)
+        {
+
+            AFSAcquireExcl( TargetParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                            TRUE);
+
+            if ( TargetParentObjectInfo->DataVersion.QuadPart == pRenameResultCB->TargetParentDataVersion.QuadPart - 1)
+            {
+
+                TargetParentObjectInfo->DataVersion = pRenameResultCB->TargetParentDataVersion;
+            }
+            else
+            {
+
+                SetFlag( TargetParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+                TargetParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+            }
+        }
+
+        //
+        // Move over the short name
+        //
+
+        DirectoryCB->NameInformation.ShortNameLength = pRenameResultCB->DirEnum.ShortNameLength;
+
+        if( !BooleanFlagOn( pDevExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+            DirectoryCB->NameInformation.ShortNameLength > 0)
+        {
+
+            UNICODE_STRING uniShortName;
+
+            uniShortName.Length = DirectoryCB->NameInformation.ShortNameLength;
+            uniShortName.MaximumLength = uniShortName.Length;
+            uniShortName.Buffer = DirectoryCB->NameInformation.ShortName;
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSNotifyRename Update old short name %wZ for DE %p for %wZ\n",
+                          &uniShortName,
+                          DirectoryCB,
+                          &DirectoryCB->NameInformation.FileName));
+
+            DirectoryCB->NameInformation.ShortNameLength = pRenameResultCB->DirEnum.ShortNameLength;
+
+            RtlCopyMemory( DirectoryCB->NameInformation.ShortName,
+                           pRenameResultCB->DirEnum.ShortName,
+                           DirectoryCB->NameInformation.ShortNameLength);
+
+            uniShortName.Length = DirectoryCB->NameInformation.ShortNameLength;
+            uniShortName.MaximumLength = uniShortName.Length;
+            uniShortName.Buffer = DirectoryCB->NameInformation.ShortName;
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSNotifyRename Initialized short name %wZ for DE %p for %wZ\n",
+                          &uniShortName,
+                          DirectoryCB,
+                          &DirectoryCB->NameInformation.FileName));
+        }
+        else
+        {
+
+            UNICODE_STRING uniShortName;
+
+            uniShortName.Length = DirectoryCB->NameInformation.ShortNameLength;
+            uniShortName.MaximumLength = uniShortName.Length;
+            uniShortName.Buffer = DirectoryCB->NameInformation.ShortName;
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSNotifyRename Removing old short name %wZ for DE %p for %wZ\n",
+                          &uniShortName,
+                          DirectoryCB,
+                          &DirectoryCB->NameInformation.FileName));
+
+            DirectoryCB->NameInformation.ShortNameLength = 0;
+
+            DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = 0;
+        }
+
+        if ( ParentObjectInfo != TargetParentObjectInfo)
+        {
+
+            AFSReleaseResource( TargetParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+        }
+
+        AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+        if( UpdatedFID != NULL)
+        {
+            *UpdatedFID = pRenameResultCB->DirEnum.FileId;
+        }
+
+try_exit:
+
+        if( pRenameCB != NULL)
+        {
+
+            AFSExFreePoolWithTag( pRenameCB, AFS_RENAME_REQUEST_TAG);
+        }
+    }
+
+    return ntStatus;
+}
+
+NTSTATUS
+AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
+                       IN GUID *AuthGroup,
+                       IN BOOLEAN FastCall,
+                       OUT AFSDirEnumEntry **DirEnumEntry)
+{
+
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+    AFSEvalTargetCB stTargetID;
+    ULONG ulResultBufferLength;
+    AFSFileEvalResultCB *pEvalResultCB = NULL;
+    AFSDirEnumEntry *pDirEnumCB = NULL;
+    ULONG ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
+    AFSObjectInfoCB *pParentObjectInfo = NULL;
+
+    __Enter
+    {
+
+        RtlZeroMemory( &stTargetID,
+                       sizeof( AFSEvalTargetCB));
+
+        if ( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+        {
+
+            pParentObjectInfo = AFSFindObjectInfo( ObjectInfo->VolumeCB,
+                                                   &ObjectInfo->ParentFileId,
+                                                   TRUE);
+
+            stTargetID.ParentId = ObjectInfo->ParentFileId;
+        }
 
         //
         // Allocate our response buffer
         //
 
-        pEvalResultCB = (AFSFileEvalResultCB *)AFSExAllocatePoolWithTag( PagedPool,
-                                                                         PAGE_SIZE,
-                                                                         AFS_GENERIC_MEMORY_30_TAG);
+       pEvalResultCB = (AFSFileEvalResultCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+                                                                           PAGE_SIZE,
+                                                                           AFS_GENERIC_MEMORY_30_TAG);
 
         if( pEvalResultCB == NULL)
         {
@@ -2270,6 +2728,8 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
                                       AuthGroup,
                                       NULL,
                                       &ObjectInfo->FileId,
+                                      ObjectInfo->VolumeCB->VolumeInformation.Cell,
+                                      ObjectInfo->VolumeCB->VolumeInformation.CellLength,
                                       &stTargetID,
                                       sizeof( AFSEvalTargetCB),
                                       pEvalResultCB,
@@ -2286,17 +2746,17 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
             if( ntStatus == STATUS_OBJECT_PATH_INVALID)
             {
 
-                if( ObjectInfo->ParentObjectInformation != NULL)
+                if( pParentObjectInfo != NULL)
                 {
 
-                    AFSAcquireExcl( ObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                    AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                                     TRUE);
 
-                    SetFlag( ObjectInfo->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                    SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                    ObjectInfo->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+                    pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
 
-                    AFSReleaseResource( ObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+                    AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
                 }
             }
 
@@ -2304,24 +2764,80 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
         }
 
         //
+        // A BSOD can occur if the pEvalResultCB->FileType is FILE but the
+        // ObjectInfo->FileType is something else.  The same is true for
+        // pDirEnumEntry->FileType is DIRECTORY.  Perform a sanity check
+        // to ensure consistency.  An inconsistent pDirEnumEntry can be
+        // produced as a result of invalid status info received from a file
+        // server.  If the types are inconsistent or if the type does not
+        // match the implied type derived from the vnode (odd values are
+        // directories and even values are other types), prevent the request
+        // from completing successfully.  This may prevent access to the file or
+        // directory but will prevent a BSOD.
+        //
+
+        if ( !AFSIsEqualFID( &ObjectInfo->FileId,
+                             &pEvalResultCB->DirEnum.FileId))
+        {
+
+            try_return( ntStatus = STATUS_UNSUCCESSFUL);
+        }
+
+        switch ( pEvalResultCB->DirEnum.FileType)
+        {
+
+        case AFS_FILE_TYPE_DIRECTORY:
+            if ( (pEvalResultCB->DirEnum.FileId.Vnode & 0x1) != 0x1)
+            {
+
+                try_return( ntStatus = STATUS_UNSUCCESSFUL);
+            }
+
+            if ( ObjectInfo->FileType != AFS_FILE_TYPE_UNKNOWN &&
+                 ObjectInfo->FileType != AFS_FILE_TYPE_DIRECTORY)
+            {
+
+                try_return( ntStatus = STATUS_UNSUCCESSFUL);
+            }
+
+            break;
+
+        case AFS_FILE_TYPE_FILE:
+            if ( (pEvalResultCB->DirEnum.FileId.Vnode & 0x1) != 0x0)
+            {
+
+                try_return( ntStatus = STATUS_UNSUCCESSFUL);
+            }
+
+            if ( ObjectInfo->FileType != AFS_FILE_TYPE_UNKNOWN &&
+                 ObjectInfo->FileType != AFS_FILE_TYPE_FILE)
+            {
+
+                try_return( ntStatus = STATUS_UNSUCCESSFUL);
+            }
+
+            break;
+        }
+
+        //
         // Validate the parent data version
         //
 
-        if ( ObjectInfo->ParentObjectInformation != NULL)
+        if ( pParentObjectInfo != NULL)
         {
 
-            AFSAcquireExcl( ObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+            AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                             TRUE);
 
-            if ( ObjectInfo->ParentObjectInformation->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
+            if ( pParentObjectInfo->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
             {
 
-                SetFlag( ObjectInfo->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                ObjectInfo->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+                pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
             }
 
-            AFSReleaseResource( ObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+            AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
         }
 
         //
@@ -2331,9 +2847,9 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
         if( DirEnumEntry != NULL)
         {
 
-            pDirEnumCB = (AFSDirEnumEntry *)AFSExAllocatePoolWithTag( PagedPool,
-                                                                      PAGE_SIZE,
-                                                                      AFS_GENERIC_MEMORY_2_TAG);
+           pDirEnumCB = (AFSDirEnumEntry *)AFSLibExAllocatePoolWithTag( PagedPool,
+                                                                        PAGE_SIZE,
+                                                                        AFS_GENERIC_MEMORY_2_TAG);
 
             if( pDirEnumCB == NULL)
             {
@@ -2349,10 +2865,16 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
 
 try_exit:
 
+        if ( pParentObjectInfo != NULL)
+        {
+
+            AFSReleaseObjectInfo( &pParentObjectInfo);
+        }
+
         if( pEvalResultCB != NULL)
         {
 
-            AFSExFreePool( pEvalResultCB);
+            AFSExFreePoolWithTag( pEvalResultCB, AFS_GENERIC_MEMORY_30_TAG);
         }
 
         if( !NT_SUCCESS( ntStatus))
@@ -2361,7 +2883,7 @@ try_exit:
             if( pDirEnumCB != NULL)
             {
 
-                AFSExFreePool( pDirEnumCB);
+                AFSExFreePoolWithTag( pDirEnumCB, AFS_GENERIC_MEMORY_2_TAG);
             }
 
             *DirEnumEntry = NULL;
@@ -2375,6 +2897,7 @@ NTSTATUS
 AFSEvaluateTargetByName( IN GUID *AuthGroup,
                          IN AFSObjectInfoCB *ParentObjectInfo,
                          IN PUNICODE_STRING SourceName,
+                         IN ULONG Flags,
                          OUT AFSDirEnumEntry **DirEnumEntry)
 {
 
@@ -2393,9 +2916,9 @@ AFSEvaluateTargetByName( IN GUID *AuthGroup,
         // Allocate our response buffer
         //
 
-        pEvalResultCB = (AFSFileEvalResultCB *)AFSExAllocatePoolWithTag( PagedPool,
-                                                                         PAGE_SIZE,
-                                                                         AFS_GENERIC_MEMORY_31_TAG);
+       pEvalResultCB = (AFSFileEvalResultCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+                                                                           PAGE_SIZE,
+                                                                           AFS_GENERIC_MEMORY_31_TAG);
 
         if( pEvalResultCB == NULL)
         {
@@ -2410,10 +2933,12 @@ AFSEvaluateTargetByName( IN GUID *AuthGroup,
         ulResultBufferLength = PAGE_SIZE;
 
         ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME,
-                                      AFS_REQUEST_FLAG_SYNCHRONOUS,
+                                      AFS_REQUEST_FLAG_SYNCHRONOUS | Flags,
                                       AuthGroup,
                                       SourceName,
                                       NULL,
+                                      ParentObjectInfo->VolumeCB->VolumeInformation.Cell,
+                                      ParentObjectInfo->VolumeCB->VolumeInformation.CellLength,
                                       &stTargetID,
                                       sizeof( AFSEvalTargetCB),
                                       pEvalResultCB,
@@ -2462,9 +2987,9 @@ AFSEvaluateTargetByName( IN GUID *AuthGroup,
         if( DirEnumEntry != NULL)
         {
 
-            pDirEnumCB = (AFSDirEnumEntry *)AFSExAllocatePoolWithTag( PagedPool,
-                                                                      PAGE_SIZE,
-                                                                      AFS_GENERIC_MEMORY_3_TAG);
+           pDirEnumCB = (AFSDirEnumEntry *)AFSLibExAllocatePoolWithTag( PagedPool,
+                                                                        PAGE_SIZE,
+                                                                        AFS_GENERIC_MEMORY_3_TAG);
 
             if( pDirEnumCB == NULL)
             {
@@ -2483,7 +3008,7 @@ try_exit:
         if( pEvalResultCB != NULL)
         {
 
-            AFSExFreePool( pEvalResultCB);
+            AFSExFreePoolWithTag( pEvalResultCB, AFS_GENERIC_MEMORY_31_TAG);
         }
 
         if( !NT_SUCCESS( ntStatus))
@@ -2492,7 +3017,7 @@ try_exit:
             if( pDirEnumCB != NULL)
             {
 
-                AFSExFreePool( pDirEnumCB);
+                AFSExFreePoolWithTag( pDirEnumCB, AFS_GENERIC_MEMORY_3_TAG);
             }
 
             *DirEnumEntry = NULL;
@@ -2523,6 +3048,8 @@ AFSRetrieveVolumeInformation( IN GUID *AuthGroup,
                                       FileID,
                                       NULL,
                                       0,
+                                      NULL,
+                                      0,
                                       VolumeInformation,
                                       &ulResultLen);
 
@@ -2541,6 +3068,46 @@ try_exit:
 }
 
 NTSTATUS
+AFSRetrieveVolumeSizeInformation( IN GUID *AuthGroup,
+                                  IN AFSFileID *FileID,
+                                  OUT AFSVolumeSizeInfoCB *VolumeSizeInformation)
+{
+
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+    ULONG ulResultLen = 0;
+
+    __Enter
+    {
+
+        ulResultLen = sizeof( AFSVolumeSizeInfoCB);
+
+        ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO,
+                                      AFS_REQUEST_FLAG_SYNCHRONOUS,
+                                      AuthGroup,
+                                      NULL,
+                                      FileID,
+                                      NULL,
+                                      0,
+                                      NULL,
+                                      0,
+                                      VolumeSizeInformation,
+                                      &ulResultLen);
+
+        if( ntStatus != STATUS_SUCCESS)
+        {
+
+            try_return( ntStatus);
+        }
+
+try_exit:
+
+        NOTHING;
+    }
+
+    return ntStatus;
+}
+
+NTSTATUS
 AFSNotifyPipeTransceive( IN AFSCcb *Ccb,
                          IN ULONG InputLength,
                          IN ULONG OutputLength,
@@ -2553,7 +3120,6 @@ AFSNotifyPipeTransceive( IN AFSCcb *Ccb,
     ULONG ulResultLen = 0;
     MDL *pInputMdl = NULL, *pOutputMdl = NULL;
     void *pInputSystemBuffer = NULL, *pOutputSystemBuffer = NULL;
-    ULONG ulBufferLength = OutputLength;
     AFSPipeIORequestCB *pIoRequest = NULL;
 
     __Enter
@@ -2573,10 +3139,10 @@ AFSNotifyPipeTransceive( IN AFSCcb *Ccb,
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
-        pIoRequest = (AFSPipeIORequestCB *)AFSExAllocatePoolWithTag( PagedPool,
-                                                                     sizeof( AFSPipeIORequestCB) +
+       pIoRequest = (AFSPipeIORequestCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+                                                                       sizeof( AFSPipeIORequestCB) +
                                                                                 InputLength,
-                                                                     AFS_GENERIC_MEMORY_4_TAG);
+                                                                       AFS_GENERIC_MEMORY_4_TAG);
 
         if( pIoRequest == NULL)
         {
@@ -2618,6 +3184,8 @@ AFSNotifyPipeTransceive( IN AFSCcb *Ccb,
                                       &Ccb->AuthGroup,
                                       &Ccb->DirectoryCB->NameInformation.FileName,
                                       NULL,
+                                      NULL,
+                                      0,
                                       pIoRequest,
                                       sizeof( AFSPipeIORequestCB) + InputLength,
                                       pOutputSystemBuffer,
@@ -2663,7 +3231,7 @@ try_exit:
         if( pIoRequest != NULL)
         {
 
-            AFSExFreePool( pIoRequest);
+            AFSExFreePoolWithTag( pIoRequest, AFS_GENERIC_MEMORY_4_TAG);
         }
     }
 
@@ -2683,10 +3251,10 @@ AFSNotifySetPipeInfo( IN AFSCcb *Ccb,
     __Enter
     {
 
-        pInfoRequest = (AFSPipeInfoRequestCB *)AFSExAllocatePoolWithTag( PagedPool,
-                                                                         sizeof( AFSPipeInfoRequestCB) +
+       pInfoRequest = (AFSPipeInfoRequestCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+                                                                           sizeof( AFSPipeInfoRequestCB) +
                                                                                 InputLength,
-                                                                         AFS_GENERIC_MEMORY_5_TAG);
+                                                                           AFS_GENERIC_MEMORY_5_TAG);
 
         if( pInfoRequest == NULL)
         {
@@ -2718,6 +3286,8 @@ AFSNotifySetPipeInfo( IN AFSCcb *Ccb,
                                       &Ccb->AuthGroup,
                                       &Ccb->DirectoryCB->NameInformation.FileName,
                                       NULL,
+                                      NULL,
+                                      0,
                                       pInfoRequest,
                                       sizeof( AFSPipeInfoRequestCB) + InputLength,
                                       NULL,
@@ -2740,7 +3310,7 @@ try_exit:
         if( pInfoRequest != NULL)
         {
 
-            AFSExFreePool( pInfoRequest);
+            AFSExFreePoolWithTag( pInfoRequest, AFS_GENERIC_MEMORY_5_TAG);
         }
     }
 
@@ -2784,6 +3354,8 @@ AFSNotifyQueryPipeInfo( IN AFSCcb *Ccb,
                                       &Ccb->AuthGroup,
                                       &Ccb->DirectoryCB->NameInformation.FileName,
                                       NULL,
+                                      NULL,
+                                      0,
                                       &stInfoRequest,
                                       sizeof( AFSPipeInfoRequestCB),
                                       DataBuffer,
@@ -2828,6 +3400,8 @@ AFSReleaseFid( IN AFSFileID *FileId)
                                       NULL,
                                       0,
                                       NULL,
+                                      0,
+                                      NULL,
                                       NULL);
     }
 
@@ -2841,7 +3415,6 @@ AFSIsExtentRequestQueued( IN AFSFileID *FileID,
 {
 
     BOOLEAN bRequestQueued = FALSE;
-    NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSDeviceExt    *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
     AFSCommSrvcCB   *pCommSrvc = NULL;
     AFSPoolEntry    *pPoolEntry = NULL;
@@ -2886,3 +3459,148 @@ AFSIsExtentRequestQueued( IN AFSFileID *FileID,
 
     return bRequestQueued;
 }
+
+NTSTATUS
+AFSCreateSymlink( IN GUID *AuthGroup,
+                  IN AFSObjectInfoCB *ParentObjectInfo,
+                  IN UNICODE_STRING *FileName,
+                  IN AFSObjectInfoCB *ObjectInfo,
+                  IN UNICODE_STRING *TargetName)
+{
+
+    NTSTATUS                  ntStatus = STATUS_SUCCESS;
+    AFSCreateSymlinkCB       *pSymlinkCreate = NULL;
+    ULONG                     ulResultLen = 0;
+    AFSCreateSymlinkResultCB *pSymlinkResult = NULL;
+
+    __Enter
+    {
+
+        //
+        // Allocate our request and result structures
+        //
+
+       pSymlinkCreate = (AFSCreateSymlinkCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+                                                                           sizeof( AFSCreateSymlinkCB) +
+                                                                           TargetName->Length,
+                                                                           AFS_SYMLINK_REQUEST_TAG);
+
+        if( pSymlinkCreate == NULL)
+        {
+
+            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+        }
+
+        RtlZeroMemory( pSymlinkCreate,
+                       sizeof( AFSCreateSymlinkCB) +
+                             TargetName->Length);
+
+       pSymlinkResult = (AFSCreateSymlinkResultCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+                                                                                 PAGE_SIZE,
+                                                                                 AFS_SYMLINK_REQUEST_TAG);
+
+        if( pSymlinkResult == NULL)
+        {
+
+            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+        }
+
+        RtlZeroMemory( pSymlinkResult,
+                       PAGE_SIZE);
+
+        //
+        // Populate the request buffer
+        //
+
+        RtlCopyMemory( &pSymlinkCreate->ParentId,
+                       &ObjectInfo->ParentFileId,
+                       sizeof( AFSFileID));
+
+        pSymlinkCreate->TargetNameLength = TargetName->Length;
+
+        RtlCopyMemory( pSymlinkCreate->TargetName,
+                       TargetName->Buffer,
+                       TargetName->Length);
+
+        ulResultLen = PAGE_SIZE;
+
+        //
+        // Call the service to create the symlink entry
+        //
+
+        ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_CREATE_SYMLINK,
+                                      AFS_REQUEST_FLAG_SYNCHRONOUS,
+                                      AuthGroup,
+                                      FileName,
+                                      &ObjectInfo->FileId,
+                                      ObjectInfo->VolumeCB->VolumeInformation.Cell,
+                                      ObjectInfo->VolumeCB->VolumeInformation.CellLength,
+                                      pSymlinkCreate,
+                                      sizeof( AFSCreateSymlinkCB) +
+                                                TargetName->Length,
+                                      pSymlinkResult,
+                                      &ulResultLen);
+
+        if ( ntStatus == STATUS_FILE_DELETED )
+        {
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSCreateSymlink failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                          ObjectInfo->FileId.Cell,
+                          ObjectInfo->FileId.Volume,
+                          ObjectInfo->FileId.Vnode,
+                          ObjectInfo->FileId.Unique,
+                          ntStatus));
+
+            SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+            ClearFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
+
+            SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_DELETED);
+
+            try_return( ntStatus = STATUS_ACCESS_DENIED);
+        }
+        else if( ntStatus != STATUS_SUCCESS)
+        {
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSCreateSymlink failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                          ObjectInfo->FileId.Cell,
+                          ObjectInfo->FileId.Volume,
+                          ObjectInfo->FileId.Vnode,
+                          ObjectInfo->FileId.Unique,
+                          ntStatus));
+
+            try_return( ntStatus);
+        }
+
+        //
+        // After successful creation the open object has been deleted and replaced by
+        // the actual symlink.
+        //
+
+        SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+        ClearFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
+
+        SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_DELETED);
+
+try_exit:
+
+        if( pSymlinkCreate != NULL)
+        {
+
+            AFSExFreePoolWithTag( pSymlinkCreate, AFS_SYMLINK_REQUEST_TAG);
+        }
+
+        if( pSymlinkResult != NULL)
+        {
+
+            AFSExFreePoolWithTag( pSymlinkResult, AFS_SYMLINK_REQUEST_TAG);
+        }
+    }
+
+    return ntStatus;
+}