]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Windows: Refactor AFSParseName related name parsing
authorJeffrey Altman <jaltman@your-file-system.com>
Mon, 11 Aug 2014 05:28:12 +0000 (01:28 -0400)
committerJeffrey Altman <jaltman@your-file-system.com>
Wed, 20 Aug 2014 16:48:47 +0000 (12:48 -0400)
AFSParseName() is a very long complex function.  Extract the parsing
of RelatedFileObject name parsing to a new function AFSParseRelatedName().
This removed ~160 lines of source code out of AFSParseName().

This changeset is not intended to introduce any functional changes.

Change-Id: If04a1bee0c104461f2d8bc33bca426e9ff71be74
Reviewed-on: http://gerrit.openafs.org/11394
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>
src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp

index a32de1d177165b42b40ccd53a680267430345505..ead1b2b17bd701f7c45b21ffd9eca96608b1df83 100644 (file)
@@ -3076,368 +3076,440 @@ AFSFixupTargetName( IN OUT PUNICODE_STRING FileName,
     return ntStatus;
 }
 
-NTSTATUS
-AFSParseName( IN PIRP Irp,
-              IN GUID *AuthGroup,
-              OUT PUNICODE_STRING FileName,
-              OUT PUNICODE_STRING ParsedFileName,
-              OUT PUNICODE_STRING RootFileName,
-              OUT ULONG *ParseFlags,
-              OUT AFSVolumeCB   **VolumeCB,
-              OUT AFSDirectoryCB **ParentDirectoryCB,
-              OUT AFSNameArrayHdr **NameArray)
+static NTSTATUS
+AFSParseRelatedName( IN PIRP Irp,
+                    IN GUID *AuthGroup,
+                    OUT PUNICODE_STRING FileName,
+                    OUT PUNICODE_STRING ParsedFileName,
+                    OUT PUNICODE_STRING RootFileName,
+                    OUT ULONG *ParseFlags,
+                    OUT AFSVolumeCB   **VolumeCB,
+                    OUT AFSDirectoryCB **ParentDirectoryCB,
+                    OUT AFSNameArrayHdr **NameArray)
 {
-
     NTSTATUS            ntStatus = STATUS_SUCCESS;
     PIO_STACK_LOCATION  pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     AFSDeviceExt       *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
-    UNICODE_STRING      uniFullName, uniComponentName, uniRemainingPath;
-    ULONG               ulCRC = 0;
-    AFSDirectoryCB     *pDirEntry = NULL;
-    USHORT              usIndex = 0, usDriveIndex = 0;
     AFSCcb             *pRelatedCcb = NULL;
-    AFSNameArrayHdr    *pNameArray = NULL, *pRelatedNameArray = NULL;
+    AFSFcb             *pRelatedFcb = NULL;
+    AFSNameArrayHdr    *pRelatedNameArray = NULL;
+    UNICODE_STRING      uniFullName;
+    AFSDirectoryCB     *pDirEntry = NULL;
+    AFSNameArrayHdr    *pNameArray = NULL;
     USHORT              usComponentIndex = 0;
     USHORT              usComponentLength = 0;
     AFSVolumeCB        *pVolumeCB = NULL;
-    AFSFcb             *pRelatedFcb = NULL;
-    BOOLEAN             bReleaseTreeLock = FALSE;
-    BOOLEAN             bIsAllShare = FALSE;
-    LONG                lCount;
+     LONG                lCount;
 
-    __Enter
-    {
+     __Enter
+     {
 
-        //
-        // Indicate we are opening a root ...
-        //
+        pRelatedFcb = (AFSFcb *)pIrpSp->FileObject->RelatedFileObject->FsContext;
 
-        *ParseFlags = AFS_PARSE_FLAG_ROOT_ACCESS;
+        pRelatedCcb = (AFSCcb *)pIrpSp->FileObject->RelatedFileObject->FsContext2;
 
-        *ParentDirectoryCB = NULL;
+        pRelatedNameArray = pRelatedCcb->NameArray;
 
-        if( pIrpSp->FileObject->RelatedFileObject != NULL)
-        {
+        uniFullName = pIrpSp->FileObject->FileName;
 
-            pRelatedFcb = (AFSFcb *)pIrpSp->FileObject->RelatedFileObject->FsContext;
+        ASSERT( pRelatedFcb != NULL);
 
-            pRelatedCcb = (AFSCcb *)pIrpSp->FileObject->RelatedFileObject->FsContext2;
+        //
+        // No wild cards in the name
+        //
 
-            pRelatedNameArray = pRelatedCcb->NameArray;
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                      AFS_TRACE_LEVEL_VERBOSE_2,
+                      "AFSParseNameRelated (%p) Relative open for %wZ FID %08lX-%08lX-%08lX-%08lX component %wZ\n",
+                      Irp,
+                      &pRelatedCcb->DirectoryCB->NameInformation.FileName,
+                      pRelatedFcb->ObjectInformation->FileId.Cell,
+                      pRelatedFcb->ObjectInformation->FileId.Volume,
+                      pRelatedFcb->ObjectInformation->FileId.Vnode,
+                      pRelatedFcb->ObjectInformation->FileId.Unique,
+                      &uniFullName));
 
-            uniFullName = pIrpSp->FileObject->FileName;
+        if( FsRtlDoesNameContainWildCards( &uniFullName))
+        {
 
-            ASSERT( pRelatedFcb != NULL);
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSParseNameRelated (%p) Component %wZ contains wild cards\n",
+                          Irp,
+                          &uniFullName));
 
-            //
-            // No wild cards in the name
-            //
+            try_return( ntStatus = STATUS_OBJECT_NAME_INVALID);
+        }
 
-            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE_2,
-                          "AFSParseName (%p) Relative open for %wZ FID %08lX-%08lX-%08lX-%08lX component %wZ\n",
-                          Irp,
-                          &pRelatedCcb->DirectoryCB->NameInformation.FileName,
-                          pRelatedFcb->ObjectInformation->FileId.Cell,
-                          pRelatedFcb->ObjectInformation->FileId.Volume,
-                          pRelatedFcb->ObjectInformation->FileId.Vnode,
-                          pRelatedFcb->ObjectInformation->FileId.Unique,
-                          &uniFullName));
+        pVolumeCB = pRelatedFcb->ObjectInformation->VolumeCB;
 
-            if( FsRtlDoesNameContainWildCards( &uniFullName))
-            {
+        pDirEntry = pRelatedCcb->DirectoryCB;
 
-                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%p) Component %wZ contains wild cards\n",
-                              Irp,
-                              &uniFullName));
+        *FileName = pIrpSp->FileObject->FileName;
 
-                try_return( ntStatus = STATUS_OBJECT_NAME_INVALID);
-            }
+        //
+        // Grab the root node while checking state
+        //
 
-            pVolumeCB = pRelatedFcb->ObjectInformation->VolumeCB;
+        AFSAcquireShared( pVolumeCB->VolumeLock,
+                          TRUE);
 
-            pDirEntry = pRelatedCcb->DirectoryCB;
+        if( BooleanFlagOn( pVolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
+            BooleanFlagOn( pVolumeCB->Flags, AFS_VOLUME_FLAGS_OFFLINE))
+        {
 
-            *FileName = pIrpSp->FileObject->FileName;
+            //
+            // The volume has been taken off line so fail the access
+            //
 
-            //
-            // Grab the root node while checking state
-            //
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSParseNameRelated (%p) Volume %08lX:%08lX OFFLINE/INVALID\n",
+                          Irp,
+                          pVolumeCB->ObjectInformation.FileId.Cell,
+                          pVolumeCB->ObjectInformation.FileId.Volume));
 
-            AFSAcquireShared( pVolumeCB->VolumeLock,
-                              TRUE);
+            AFSReleaseResource( pVolumeCB->VolumeLock);
 
-            if( BooleanFlagOn( pVolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
-                BooleanFlagOn( pVolumeCB->Flags, AFS_VOLUME_FLAGS_OFFLINE))
-            {
+            try_return( ntStatus = STATUS_DEVICE_NOT_READY);
+        }
 
-                //
-                // The volume has been taken off line so fail the access
-                //
+        if( BooleanFlagOn( pVolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_VERIFY))
+        {
 
-                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%p) Volume %08lX:%08lX OFFLINE/INVALID\n",
-                              Irp,
-                              pVolumeCB->ObjectInformation.FileId.Cell,
-                              pVolumeCB->ObjectInformation.FileId.Volume));
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSParseNameRelated (%p) Verifying root of volume %08lX:%08lX\n",
+                          Irp,
+                          pVolumeCB->ObjectInformation.FileId.Cell,
+                          pVolumeCB->ObjectInformation.FileId.Volume));
 
-                AFSReleaseResource( pVolumeCB->VolumeLock);
+            ntStatus = AFSVerifyVolume( (ULONGLONG)PsGetCurrentProcessId(),
+                                        pVolumeCB);
 
-                try_return( ntStatus = STATUS_DEVICE_NOT_READY);
-            }
+            if( !NT_SUCCESS( ntStatus))
+            {
 
-            if( BooleanFlagOn( pVolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_VERIFY))
-            {
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                              AFS_TRACE_LEVEL_ERROR,
+                              "AFSParseNameRelated (%p) Failed verification of root Status %08lX\n",
+                              Irp,
+                              ntStatus));
 
-                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSParseName (%p) Verifying root of volume %08lX:%08lX\n",
-                              Irp,
-                              pVolumeCB->ObjectInformation.FileId.Cell,
-                              pVolumeCB->ObjectInformation.FileId.Volume));
+                AFSReleaseResource( pVolumeCB->VolumeLock);
 
-                ntStatus = AFSVerifyVolume( (ULONGLONG)PsGetCurrentProcessId(),
-                                            pVolumeCB);
+                try_return( ntStatus);
+            }
+        }
 
-                if( !NT_SUCCESS( ntStatus))
-                {
+        AFSReleaseResource( pVolumeCB->VolumeLock);
 
-                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_ERROR,
-                                  "AFSParseName (%p) Failed verification of root Status %08lX\n",
-                                  Irp,
-                                  ntStatus));
+        if( BooleanFlagOn( pDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY))
+        {
 
-                    AFSReleaseResource( pVolumeCB->VolumeLock);
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSParseNameRelated (%p) Verifying parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                          Irp,
+                          &pDirEntry->NameInformation.FileName,
+                          pDirEntry->ObjectInformation->FileId.Cell,
+                          pDirEntry->ObjectInformation->FileId.Volume,
+                          pDirEntry->ObjectInformation->FileId.Vnode,
+                          pDirEntry->ObjectInformation->FileId.Unique));
 
-                    try_return( ntStatus);
-                }
-            }
+            //
+            // Directory TreeLock should be exclusively held
+            //
 
-            AFSReleaseResource( pVolumeCB->VolumeLock);
+            AFSAcquireExcl( pDirEntry->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                            TRUE);
 
-            if( BooleanFlagOn( pDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY))
-            {
+            ntStatus = AFSVerifyEntry( AuthGroup,
+                                       pDirEntry,
+                                       FALSE);
 
-                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSParseName (%p) Verifying parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
-                              Irp,
-                              &pDirEntry->NameInformation.FileName,
-                              pDirEntry->ObjectInformation->FileId.Cell,
-                              pDirEntry->ObjectInformation->FileId.Volume,
-                              pDirEntry->ObjectInformation->FileId.Vnode,
-                              pDirEntry->ObjectInformation->FileId.Unique));
+            AFSReleaseResource( pDirEntry->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
 
-                //
-                // Directory TreeLock should be exclusively held
-                //
+            if( !NT_SUCCESS( ntStatus))
+            {
 
-                AFSAcquireExcl( pDirEntry->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
-                                TRUE);
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSParseNameRelated (%p) Failed verification of parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                              Irp,
+                              &pDirEntry->NameInformation.FileName,
+                              pDirEntry->ObjectInformation->FileId.Cell,
+                              pDirEntry->ObjectInformation->FileId.Volume,
+                              pDirEntry->ObjectInformation->FileId.Vnode,
+                              pDirEntry->ObjectInformation->FileId.Unique,
+                              ntStatus));
 
-                ntStatus = AFSVerifyEntry( AuthGroup,
-                                          pDirEntry,
-                                          FALSE);
+                try_return( ntStatus);
+            }
+        }
 
-                AFSReleaseResource( pDirEntry->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+        //
+        // Create our full path name buffer
+        //
 
-                if( !NT_SUCCESS( ntStatus))
-                {
+        uniFullName.MaximumLength = pRelatedCcb->FullFileName.Length
+            + sizeof( WCHAR) + pIrpSp->FileObject->FileName.Length
+            + sizeof( WCHAR);
 
-                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSParseName (%p) Failed verification of parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
-                                  Irp,
-                                  &pDirEntry->NameInformation.FileName,
-                                  pDirEntry->ObjectInformation->FileId.Cell,
-                                  pDirEntry->ObjectInformation->FileId.Volume,
-                                  pDirEntry->ObjectInformation->FileId.Vnode,
-                                  pDirEntry->ObjectInformation->FileId.Unique,
-                                  ntStatus));
+        uniFullName.Length = 0;
 
-                    try_return( ntStatus);
-                }
-            }
+        uniFullName.Buffer = (WCHAR *)AFSExAllocatePoolWithTag( PagedPool,
+                                                                uniFullName.MaximumLength,
+                                                                AFS_NAME_BUFFER_THREE_TAG);
 
-            //
-            // Create our full path name buffer
-            //
+        if( uniFullName.Buffer == NULL)
+        {
 
-            uniFullName.MaximumLength = pRelatedCcb->FullFileName.Length +
-                                                    sizeof( WCHAR) +
-                                                    pIrpSp->FileObject->FileName.Length +
-                                                    sizeof( WCHAR);
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSParseNameRelated (%p) Failed to allocate full name buffer\n",
+                          Irp));
 
-            uniFullName.Length = 0;
+            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+        }
 
-            uniFullName.Buffer = (WCHAR *)AFSExAllocatePoolWithTag( PagedPool,
-                                                                    uniFullName.MaximumLength,
-                                                                    AFS_NAME_BUFFER_THREE_TAG);
+        SetFlag( *ParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
 
-            if( uniFullName.Buffer == NULL)
-            {
+        RtlZeroMemory( uniFullName.Buffer,
+                       uniFullName.MaximumLength);
 
-                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%p) Failed to allocate full name buffer\n",
-                              Irp));
+        RtlCopyMemory( uniFullName.Buffer,
+                       pRelatedCcb->FullFileName.Buffer,
+                       pRelatedCcb->FullFileName.Length);
 
-                try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
-            }
+        uniFullName.Length = pRelatedCcb->FullFileName.Length;
 
-            RtlZeroMemory( uniFullName.Buffer,
-                           uniFullName.MaximumLength);
+        usComponentIndex = (USHORT)(uniFullName.Length/sizeof( WCHAR));
 
-            RtlCopyMemory( uniFullName.Buffer,
-                           pRelatedCcb->FullFileName.Buffer,
-                           pRelatedCcb->FullFileName.Length);
+        usComponentLength = pIrpSp->FileObject->FileName.Length;
 
-            uniFullName.Length = pRelatedCcb->FullFileName.Length;
+        if( uniFullName.Buffer[ (uniFullName.Length/sizeof( WCHAR)) - 1] != L'\\' &&
+            pIrpSp->FileObject->FileName.Length > 0 &&
+            pIrpSp->FileObject->FileName.Buffer[ 0] != L'\\' &&
+            pIrpSp->FileObject->FileName.Buffer[ 0] != L':')
+        {
 
-            usComponentIndex = (USHORT)(uniFullName.Length/sizeof( WCHAR));
+            uniFullName.Buffer[ (uniFullName.Length/sizeof( WCHAR))] = L'\\';
 
-            usComponentLength = pIrpSp->FileObject->FileName.Length;
+            uniFullName.Length += sizeof( WCHAR);
 
-            if( uniFullName.Buffer[ (uniFullName.Length/sizeof( WCHAR)) - 1] != L'\\' &&
-                pIrpSp->FileObject->FileName.Length > 0 &&
-                pIrpSp->FileObject->FileName.Buffer[ 0] != L'\\' &&
-                pIrpSp->FileObject->FileName.Buffer[ 0] != L':')
-            {
+            usComponentLength += sizeof( WCHAR);
+        }
 
-                uniFullName.Buffer[ (uniFullName.Length/sizeof( WCHAR))] = L'\\';
+        if( pIrpSp->FileObject->FileName.Length > 0)
+        {
 
-                uniFullName.Length += sizeof( WCHAR);
+            RtlCopyMemory( &uniFullName.Buffer[ uniFullName.Length/sizeof( WCHAR)],
+                           pIrpSp->FileObject->FileName.Buffer,
+                           pIrpSp->FileObject->FileName.Length);
 
-                usComponentLength += sizeof( WCHAR);
-            }
+            uniFullName.Length += pIrpSp->FileObject->FileName.Length;
+        }
 
-            if( pIrpSp->FileObject->FileName.Length > 0)
-            {
+        *RootFileName = uniFullName;
 
-                RtlCopyMemory( &uniFullName.Buffer[ uniFullName.Length/sizeof( WCHAR)],
-                               pIrpSp->FileObject->FileName.Buffer,
-                               pIrpSp->FileObject->FileName.Length);
+        //
+        // We populate up to the current parent
+        //
 
-                uniFullName.Length += pIrpSp->FileObject->FileName.Length;
-            }
+        if( pRelatedNameArray == NULL)
+        {
 
-            *RootFileName = uniFullName;
+            //
+            // Init and populate our name array
+            //
 
-            //
-            // We populate up to the current parent
-            //
+            pNameArray = AFSInitNameArray( NULL,
+                                           0);
 
-            if( pRelatedNameArray == NULL)
-            {
+            if( pNameArray == NULL)
+            {
 
-                //
-                // Init and populate our name array
-                //
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSParseNameRelated (%p) Failed to initialize name array\n",
+                              Irp));
 
-                pNameArray = AFSInitNameArray( NULL,
-                                               0);
+                AFSExFreePoolWithTag( uniFullName.Buffer, 0);
 
-                if( pNameArray == NULL)
-                {
+                ClearFlag( *ParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
 
-                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSParseName (%p) Failed to initialize name array\n",
-                                  Irp));
+                try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+            }
 
-                    AFSExFreePoolWithTag( uniFullName.Buffer, 0);
+            ntStatus = AFSPopulateNameArray( pNameArray,
+                                             NULL,
+                                             pRelatedCcb->DirectoryCB);
+        }
+        else
+        {
 
-                    try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
-                }
+            //
+            // Init and populate our name array
+            //
 
-                ntStatus = AFSPopulateNameArray( pNameArray,
-                                                 NULL,
-                                                 pRelatedCcb->DirectoryCB);
-            }
-            else
-            {
+            pNameArray = AFSInitNameArray( NULL,
+                                           pRelatedNameArray->MaxElementCount);
 
-                //
-                // Init and populate our name array
-                //
+            if( pNameArray == NULL)
+            {
 
-                pNameArray = AFSInitNameArray( NULL,
-                                               pRelatedNameArray->MaxElementCount);
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSParseNameRelated (%p) Failed to initialize name array\n",
+                              Irp));
 
-                if( pNameArray == NULL)
-                {
+                AFSExFreePoolWithTag( uniFullName.Buffer, 0);
 
-                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSParseName (%p) Failed to initialize name array\n",
-                                  Irp));
+                ClearFlag( *ParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
 
-                    AFSExFreePoolWithTag( uniFullName.Buffer, 0);
+                try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+            }
 
-                    try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
-                }
+            ntStatus = AFSPopulateNameArrayFromRelatedArray( pNameArray,
+                                                             pRelatedNameArray,
+                                                             pRelatedCcb->DirectoryCB);
+        }
 
-                ntStatus = AFSPopulateNameArrayFromRelatedArray( pNameArray,
-                                                                 pRelatedNameArray,
-                                                                 pRelatedCcb->DirectoryCB);
-            }
+        if( !NT_SUCCESS( ntStatus))
+        {
 
-            if( !NT_SUCCESS( ntStatus))
-            {
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSParseNameRelated (%p) Failed to populate name array\n",
+                          Irp));
 
-                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSParseName (%p) Failed to populate name array\n",
-                              Irp));
+            AFSExFreePoolWithTag( uniFullName.Buffer, 0);
 
-                AFSExFreePoolWithTag( uniFullName.Buffer, 0);
+            ClearFlag( *ParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
 
-                try_return( ntStatus);
-            }
+            try_return( ntStatus);
+        }
 
-            ParsedFileName->Length = usComponentLength;
-            ParsedFileName->MaximumLength = uniFullName.MaximumLength;
+        ParsedFileName->Length = usComponentLength;
 
-            ParsedFileName->Buffer = &uniFullName.Buffer[ usComponentIndex];
+        ParsedFileName->MaximumLength = uniFullName.MaximumLength;
 
-            //
-            // Indicate to caller that RootFileName must be freed
-            //
+        ParsedFileName->Buffer = &uniFullName.Buffer[ usComponentIndex];
 
-            SetFlag( *ParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
+        *NameArray = pNameArray;
 
-            *NameArray = pNameArray;
+        //
+        // Increment our volume reference count
+        //
 
-            //
-            // Increment our volume reference count
-            //
+        lCount = AFSVolumeIncrement( pVolumeCB,
+                                     AFS_VOLUME_REFERENCE_PARSE_NAME);
 
-            lCount = AFSVolumeIncrement( pVolumeCB,
-                                         AFS_VOLUME_REFERENCE_PARSE_NAME);
+        AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSParseNameRelated Increment count on volume %p Cnt %d\n",
+                      pVolumeCB,
+                      lCount));
 
-            AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSParseName Increment count on volume %p Cnt %d\n",
-                          pVolumeCB,
-                          lCount));
+        *VolumeCB = pVolumeCB;
 
-            *VolumeCB = pVolumeCB;
+        *ParentDirectoryCB = pDirEntry;
 
-            *ParentDirectoryCB = pDirEntry;
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                      AFS_TRACE_LEVEL_VERBOSE_2,
+                      "AFSParseNameRelated (%p) Returning full name %wZ\n",
+                      Irp,
+                      &uniFullName));
 
-            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE_2,
-                          "AFSParseName (%p) Returning full name %wZ\n",
-                          Irp,
-                          &uniFullName));
+        try_return( ntStatus);
 
-            try_return( ntStatus);
+try_exit:
+
+        if( NT_SUCCESS( ntStatus))
+        {
+
+            if( *ParentDirectoryCB != NULL)
+            {
+
+                lCount = InterlockedIncrement( &(*ParentDirectoryCB)->DirOpenReferenceCount);
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSParseRelatedName Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
+                              &(*ParentDirectoryCB)->NameInformation.FileName,
+                              (*ParentDirectoryCB),
+                              NULL,
+                              lCount));
+            }
+        }
+
+        if( *VolumeCB != NULL)
+        {
+            ASSERT( (*VolumeCB)->VolumeReferenceCount > 0);
+        }
+
+        if( ntStatus != STATUS_SUCCESS)
+        {
+
+            if( pNameArray != NULL)
+            {
+
+                AFSFreeNameArray( pNameArray);
+            }
+        }
+     }
+
+    return ntStatus;
+}
+
+NTSTATUS
+AFSParseName( IN PIRP Irp,
+             IN GUID *AuthGroup,
+             OUT PUNICODE_STRING FileName,
+             OUT PUNICODE_STRING ParsedFileName,
+             OUT PUNICODE_STRING RootFileName,
+             OUT ULONG *ParseFlags,
+             OUT AFSVolumeCB   **VolumeCB,
+             OUT AFSDirectoryCB **ParentDirectoryCB,
+             OUT AFSNameArrayHdr **NameArray)
+{
+
+    NTSTATUS            ntStatus = STATUS_SUCCESS;
+    PIO_STACK_LOCATION  pIrpSp = IoGetCurrentIrpStackLocation( Irp);
+    AFSDeviceExt       *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
+    UNICODE_STRING      uniFullName, uniComponentName, uniRemainingPath;
+    ULONG               ulCRC = 0;
+    AFSDirectoryCB     *pDirEntry = NULL;
+    USHORT              usIndex = 0, usDriveIndex = 0;
+    AFSNameArrayHdr    *pNameArray = NULL;
+    USHORT              usComponentIndex = 0;
+    USHORT              usComponentLength = 0;
+    AFSVolumeCB        *pVolumeCB = NULL;
+    BOOLEAN             bReleaseTreeLock = FALSE;
+    BOOLEAN             bIsAllShare = FALSE;
+    LONG                lCount;
+
+    __Enter
+    {
+
+       if( pIrpSp->FileObject->RelatedFileObject != NULL)
+       {
+
+           return AFSParseRelatedName( Irp, AuthGroup, FileName,
+                                       ParsedFileName, RootFileName,
+                                       ParseFlags, VolumeCB,
+                                       ParentDirectoryCB, NameArray);
         }
 
+       //
+       // Indicate we are opening a root ...
+       //
+
+       *ParseFlags = AFS_PARSE_FLAG_ROOT_ACCESS;
+
+       *ParentDirectoryCB = NULL;
+
         //
         // No wild cards in the name
         //