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
//