From d57d87a87a6041b1596532c7fe08795ae9d91b95 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 11 Aug 2014 01:28:12 -0400 Subject: [PATCH] Windows: Refactor AFSParseName related name parsing 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 Reviewed-by: Jeffrey Altman --- .../afsrdr/kernel/lib/AFSNameSupport.cpp | 588 ++++++++++-------- 1 file changed, 330 insertions(+), 258 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp index a32de1d17..ead1b2b17 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp @@ -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 // -- 2.39.5