Windows: Deny writes/truncation to files w RO attr
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSCreate.cpp
index 93b92bc..5055482 100644 (file)
@@ -71,10 +71,10 @@ AFSCreate( IN PDEVICE_OBJECT LibDeviceObject,
             pFileObject->FileName.Buffer == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCreate (%p) Processing control device open request\n",
-                          Irp);
+                          Irp));
 
             ntStatus = AFSControlDeviceCreate( Irp);
 
@@ -84,10 +84,10 @@ AFSCreate( IN PDEVICE_OBJECT LibDeviceObject,
         if( AFSRDRDeviceObject == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCreate (%p) Invalid request to open before library is initialized\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus = STATUS_DEVICE_NOT_READY);
         }
@@ -102,9 +102,9 @@ try_exit:
     __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
     {
 
-        AFSDbgLogMsg( 0,
+        AFSDbgTrace(( 0,
                       0,
-                      "EXCEPTION - AFSCreate\n");
+                      "EXCEPTION - AFSCreate\n"));
 
         ntStatus = STATUS_ACCESS_DENIED;
 
@@ -201,10 +201,10 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
         if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_WARNING,
                           "AFSCommonCreate (%p) Open request after shutdown\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus = STATUS_TOO_LATE);
         }
@@ -217,10 +217,10 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate Failed to enumerate global root Status %08lX\n",
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -245,12 +245,12 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           uniFileName.Length > 0 ? AFS_TRACE_LEVEL_ERROR : AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCommonCreate (%p) Failed to parse name \"%wZ\" Status %08lX\n",
                           Irp,
                           &uniFileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -342,10 +342,10 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                     if( !NT_SUCCESS( ntStatus))
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
                                       "AFSCommonCreate Failed to open root IOCtl Fcb Status %08lX\n",
-                                      ntStatus);
+                                      ntStatus));
                     }
                 }
                 else if( pParentDirectoryCB != NULL)
@@ -363,10 +363,10 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                         if( !NT_SUCCESS( ntStatus))
                         {
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_ERROR,
                                           "AFSCommonCreate Failed to open special share Fcb Status %08lX\n",
-                                          ntStatus);
+                                          ntStatus));
                         }
                     }
                 }
@@ -381,10 +381,10 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate Failed to open root Status %08lX\n",
-                              ntStatus);
+                              ntStatus));
             }
 
             try_return( ntStatus);
@@ -415,199 +415,577 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
 
                 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSCommonCreate (%p) Invalid name %wZ Status %08lX\n",
                               Irp,
                               &uniFileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
 
-            //
-            // Opening a reparse point directly?
-            //
 
-            ulNameProcessingFlags = AFS_LOCATE_FLAGS_SUBSTITUTE_NAME;
-
-            if( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
+           if ( !AFSIgnoreReparsePointToFile() ||
+                !BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
             {
-                ulNameProcessingFlags |= (AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
-                                          AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL |
-                                          AFS_LOCATE_FLAGS_NO_DFS_LINK_EVAL);
-            }
+               //
+               // If there is no ReparsePointPolicy then the FILE_OPEN_REPARSE_POINT
+               // flag is applied if it is set.
+               //
+               // If the FILE_OPEN_REPARSE_POINT flag is not set, then there is
+               // no extra work to be done in any case.  Use a single pass evaluation.
+               //
+
+               ulNameProcessingFlags = AFS_LOCATE_FLAGS_SUBSTITUTE_NAME;
+
+               //
+               // Opening a reparse point directly?
+               //
+
+               if( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
+               {
+                   ulNameProcessingFlags |= (AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
+                                              AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL |
+                                              AFS_LOCATE_FLAGS_NO_DFS_LINK_EVAL);
+               }
+
+               uniSubstitutedPathName = uniRootFileName;
+
+               ntStatus = AFSLocateNameEntry( &stAuthGroup,
+                                              pFileObject,
+                                              &uniRootFileName,
+                                              &uniParsedFileName,
+                                              pNameArray,
+                                              ulNameProcessingFlags,
+                                              pVolumeCB,
+                                              pParentDirectoryCB,
+                                              &pNewVolumeCB,
+                                              &NewVolumeReferenceReason,
+                                              &pNewParentDirectoryCB,
+                                              &pDirectoryCB,
+                                              &uniComponentName);
+
+               if ( pNewVolumeCB != NULL)
+               {
+
+                   //
+                   // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+                   // even if pVolumeCB == pNewVolumeCB.  It is always safe to release
+                   // the reference on pVolumeCB that was held prior to the call.
+                   // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+                   // will be released second.
+                   //
+
+                   lCount = AFSVolumeDecrement( pVolumeCB,
+                                                VolumeReferenceReason);
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSCommonCreate Decrement count on volume %p Reason %u Cnt %d\n",
+                                 pVolumeCB,
+                                 VolumeReferenceReason,
+                                 lCount));
+
+                   pVolumeCB = pNewVolumeCB;
+
+                   pNewVolumeCB = NULL;
+
+                   VolumeReferenceReason = NewVolumeReferenceReason;
+
+                   NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+
+                   bReleaseVolume = (pVolumeCB != NULL);
+               }
+
+               //
+               // AFSLocateNameEntry does not alter the reference count of
+               // pParentDirectoryCB and it returns pNewParentDirectoryCB with
+               // a reference held.
+               //
+
+               if ( bReleaseParentDir)
+               {
+
+                   lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSCommonCreate DecrementX count on %wZ DE %p Ccb %p Cnt %d\n",
+                                 &pParentDirectoryCB->NameInformation.FileName,
+                                 pParentDirectoryCB,
+                                 pCcb,
+                                 lCount));
+               }
+
+               pParentDirectoryCB = pNewParentDirectoryCB;
+
+               pNewParentDirectoryCB = NULL;
+
+               bReleaseParentDir = (pParentDirectoryCB != NULL);
+
+               if ( pDirectoryCB)
+               {
+
+                   bReleaseDir = TRUE;
+               }
+
+               if( !NT_SUCCESS( ntStatus) &&
+                   ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
+               {
 
-            uniSubstitutedPathName = uniRootFileName;
+                   if ( uniSubstitutedPathName.Buffer == uniRootFileName.Buffer)
+                   {
+                       uniSubstitutedPathName.Buffer = NULL;
+                   }
 
-            ntStatus = AFSLocateNameEntry( &stAuthGroup,
-                                           pFileObject,
-                                           &uniRootFileName,
-                                           &uniParsedFileName,
-                                           pNameArray,
-                                           ulNameProcessingFlags,
-                                           pVolumeCB,
-                                           pParentDirectoryCB,
-                                           &pNewVolumeCB,
-                                           &NewVolumeReferenceReason,
-                                           &pNewParentDirectoryCB,
-                                           &pDirectoryCB,
-                                           &uniComponentName);
+                   //
+                   // AFSLocateNameEntry released the Parent while walking the
+                   // branch
+                   //
 
-            //
-            // AFSLocateNameEntry returns pNewVolumeCB with a reference held
-            // even if pVolumeCB == pNewVolumeCB.  It is always safe to release
-            // the reference on pVolumeCB that was held prior to the call.
-            // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
-            // will be released second.
-            //
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSCommonCreate (%p) Failed to locate name entry for %wZ Status %08lX\n",
+                                 Irp,
+                                 &uniFileName,
+                                 ntStatus));
 
-            lCount = AFSVolumeDecrement( pVolumeCB,
-                                         VolumeReferenceReason);
+                   try_return( ntStatus);
+               }
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSCommonCreate Decrement count on volume %p Reason %u Cnt %d\n",
-                          pVolumeCB,
-                          VolumeReferenceReason,
-                          lCount);
+               //
+               // Check for STATUS_REPARSE
+               //
 
-            pVolumeCB = pNewVolumeCB;
+               if( ntStatus == STATUS_REPARSE)
+               {
 
-            pNewVolumeCB = NULL;
+                   uniSubstitutedPathName.Buffer = NULL;
 
-            VolumeReferenceReason = NewVolumeReferenceReason;
+                   //
+                   // Update the information and return
+                   //
 
-            NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+                   Irp->IoStatus.Information = IO_REPARSE;
 
-            bReleaseVolume = (pVolumeCB != NULL);
+                   try_return( ntStatus);
+               }
 
-            //
-            // AFSLocateNameEntry does not alter the reference count of
-            // pParentDirectoryCB and it returns pNewParentDirectoryCB with
-            // a reference held.
-            //
+               //
+               // If we re-allocated the name, then update our substitute name
+               //
 
-            if ( bReleaseParentDir)
-            {
+               if( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
+                {
 
-                lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
+                   uniSubstitutedPathName = uniRootFileName;
+               }
+               else
+               {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCommonCreate DecrementX count on %wZ DE %p Ccb %p Cnt %d\n",
-                              &pParentDirectoryCB->NameInformation.FileName,
-                              pParentDirectoryCB,
-                              pCcb,
-                              lCount);
-            }
+                    uniSubstitutedPathName.Buffer = NULL;
+                }
 
-            pParentDirectoryCB = pNewParentDirectoryCB;
+                //
+               // Check for a symlink access
+                //
 
-            pNewParentDirectoryCB = NULL;
+               if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND &&
+                   pParentDirectoryCB != NULL)
+               {
 
-            bReleaseParentDir = (pParentDirectoryCB != NULL);
+                   //
+                   // pParentDirectoryCB DirOpenReferenceCount is still held
+                   //
 
-            if ( pDirectoryCB)
-            {
+                   UNICODE_STRING uniFinalComponent;
 
-                bReleaseDir = TRUE;
-            }
+                   uniFinalComponent.Length = 0;
+                   uniFinalComponent.MaximumLength = 0;
+                   uniFinalComponent.Buffer = NULL;
+
+                   AFSRetrieveFinalComponent( &uniFileName,
+                                              &uniFinalComponent);
+
+                   ntStatus = AFSCheckSymlinkAccess( pParentDirectoryCB,
+                                                     &uniFinalComponent);
+
+                   if( !NT_SUCCESS( ntStatus) &&
+                       ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
+                   {
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSCommonCreate (%p) Failing access to symlink %wZ Status %08lX\n",
+                                     Irp,
+                                     &uniFileName,
+                                     ntStatus));
 
-            if( !NT_SUCCESS( ntStatus) &&
-                ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
+                       try_return( ntStatus);
+                   }
+               }
+           }
+           else
             {
+               AFSNameArrayHdr    *pNameArrayClone = NULL;
+
+               //
+               // The FILE_OPEN_REPARSE_POINT flag has been specified and a ReparsePointPolicy
+               // is in effect which conditionally applies depending on the type of the target
+               // object.  Therefore, two lookup passes must be performed.
+               //   1. Evaluate the path as if the FILE_OPEN_REPARSE_POINT flag had
+               //      not been specified.
+               //   2. If the target object type matches the policy, use it and ignore
+               //      the FILE_OPEN_REPARSE_POINT flag.
+               //   3. If the target object type does not match the policy, perform
+               //      a second pass that opens the reparse point.
+               //   4. If the target object cannot be evaluated, perform the second pass
+               //      that opens the reparse point.
 
-                if ( uniSubstitutedPathName.Buffer == uniRootFileName.Buffer)
-                {
-                    uniSubstitutedPathName.Buffer = NULL;
-                }
+
+               ulNameProcessingFlags = AFS_LOCATE_FLAGS_SUBSTITUTE_NAME;
+
+               uniSubstitutedPathName = uniRootFileName;
 
                 //
-                // AFSLocateNameEntry released the Parent while walking the
-                // branch
+               // Since we may need to replay the call with different options
+               // the values that might be altered need to be cloned:
+               //   1. uniRootFileName
+               //   2. pNameArray
                 //
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCommonCreate (%p) Failed to locate name entry for %wZ Status %08lX\n",
-                              Irp,
-                              &uniFileName,
-                              ntStatus);
+               pNameArrayClone = AFSInitNameArray( NULL, 0);
 
-                try_return( ntStatus);
-            }
+               if ( pNameArrayClone == NULL)
+               {
 
-            //
-            // Check for STATUS_REPARSE
-            //
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSCommonCreate (%p) Failed to initialize name array clone\n",
+                                 Irp));
 
-            if( ntStatus == STATUS_REPARSE)
-            {
+                   try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+               }
+
+               ntStatus = AFSPopulateNameArrayFromRelatedArray( pNameArrayClone,
+                                                                pNameArray,
+                                                                NULL);
+
+               if ( !NT_SUCCESS(ntStatus))
+               {
 
-                uniSubstitutedPathName.Buffer = NULL;
+                   AFSFreeNameArray( pNameArrayClone);
+
+                   try_return( ntStatus);
+               }
 
                 //
-                // Update the information and return
+               // Now that the data is saved perform the lookup to determine
+               // what the target resolves to.
                 //
 
-                Irp->IoStatus.Information = IO_REPARSE;
+               ntStatus = AFSLocateNameEntry( &stAuthGroup,
+                                              pFileObject,
+                                              &uniRootFileName,
+                                              &uniParsedFileName,
+                                              pNameArray,
+                                              ulNameProcessingFlags,
+                                              pVolumeCB,
+                                              pParentDirectoryCB,
+                                              &pNewVolumeCB,
+                                              &NewVolumeReferenceReason,
+                                              &pNewParentDirectoryCB,
+                                              &pDirectoryCB,
+                                              &uniComponentName);
+
+               if ( ntStatus == STATUS_SUCCESS ||
+                    ntStatus == STATUS_REPARSE ||
+                    ntStatus == STATUS_OBJECT_NAME_NOT_FOUND ||
+                    ntStatus == STATUS_ACCESS_DENIED)
+               {
+                   //
+                   // Decide what to do based upon the ReparsePointPolicy
+                   // and the type of the target object.
+                   //
+
+                   if ( ntStatus == STATUS_SUCCESS &&
+                        AFSIgnoreReparsePointToFile() &&
+                        pDirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_FILE)
+                   {
+
+                       //
+                       // We found an entity that matches the policy.
+                       // Therefore, we are done.  Cleanup the cloned data
+                       // and clear the FILE_OPEN_REPARSE_FLAG so we do not
+                       // later mark the CCB with CCB_FLAG_MASK_OPENED_REPARSE_POINT.
+                       //
+
+                       AFSFreeNameArray( pNameArrayClone);
+
+                       pNameArrayClone = NULL;
+
+                       ClearFlag( ulOptions, FILE_OPEN_REPARSE_POINT);
+                   }
+                   else
+                   {
+                       //
+                       //  There is no matching policy, so we need to cleanup the
+                       //  output values from AFSLocateNameEntry(), restore the
+                       //  cloned information, and re-issue the request attempting
+                       //  to open the reparse point (if any).
+                       //
+
+                       if ( pNewVolumeCB != NULL)
+                       {
+
+                           lCount = AFSVolumeDecrement( pNewVolumeCB,
+                                                        NewVolumeReferenceReason);
+
+                           pNewVolumeCB = NULL;
+
+                           NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+                       }
+
+                       if ( pNewParentDirectoryCB)
+                       {
+
+                           lCount = InterlockedDecrement( &pNewParentDirectoryCB->DirOpenReferenceCount);
+
+                           AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                                         AFS_TRACE_LEVEL_VERBOSE,
+                                         "AFSCommonCreate DecrementY count on %wZ DE %p Ccb %p Cnt %d\n",
+                                         &pNewParentDirectoryCB->NameInformation.FileName,
+                                         pNewParentDirectoryCB,
+                                         pCcb,
+                                         lCount));
+
+                           pNewParentDirectoryCB = NULL;
+                       }
+
+                       if ( pDirectoryCB)
+                       {
+
+                           lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
+
+                           AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                                         AFS_TRACE_LEVEL_VERBOSE,
+                                         "AFSCommonCreate DecrementZ count on %wZ DE %p Ccb %p Cnt %d\n",
+                                         &pDirectoryCB->NameInformation.FileName,
+                                         pDirectoryCB,
+                                         pCcb,
+                                         lCount));
+
+                           pDirectoryCB = NULL;
+                       }
+
+                       RtlZeroMemory( &uniComponentName,
+                                      sizeof( UNICODE_STRING));
+
+                       if ( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
+                       {
+
+                           AFSExFreePoolWithTag( uniRootFileName.Buffer, 0);
+
+                           uniRootFileName = uniSubstitutedPathName;
+                       }
+
+                       AFSFreeNameArray( pNameArray);
+
+                       pNameArray = pNameArrayClone;
 
-                try_return( ntStatus);
-            }
+                       pNameArrayClone = NULL;
 
-            //
-            // If we re-allocated the name, then update our substitute name
-            //
+                       //
+                       // Retry the lookup
+                       //
 
-            if( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
-            {
+                       ulNameProcessingFlags |= (AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
+                                                  AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL |
+                                                  AFS_LOCATE_FLAGS_NO_DFS_LINK_EVAL);
 
-                uniSubstitutedPathName = uniRootFileName;
-            }
-            else
-            {
+                       ntStatus = AFSLocateNameEntry( &stAuthGroup,
+                                                      pFileObject,
+                                                      &uniRootFileName,
+                                                      &uniParsedFileName,
+                                                      pNameArray,
+                                                      ulNameProcessingFlags,
+                                                      pVolumeCB,
+                                                      pParentDirectoryCB,
+                                                      &pNewVolumeCB,
+                                                      &NewVolumeReferenceReason,
+                                                      &pNewParentDirectoryCB,
+                                                      &pDirectoryCB,
+                                                      &uniComponentName);
+                   }
+               }
+               else
+               {
 
-                uniSubstitutedPathName.Buffer = NULL;
-            }
+                   AFSFreeNameArray( pNameArrayClone);
 
-            //
-            // Check for a symlink access
-            //
+                   pNameArrayClone = NULL;
+               }
 
-            if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND &&
-                pParentDirectoryCB != NULL)
-            {
+               if ( pNewVolumeCB != NULL)
+               {
 
-                //
-                // pParentDirectoryCB DirOpenReferenceCount is still held
-                //
+                   //
+                   // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+                   // even if pVolumeCB == pNewVolumeCB.  It is always safe to release
+                   // the reference on pVolumeCB that was held prior to the call.
+                   // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+                   // will be released second.
+                   //
 
-                UNICODE_STRING uniFinalComponent;
+                   lCount = AFSVolumeDecrement( pVolumeCB,
+                                                VolumeReferenceReason);
 
-                uniFinalComponent.Length = 0;
-                uniFinalComponent.MaximumLength = 0;
-                uniFinalComponent.Buffer = NULL;
+                   AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSCommonCreate Decrement count on volume %p Reason %u Cnt %d\n",
+                                 pVolumeCB,
+                                 VolumeReferenceReason,
+                                 lCount));
 
-                AFSRetrieveFinalComponent( &uniFileName,
-                                           &uniFinalComponent);
+                   pVolumeCB = pNewVolumeCB;
+
+                   pNewVolumeCB = NULL;
+
+                   VolumeReferenceReason = NewVolumeReferenceReason;
+
+                   NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+
+                   bReleaseVolume = (pVolumeCB != NULL);
+               }
+
+               //
+               // AFSLocateNameEntry does not alter the reference count of
+               // pParentDirectoryCB and it returns pNewParentDirectoryCB with
+               // a reference held.
+               //
+
+               if ( bReleaseParentDir)
+               {
+
+                   lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSCommonCreate DecrementX count on %wZ DE %p Ccb %p Cnt %d\n",
+                                 &pParentDirectoryCB->NameInformation.FileName,
+                                 pParentDirectoryCB,
+                                 pCcb,
+                                 lCount));
+               }
 
-                ntStatus = AFSCheckSymlinkAccess( pParentDirectoryCB,
-                                                  &uniFinalComponent);
+               pParentDirectoryCB = pNewParentDirectoryCB;
+
+               pNewParentDirectoryCB = NULL;
+
+               bReleaseParentDir = (pParentDirectoryCB != NULL);
+
+               if ( pDirectoryCB)
+               {
+
+                   bReleaseDir = TRUE;
+               }
 
                 if( !NT_SUCCESS( ntStatus) &&
                     ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                   if ( uniSubstitutedPathName.Buffer == uniRootFileName.Buffer)
+                   {
+                       uniSubstitutedPathName.Buffer = NULL;
+                   }
+
+                   //
+                   // AFSLocateNameEntry released the Parent while walking the
+                   // branch
+                   //
+
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCommonCreate (%p) Failing access to symlink %wZ Status %08lX\n",
+                                 "AFSCommonCreate (%p) Failed to locate name entry for %wZ Status %08lX\n",
                                   Irp,
                                   &uniFileName,
-                                  ntStatus);
+                                  ntStatus));
 
                     try_return( ntStatus);
                 }
+
+               //
+               // Check for STATUS_REPARSE
+               //
+
+               if( ntStatus == STATUS_REPARSE)
+               {
+
+                   uniSubstitutedPathName.Buffer = NULL;
+
+                   //
+                   // Update the information and return
+                   //
+
+                   Irp->IoStatus.Information = IO_REPARSE;
+
+                   try_return( ntStatus);
+               }
+
+               //
+               // If we re-allocated the name, then update our substitute name
+               //
+
+               if( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
+               {
+
+                   uniSubstitutedPathName = uniRootFileName;
+               }
+               else
+               {
+
+                   uniSubstitutedPathName.Buffer = NULL;
+               }
+
+               //
+               // Check for a symlink access
+               //
+
+               if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND &&
+                   pParentDirectoryCB != NULL)
+               {
+
+                   //
+                   // pParentDirectoryCB DirOpenReferenceCount is still held
+                   //
+
+                   UNICODE_STRING uniFinalComponent;
+
+                   uniFinalComponent.Length = 0;
+                   uniFinalComponent.MaximumLength = 0;
+                   uniFinalComponent.Buffer = NULL;
+
+                   AFSRetrieveFinalComponent( &uniFileName,
+                                              &uniFinalComponent);
+
+                   ntStatus = AFSCheckSymlinkAccess( pParentDirectoryCB,
+                                                     &uniFinalComponent);
+
+                   if( !NT_SUCCESS( ntStatus) &&
+                       ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
+                   {
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSCommonCreate (%p) Failing access to symlink %wZ Status %08lX\n",
+                                     Irp,
+                                     &uniFileName,
+                                     ntStatus));
+
+                       try_return( ntStatus);
+                   }
+               }
             }
         }
 
@@ -624,13 +1002,13 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
 
             lCount = InterlockedIncrement( &pDirectoryCB->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCommonCreate Increment0 count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pDirectoryCB->NameInformation.FileName,
                           pDirectoryCB,
                           pCcb,
-                          lCount);
+                          lCount));
 
             bReleaseDir = TRUE;
         }
@@ -654,13 +1032,13 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
 
                     lCount = InterlockedIncrement( &pParentDirectoryCB->DirOpenReferenceCount);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSCommonCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
                                   &pParentDirectoryCB->NameInformation.FileName,
                                   pParentDirectoryCB,
                                   pCcb,
-                                  lCount);
+                                  lCount));
 
                     bReleaseParentDir = TRUE;
                 }
@@ -696,11 +1074,11 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate Failed to open target directory %wZ Status %08lX\n",
                               &pParentDirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
             }
 
             try_return( ntStatus);
@@ -712,22 +1090,22 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( pDirectoryCB == NULL ||
                 !BooleanFlagOn( pDirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
             {
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSCommonCreate (%p) Reparse open request but attribute not set for %wZ DirCB %p Type %08lX\n",
                               Irp,
                               &uniFileName,
                               pDirectoryCB,
-                              pDirectoryCB ? pDirectoryCB->ObjectInformation->FileType : 0);
+                              pDirectoryCB ? pDirectoryCB->ObjectInformation->FileType : 0));
             }
             else
             {
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSCommonCreate (%p) Opening as reparse point %wZ Type %08lX\n",
                               Irp,
                               &uniFileName,
-                              pDirectoryCB->ObjectInformation->FileType);
+                              pDirectoryCB->ObjectInformation->FileType));
 
                 bOpenedReparsePoint = TRUE;
             }
@@ -755,19 +1133,19 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                 if( pDirectoryCB != NULL)
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
                                   &pDirectoryCB->NameInformation.FileName,
-                                  ntStatus);
+                                  ntStatus));
                 }
                 else
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSCommonCreate Object name collision on create Status %08lX\n",
-                                  ntStatus);
+                                  ntStatus));
                 }
 
                 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
@@ -790,12 +1168,12 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate Failed to create of %wZ in directory %wZ Status %08lX\n",
                               &uniComponentName,
                               &pParentDirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
             }
 
             try_return( ntStatus);
@@ -831,21 +1209,21 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                 if( !NT_SUCCESS( ntStatus))
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSCommonCreate Failed to IOCtl open on %wZ Status %08lX\n",
                                   &uniComponentName,
-                                  ntStatus);
+                                  ntStatus));
                 }
             }
             else
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSCommonCreate (%p) File %wZ name not found\n",
                               Irp,
-                              &uniFileName);
+                              &uniFileName));
 
                 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
             }
@@ -867,10 +1245,10 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE ))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate (%p) Attempt to open root as delete on close\n",
-                              Irp);
+                              Irp));
 
                 try_return( ntStatus = STATUS_CANNOT_DELETE);
             }
@@ -882,10 +1260,10 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( bOpenTargetDirectory)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate (%p) Attempt to open root as target directory\n",
-                              Irp);
+                              Irp));
 
                 try_return( ntStatus = STATUS_INVALID_PARAMETER);
             }
@@ -903,12 +1281,12 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate Failed to open volume root %08lX-%08lX Status %08lX\n",
                               pVolumeCB->ObjectInformation.FileId.Cell,
                               pVolumeCB->ObjectInformation.FileId.Volume,
-                              ntStatus);
+                              ntStatus));
             }
 
             try_return( ntStatus);
@@ -921,10 +1299,10 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
         if( pDirectoryCB == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSCommonCreate Failing access to %wZ Name not found\n",
-                          &uniFileName);
+                          &uniFileName));
 
             try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
         }
@@ -950,11 +1328,11 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate Failed overwrite/supersede on %wZ Status %08lX\n",
                               &pDirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
             }
 
             try_return( ntStatus);
@@ -969,17 +1347,18 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                                    pVolumeCB,
                                    pParentDirectoryCB,
                                    pDirectoryCB,
+                                  bOpenedReparsePoint,
                                    &pFcb,
                                    &pCcb);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSCommonCreate Failed open on %wZ Status %08lX\n",
                           &pDirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
         }
 
 try_exit:
@@ -1032,13 +1411,13 @@ try_exit:
 
                 lCount = pCcb->DirectoryCB->DirOpenReferenceCount;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSCommonCreate Count on %wZ DE %p Ccb %p Cnt %d\n",
                               &pCcb->DirectoryCB->NameInformation.FileName,
                               pCcb->DirectoryCB,
                               pCcb,
-                              lCount);
+                              lCount));
 
                 ASSERT( lCount >= 0);
 
@@ -1065,13 +1444,13 @@ try_exit:
             // If we make it here then init the FO for the request.
             //
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
                           "AFSCommonCreate (%p) FileObject %p FsContext %p FsContext2 %p\n",
                           Irp,
                           pFileObject,
                           pFcb,
-                          pCcb);
+                          pCcb));
 
             pFileObject->FsContext = (void *)pFcb;
 
@@ -1140,13 +1519,13 @@ try_exit:
             else
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate (%p) Returning with NULL Fcb FileObject %p FsContext %p FsContext2 %p\n",
                               Irp,
                               pFileObject,
                               pFcb,
-                              pCcb);
+                              pCcb));
             }
         }
         else
@@ -1155,13 +1534,13 @@ try_exit:
                 ntStatus == STATUS_REPARSE)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate (%p) STATUS_REPARSE FileObject %p FsContext %p FsContext2 %p\n",
                               Irp,
                               pFileObject,
                               pFcb,
-                              pCcb);
+                              pCcb));
             }
 
             //
@@ -1199,12 +1578,12 @@ try_exit:
             lCount = AFSVolumeDecrement( pVolumeCB,
                                          VolumeReferenceReason);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCommonCreate Decrement count on Volume %08lX Reason %u Cnt %d\n",
                           pVolumeCB,
                           VolumeReferenceReason,
-                          lCount);
+                          lCount));
         }
 
         if ( bReleaseDir)
@@ -1216,13 +1595,13 @@ try_exit:
 
             lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCommonCreate Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pDirectoryCB->NameInformation.FileName,
                           pDirectoryCB,
                           pCcb,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
         }
@@ -1236,13 +1615,13 @@ try_exit:
 
             lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCommonCreate Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pParentDirectoryCB->NameInformation.FileName,
                           pParentDirectoryCB,
                           pCcb,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
         }
@@ -1281,10 +1660,10 @@ AFSOpenAFSRoot( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSOpenAFSRoot (%p) Failed to allocate Ccb\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus);
         }
@@ -1295,19 +1674,19 @@ AFSOpenAFSRoot( IN PIRP Irp,
 
         lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenAFSRoot Increment count on Fcb %p Cnt %d\n",
                       AFSGlobalRoot->RootFcb,
-                      lCount);
+                      lCount));
 
         lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenAFSRoot Increment handle count on Fcb %p Cnt %d\n",
                       AFSGlobalRoot->RootFcb,
-                      lCount);
+                      lCount));
 
         *Fcb = AFSGlobalRoot->RootFcb;
 
@@ -1360,11 +1739,11 @@ AFSOpenRoot( IN PIRP Irp,
 
             ntStatus = STATUS_FILE_IS_A_DIRECTORY;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSOpenRoot (%p) Attempt to open root as file Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1381,11 +1760,11 @@ AFSOpenRoot( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSOpenRoot (%p) Failed to validate root entry Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1432,14 +1811,14 @@ AFSOpenRoot( IN PIRP Irp,
                                    &uniGUID);
             }
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSOpenRoot (%p) Failed open in service volume %08lX-%08lX AuthGroup %wZ Status %08lX\n",
                           Irp,
                           VolumeCB->ObjectInformation.FileId.Cell,
                           VolumeCB->ObjectInformation.FileId.Volume,
                           &uniGUID,
-                          ntStatus);
+                          ntStatus));
 
             if( AuthGroup != NULL)
             {
@@ -1468,11 +1847,11 @@ AFSOpenRoot( IN PIRP Irp,
 
                 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSOpenRoot (%p) Failed to enumerate directory Status %08lX\n",
                               Irp,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -1496,11 +1875,11 @@ AFSOpenRoot( IN PIRP Irp,
 
         lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenRoot Increment count on Fcb %p Cnt %d\n",
                       VolumeCB->RootFcb,
-                      lCount);
+                      lCount));
 
         bReleaseFcb = TRUE;
 
@@ -1520,11 +1899,11 @@ AFSOpenRoot( IN PIRP Irp,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSOpenRoot (%p) Access check failure Status %08lX\n",
                               Irp,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -1542,11 +1921,11 @@ AFSOpenRoot( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSOpenRoot (%p) Failed to allocate Ccb Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1582,11 +1961,11 @@ AFSOpenRoot( IN PIRP Irp,
 
         lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenRoot Increment handle count on Fcb %p Cnt %d\n",
                       VolumeCB->RootFcb,
-                      lCount);
+                      lCount));
 
         //
         // Indicate the object is held
@@ -1611,11 +1990,11 @@ try_exit:
 
                 lCount = InterlockedDecrement( &VolumeCB->RootFcb->OpenReferenceCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSOpenRoot Decrement count on Fcb %p Cnt %d\n",
                               VolumeCB->RootFcb,
-                              lCount);
+                              lCount));
             }
 
             AFSReleaseResource( VolumeCB->RootFcb->Header.Resource);
@@ -1695,20 +2074,20 @@ AFSProcessCreate( IN PIRP               Irp,
             ulAttributes |= FILE_ATTRIBUTE_DIRECTORY;
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessCreate (%p) Creating file %wZ Attributes %08lX\n",
                       Irp,
                       FullFileName,
-                      ulAttributes);
+                      ulAttributes));
 
-        if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
+        if( BooleanFlagOn( VolumeCB->VolumeInformation.FileSystemAttributes, FILE_READ_ONLY_VOLUME))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessCreate Request failed due to read only volume %wZ\n",
-                          FullFileName);
+                          FullFileName));
 
             try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
         }
@@ -1730,12 +2109,12 @@ AFSProcessCreate( IN PIRP               Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessCreate (%p) Failed to create directory entry %wZ Status %08lX\n",
                           Irp,
                           FullFileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1748,7 +2127,7 @@ AFSProcessCreate( IN PIRP               Irp,
             pObjectInfo->FileType == AFS_FILE_TYPE_UNKNOWN)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSProcessCreate (%p) Evaluating object %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                           Irp,
@@ -1756,7 +2135,7 @@ AFSProcessCreate( IN PIRP               Irp,
                           pObjectInfo->FileId.Cell,
                           pObjectInfo->FileId.Volume,
                           pObjectInfo->FileId.Vnode,
-                          pObjectInfo->FileId.Unique);
+                          pObjectInfo->FileId.Unique));
 
             ntStatus = AFSEvaluateNode( AuthGroup,
                                         pDirEntry);
@@ -1770,7 +2149,7 @@ AFSProcessCreate( IN PIRP               Irp,
                     if ( !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
                                       "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != NULL Status %08lX\n",
                                       Irp,
@@ -1783,12 +2162,12 @@ AFSProcessCreate( IN PIRP               Irp,
                                       pParentObjectInfo->FileId.Volume,
                                       pParentObjectInfo->FileId.Vnode,
                                       pParentObjectInfo->FileId.Unique,
-                                      ntStatus);
+                                      ntStatus));
                     }
                     else if ( AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId))
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
                                       "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                       Irp,
@@ -1801,12 +2180,12 @@ AFSProcessCreate( IN PIRP               Irp,
                                       pParentObjectInfo->FileId.Volume,
                                       pParentObjectInfo->FileId.Vnode,
                                       pParentObjectInfo->FileId.Unique,
-                                      ntStatus);
+                                      ntStatus));
                     }
                     else
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
                                       "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                       Irp,
@@ -1823,13 +2202,13 @@ AFSProcessCreate( IN PIRP               Irp,
                                       pObjectInfo->ParentFileId.Volume,
                                       pObjectInfo->ParentFileId.Vnode,
                                       pObjectInfo->ParentFileId.Unique,
-                                      ntStatus);
+                                      ntStatus));
                     }
                 }
                 else
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                   Irp,
@@ -1838,7 +2217,7 @@ AFSProcessCreate( IN PIRP               Irp,
                                   pObjectInfo->FileId.Volume,
                                   pObjectInfo->FileId.Vnode,
                                   pObjectInfo->FileId.Unique,
-                                  ntStatus);
+                                  ntStatus));
                 }
 
                 try_return( ntStatus);
@@ -1865,12 +2244,12 @@ AFSProcessCreate( IN PIRP               Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessCreate (%p) Failed to initialize fcb %wZ Status %08lX\n",
                           Irp,
                           FullFileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1883,11 +2262,11 @@ AFSProcessCreate( IN PIRP               Irp,
 
         lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessCreate Increment count on Fcb %p Cnt %d\n",
                       *Fcb,
-                      lCount);
+                      lCount));
 
         bReleaseFcb = TRUE;
 
@@ -1903,12 +2282,12 @@ AFSProcessCreate( IN PIRP               Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessCreate (%p) Failed to initialize ccb %wZ Status %08lX\n",
                           Irp,
                           FullFileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1998,11 +2377,11 @@ AFSProcessCreate( IN PIRP               Irp,
 
         lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessCreate Increment handle count on Fcb %p Cnt %d\n",
                       (*Fcb),
-                      lCount);
+                      lCount));
 
         //
         // Increment the open reference and handle on the parent node
@@ -2010,19 +2389,19 @@ AFSProcessCreate( IN PIRP               Irp,
 
         lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessCreate Increment child open handle count on Parent object %p Cnt %d\n",
                       pParentObjectInfo,
-                      lCount);
+                      lCount));
 
         lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessCreate Increment child open ref count on Parent object %p Cnt %d\n",
                       pParentObjectInfo,
-                      lCount);
+                      lCount));
 
         if( ulOptions & FILE_DELETE_ON_CLOSE)
         {
@@ -2031,12 +2410,12 @@ AFSProcessCreate( IN PIRP               Irp,
             // Mark it for delete on close
             //
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSProcessCreate (%p) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
                           Irp,
                           pDirEntry,
-                          FullFileName);
+                          FullFileName));
 
             SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
         }
@@ -2070,11 +2449,11 @@ try_exit:
 
                 lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSProcessCreate Decrement count on Fcb %p Cnt %d\n",
                               *Fcb,
-                              lCount);
+                              lCount));
             }
 
             AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
@@ -2090,12 +2469,12 @@ try_exit:
 
             lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSProcessCreate Decrement count on %wZ DE %p Cnt %d\n",
                           &pDirEntry->NameInformation.FileName,
                           pDirEntry,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
         }
@@ -2106,12 +2485,12 @@ try_exit:
             if( bFileCreated)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSProcessCreate Create failed, removing DE %p from parent object %p Status %08lX\n",
                               pDirEntry,
                               pParentObjectInfo,
-                              ntStatus);
+                              ntStatus));
 
                 //
                 // Remove the dir entry from the parent
@@ -2195,11 +2574,11 @@ AFSOpenTargetDirectory( IN PIRP Irp,
 
         pFileObject = pIrpSp->FileObject;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenTargetDirectory (%p) Processing file %wZ\n",
                       Irp,
-                      TargetName);
+                      TargetName));
 
         pParentObject = ParentDirectoryCB->ObjectInformation;
 
@@ -2223,12 +2602,12 @@ AFSOpenTargetDirectory( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSOpenTargetDirectory (%p) Failed to initialize fcb %wZ Status %08lX\n",
                           Irp,
                           &ParentDirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2241,11 +2620,11 @@ AFSOpenTargetDirectory( IN PIRP Irp,
 
         lCount = InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenTargetDirectory Increment count on Fcb %p Cnt %d\n",
                       pParentObject->Fcb,
-                      lCount);
+                      lCount));
 
         bReleaseFcb = TRUE;
 
@@ -2265,12 +2644,12 @@ AFSOpenTargetDirectory( IN PIRP Irp,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSOpenTargetDirectory (%p) Access check failure %wZ Status %08lX\n",
                               Irp,
                               &ParentDirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -2288,12 +2667,12 @@ AFSOpenTargetDirectory( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSOpenTargetDirectory (%p) Failed to initialize ccb %wZ Status %08lX\n",
                           Irp,
                           &ParentDirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2354,11 +2733,11 @@ AFSOpenTargetDirectory( IN PIRP Irp,
 
         lCount = InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenTargetDirectory Increment handle count on Fcb %p Cnt %d\n",
                       pParentObject->Fcb,
-                      lCount);
+                      lCount));
 
         //
         // Increment the open reference and handle on the parent node
@@ -2368,26 +2747,27 @@ AFSOpenTargetDirectory( IN PIRP Irp,
         {
 
             pGrandParentObject = AFSFindObjectInfo( pParentObject->VolumeCB,
-                                                    &pParentObject->ParentFileId);
+                                                    &pParentObject->ParentFileId,
+                                                    TRUE);
 
             if ( pGrandParentObject)
             {
 
                 lCount = InterlockedIncrement( &pGrandParentObject->Specific.Directory.ChildOpenHandleCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSOpenTargetDirectory Increment child open handle count on Parent object %p Cnt %d\n",
                               pGrandParentObject,
-                              lCount);
+                              lCount));
 
                 lCount = InterlockedIncrement( &pGrandParentObject->Specific.Directory.ChildOpenReferenceCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSOpenTargetDirectory Increment child open ref count on Parent object %p Cnt %d\n",
                               pGrandParentObject,
-                              lCount);
+                              lCount));
 
                 AFSReleaseObjectInfo( &pGrandParentObject);
             }
@@ -2406,11 +2786,11 @@ try_exit:
 
                 lCount = InterlockedDecrement( &pParentObject->Fcb->OpenReferenceCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSOpenTargetDirectory Decrement count on Fcb %p Cnt %d\n",
                               pParentObject->Fcb,
-                              lCount);
+                              lCount));
             }
 
             AFSReleaseResource( &pParentObject->Fcb->NPFcb->Resource);
@@ -2445,6 +2825,7 @@ AFSProcessOpen( IN PIRP Irp,
                 IN AFSVolumeCB *VolumeCB,
                 IN AFSDirectoryCB *ParentDirCB,
                 IN AFSDirectoryCB *DirectoryCB,
+               IN BOOLEAN bOpenedReparsePoint,
                 OUT AFSFcb **Fcb,
                 OUT AFSCcb **Ccb)
 {
@@ -2489,12 +2870,12 @@ AFSProcessOpen( IN PIRP Irp,
 
             ntStatus = STATUS_DELETE_PENDING;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOpen (%p) Entry pending delete %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2511,18 +2892,18 @@ AFSProcessOpen( IN PIRP Irp,
 
         ntStatus = AFSValidateEntry( DirectoryCB,
                                      AuthGroup,
-                                     FALSE,
+                                    bOpenedReparsePoint,
                                      TRUE);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOpen (%p) Failed to validate entry %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2543,12 +2924,12 @@ AFSProcessOpen( IN PIRP Irp,
 
                 ntStatus = STATUS_CANNOT_DELETE;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSProcessOpen (%p) Cannot delete entry %wZ marked for delete on close Status %08lX\n",
                               Irp,
                               &DirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -2563,12 +2944,12 @@ AFSProcessOpen( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOpen (%p) Failed to init fcb on %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2587,11 +2968,11 @@ AFSProcessOpen( IN PIRP Irp,
 
         lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOpen Increment2 count on Fcb %p Cnt %d\n",
                       pObjectInfo->Fcb,
-                      lCount);
+                      lCount));
 
         //
         // Check access on the entry
@@ -2609,12 +2990,12 @@ AFSProcessOpen( IN PIRP Irp,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSProcessOpen (%p) Failed to check share access on %wZ Status %08lX\n",
                               Irp,
                               &DirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -2637,23 +3018,43 @@ AFSProcessOpen( IN PIRP Irp,
 
                 BOOLEAN bMmFlushed;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSProcessOpen Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                               &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                 TRUE);
 
-                bMmFlushed = MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                                  MmFlushForWrite);
+               __try
+               {
+
+                   bMmFlushed = MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                     MmFlushForWrite);
+               }
+               __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+               {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                   bMmFlushed = FALSE;
+
+                   ntStatus = GetExceptionCode();
+
+                   AFSDbgTrace(( 0,
+                                 0,
+                                 "EXCEPTION - AFSProcessOpen MmFlushImageSection failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                 pObjectInfo->FileId.Cell,
+                                 pObjectInfo->FileId.Volume,
+                                 pObjectInfo->FileId.Vnode,
+                                 pObjectInfo->FileId.Unique,
+                                 ntStatus));
+               }
+
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSProcessOpen Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                               &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
 
@@ -2663,12 +3064,12 @@ AFSProcessOpen( IN PIRP Irp,
                     ntStatus = BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE :
                                                                             STATUS_SHARING_VIOLATION;
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSProcessOpen (%p) Failed to flush image section %wZ Status %08lX\n",
                                   Irp,
                                   &DirectoryCB->NameInformation.FileName,
-                                  ntStatus);
+                                  ntStatus));
 
                     try_return( ntStatus);
                 }
@@ -2679,12 +3080,12 @@ AFSProcessOpen( IN PIRP Irp,
 
                 ntStatus = STATUS_NOT_A_DIRECTORY;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSProcessOpen (%p) Attempt to open file as directory %wZ Status %08lX\n",
                               Irp,
                               &DirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -2700,12 +3101,12 @@ AFSProcessOpen( IN PIRP Irp,
 
                 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSProcessOpen (%p) Attempt to open directory as file %wZ Status %08lX\n",
                               Irp,
                               &DirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -2756,12 +3157,12 @@ AFSProcessOpen( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOpen (%p) Failed open in service %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2783,14 +3184,14 @@ AFSProcessOpen( IN PIRP Irp,
 
             ntStatus = STATUS_ACCESS_DENIED;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOpen (%p) Failed to check access from service Desired %08lX Granted %08lX Entry %wZ Status %08lX\n",
                           Irp,
                           *pDesiredAccess,
                           stOpenResultCB.GrantedAccess,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2807,12 +3208,12 @@ AFSProcessOpen( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOpen (%p) Failed to initialize ccb %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2844,11 +3245,11 @@ AFSProcessOpen( IN PIRP Irp,
 
         lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOpen Increment handle count on Fcb %p Cnt %d\n",
                       pObjectInfo->Fcb,
-                      lCount);
+                      lCount));
 
         //
         // Increment the open reference and handle on the parent node
@@ -2856,19 +3257,19 @@ AFSProcessOpen( IN PIRP Irp,
 
         lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOpen Increment child open handle count on Parent object %p Cnt %d\n",
                       pParentObjectInfo,
-                      lCount);
+                      lCount));
 
         lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOpen Increment child open ref count on Parent object %p Cnt %d\n",
                       pParentObjectInfo,
-                      lCount);
+                      lCount));
 
         if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
         {
@@ -2877,12 +3278,12 @@ AFSProcessOpen( IN PIRP Irp,
             // Mark it for delete on close
             //
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSProcessOpen (%p) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
                           Irp,
                           DirectoryCB,
-                          &DirectoryCB->NameInformation.FileName);
+                          &DirectoryCB->NameInformation.FileName));
 
             SetFlag( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
         }
@@ -2914,11 +3315,11 @@ try_exit:
 
                 lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSProcessOpen Decrement2 count on Fcb %p Cnt %d\n",
                               pObjectInfo->Fcb,
-                              lCount);
+                              lCount));
             }
 
             AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
@@ -3011,14 +3412,14 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
 
         ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
 
-        if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
+        if( BooleanFlagOn( VolumeCB->VolumeInformation.FileSystemAttributes, FILE_READ_ONLY_VOLUME))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOverwriteSupersede Request failed on %wZ due to read only volume\n",
                           Irp,
-                          &DirectoryCB->NameInformation.FileName);
+                          &DirectoryCB->NameInformation.FileName));
 
             try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
         }
@@ -3042,16 +3443,28 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOverwriteSupersede (%p) Failed to validate entry %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
 
+       if ( BooleanFlagOn( pObjectInfo->FileAttributes, FILE_ATTRIBUTE_READONLY))
+       {
+
+           AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                         AFS_TRACE_LEVEL_WARNING,
+                         "AFSProcessOverwriteSupersede Request failed on %wZ due to read only file attribute\n",
+                         Irp,
+                         &DirectoryCB->NameInformation.FileName));
+
+           try_return( ntStatus = STATUS_ACCESS_DENIED);
+       }
+
         //
         // Be sure we have an Fcb for the object block
         //
@@ -3063,12 +3476,12 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOverwriteSupersede (%p) Failed to initialize fcb %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -3081,11 +3494,11 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
 
         lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOverwriteSupersede Increment2 count on Fcb %p Cnt %d\n",
                       pObjectInfo->Fcb,
-                      lCount);
+                      lCount));
 
         bReleaseFcb = TRUE;
 
@@ -3105,39 +3518,59 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSProcessOverwriteSupersede (%p) Access check failure %wZ Status %08lX\n",
                               Irp,
                               &DirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOverwriteSupercede Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                       &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
                         TRUE);
 
-        //
-        //  Before we actually truncate, check to see if the purge
-        //  is going to fail.
-        //
+       __try
+       {
 
-        bUserMapped = !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                             &liZero);
+           //
+           //  Before we actually truncate, check to see if the purge
+           //  is going to fail.
+           //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+           bUserMapped = !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                &liZero);
+       }
+       __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+       {
+
+           bUserMapped = FALSE;
+
+           ntStatus = GetExceptionCode();
+
+           AFSDbgTrace(( 0,
+                         0,
+                         "EXCEPTION - AFSProcessOverwriteSupercede MmCanFileBeTruncated failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                         pObjectInfo->FileId.Cell,
+                         pObjectInfo->FileId.Volume,
+                         pObjectInfo->FileId.Vnode,
+                         pObjectInfo->FileId.Unique,
+                         ntStatus));
+       }
+
+       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOverwriteSupercede Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                       &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
 
@@ -3146,12 +3579,12 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
 
             ntStatus = STATUS_USER_MAPPED_FILE;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOverwriteSupersede (%p) File user mapped %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -3168,12 +3601,12 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOverwriteSupersede (%p) Failed to initialize ccb %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -3238,12 +3671,12 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
             pObjectInfo->Fcb->ObjectInformation->EndOfFile = liSaveSize;
             pObjectInfo->Fcb->ObjectInformation->AllocationSize = liSaveAlloc;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOverwriteSupersede (%p) Failed to update file information %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -3302,11 +3735,11 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
 
         lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOverwriteSupersede Increment handle count on Fcb %p Cnt %d\n",
                       pObjectInfo->Fcb,
-                      lCount);
+                      lCount));
 
         //
         // Increment the open reference and handle on the parent node
@@ -3314,19 +3747,19 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
 
         lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOverwriteSupersede Increment child open handle count on Parent object %p Cnt %d\n",
                       pParentObjectInfo,
-                      lCount);
+                      lCount));
 
         lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOverwriteSupersede Increment child open ref count on Parent object %p Cnt %d\n",
                       pParentObjectInfo,
-                      lCount);
+                      lCount));
 
         AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
 
@@ -3368,11 +3801,11 @@ try_exit:
 
                 lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSProcessOverwriteSupersede Decrement2 count on Fcb %p Cnt %d\n",
                               pObjectInfo->Fcb,
-                              lCount);
+                              lCount));
             }
 
             AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
@@ -3486,11 +3919,11 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSOpenIOCtlFcb (%p) Failed to initialize fcb Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -3503,11 +3936,11 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
 
         lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenIOCtlFcb Increment count on Fcb %p Cnt %d\n",
                       (*Fcb),
-                      lCount);
+                      lCount));
 
         bReleaseFcb = TRUE;
 
@@ -3523,11 +3956,11 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSOpenIOCtlFcb (%p) Failed to initialize ccb Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -3575,11 +4008,11 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSOpenIOCtlFcb (%p) Failed service open Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -3590,11 +4023,11 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
 
         lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenIOCtlFcb Increment handle count on Fcb %p Cnt %d\n",
                       (*Fcb),
-                      lCount);
+                      lCount));
 
         //
         // Increment the open reference and handle on the parent node
@@ -3602,19 +4035,19 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
 
         lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenIOCtlFcb Increment child open handle count on Parent object %p Cnt %d\n",
                       pParentObjectInfo,
-                      lCount);
+                      lCount));
 
         lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenIOCtlFcb Increment child open ref count on Parent object %p Cnt %d\n",
                       pParentObjectInfo,
-                      lCount);
+                      lCount));
 
         //
         // Return the open result for this file
@@ -3639,11 +4072,11 @@ try_exit:
 
                 lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSOpenIOCtlFcb Decrement count on Fcb %p Cnt %d\n",
                               (*Fcb),
-                              lCount);
+                              lCount));
             }
 
             AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
@@ -3694,11 +4127,11 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
 
         pFileObject = pIrpSp->FileObject;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
                       "AFSOpenSpecialShareFcb (%p) Processing Share %wZ open\n",
                       Irp,
-                      &DirectoryCB->NameInformation.FileName);
+                      &DirectoryCB->NameInformation.FileName));
 
         pObjectInfo = DirectoryCB->ObjectInformation;
 
@@ -3706,13 +4139,16 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
         {
 
             pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
-                                                   &pObjectInfo->ParentFileId);
-        }
+                                                   &pObjectInfo->ParentFileId,
+                                                  TRUE);
+       }
 
-        if( DirectoryCB->ObjectInformation->Fcb == NULL)
-        {
+       *Fcb = pObjectInfo->Fcb;
 
-            //
+       if( *Fcb == NULL)
+       {
+
+           //
             // Allocate and initialize the Fcb for the file.
             //
 
@@ -3723,11 +4159,11 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSOpenSpecialShareFcb (%p) Failed to initialize fcb Status %08lX\n",
                               Irp,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -3743,8 +4179,6 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
         else
         {
 
-            *Fcb = pObjectInfo->Fcb;
-
             AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
                             TRUE);
         }
@@ -3755,11 +4189,11 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
 
         lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenSpecialShareFcb Increment count on Fcb %p Cnt %d\n",
                       (*Fcb),
-                      lCount);
+                      lCount));
 
         bReleaseFcb = TRUE;
 
@@ -3775,11 +4209,11 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSOpenSpecialShareFcb (%p) Failed to initialize ccb Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -3818,22 +4252,22 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSOpenSpecialShareFcb (%p) Failed service open Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
 
         lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenSpecialShareFcb Increment handle count on Fcb %p Cnt %d\n",
                       (*Fcb),
-                      lCount);
+                      lCount));
 
         //
         // Increment the open reference and handle on the parent node
@@ -3841,19 +4275,19 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
 
         lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenSpecialShareFcb Increment child open handle count on Parent object %p Cnt %d\n",
                       pParentObjectInfo,
-                      lCount);
+                      lCount));
 
         lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenSpecialShareFcb Increment child open ref count on Parent object %p Cnt %d\n",
                       pParentObjectInfo,
-                      lCount);
+                      lCount));
 
         //
         // Return the open result for this file
@@ -3874,11 +4308,11 @@ try_exit:
 
                 lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSOpenSpecialShareFcb Decrement count on Fcb %p Cnt %d\n",
                               (*Fcb),
-                              lCount);
+                              lCount));
             }
 
             AFSReleaseResource( &(*Fcb)->NPFcb->Resource);