UNREFERENCED_PARAMETER(DirectoryCB);
NTSTATUS ntStatus = STATUS_INFO_LENGTH_MISMATCH;
- ULONG ulCopyLength = 0;
- ULONG cchCopied = 0;
AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
- BOOLEAN bAddLeadingSlash = FALSE;
- BOOLEAN bAddTrailingSlash = FALSE;
- USHORT usFullNameLength = 0;
pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
if( *Length >= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
{
- RtlZeroMemory( Buffer,
- *Length);
-
- if( pCcb->FullFileName.Length == 0 ||
- pCcb->FullFileName.Buffer[ 0] != L'\\')
- {
- bAddLeadingSlash = TRUE;
- }
-
- if( pFcb->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY &&
- pCcb->FullFileName.Length > 0 &&
- pCcb->FullFileName.Buffer[ (pCcb->FullFileName.Length/sizeof( WCHAR)) - 1] != L'\\')
- {
- bAddTrailingSlash = TRUE;
- }
-
- usFullNameLength = sizeof( WCHAR) +
- AFSServerName.Length +
- pCcb->FullFileName.Length;
-
- if( bAddLeadingSlash)
- {
- usFullNameLength += sizeof( WCHAR);
- }
-
- if( bAddTrailingSlash)
- {
- usFullNameLength += sizeof( WCHAR);
- }
-
- if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
- {
-
- ulCopyLength = (LONG)usFullNameLength;
-
- ntStatus = STATUS_SUCCESS;
- }
- else
- {
-
- ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
-
- ntStatus = STATUS_BUFFER_OVERFLOW;
- }
-
- Buffer->FileNameLength = (ULONG)usFullNameLength;
-
- *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
-
- if( ulCopyLength > 0)
- {
-
- Buffer->FileName[ 0] = L'\\';
- ulCopyLength -= sizeof( WCHAR);
-
- *Length -= sizeof( WCHAR);
- cchCopied += 1;
-
- if( ulCopyLength >= AFSServerName.Length)
- {
-
- RtlCopyMemory( &Buffer->FileName[ 1],
- AFSServerName.Buffer,
- AFSServerName.Length);
-
- ulCopyLength -= AFSServerName.Length;
- *Length -= AFSServerName.Length;
- cchCopied += AFSServerName.Length/sizeof( WCHAR);
-
- if ( ulCopyLength > 0 &&
- bAddLeadingSlash)
- {
-
- Buffer->FileName[ cchCopied] = L'\\';
-
- ulCopyLength -= sizeof( WCHAR);
- *Length -= sizeof( WCHAR);
- cchCopied++;
- }
-
- if( ulCopyLength >= pCcb->FullFileName.Length)
- {
-
- RtlCopyMemory( &Buffer->FileName[ cchCopied],
- pCcb->FullFileName.Buffer,
- pCcb->FullFileName.Length);
-
- ulCopyLength -= pCcb->FullFileName.Length;
- *Length -= pCcb->FullFileName.Length;
- cchCopied += pCcb->FullFileName.Length/sizeof( WCHAR);
-
- if( ulCopyLength > 0 &&
- bAddTrailingSlash)
- {
- Buffer->FileName[ cchCopied] = L'\\';
-
- *Length -= sizeof( WCHAR);
- }
- }
- else
- {
+ RtlZeroMemory( Buffer,
+ *Length);
- RtlCopyMemory( &Buffer->FileName[ cchCopied],
- pCcb->FullFileName.Buffer,
- ulCopyLength);
+ *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
- *Length -= ulCopyLength;
- }
- }
- }
+ ntStatus = AFSGetFullFileName( pFcb,
+ pCcb,
+ &Buffer->FileNameLength,
+ Buffer->FileName,
+ Length);
}
return ntStatus;
UNREFERENCED_PARAMETER(DirectoryCB);
NTSTATUS ntStatus = STATUS_INFO_LENGTH_MISMATCH;
- ULONG ulCopyLength = 0;
- ULONG cchCopied = 0;
AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
- BOOLEAN bAddLeadingSlash = FALSE;
- USHORT usFullNameLength = 0;
pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
if( *Length >= FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName))
{
- RtlZeroMemory( Buffer,
- *Length);
-
- if( pCcb->FullFileName.Length == 0 ||
- pCcb->FullFileName.Buffer[ 0] != L'\\')
- {
- bAddLeadingSlash = TRUE;
- }
-
- usFullNameLength = pCcb->FullFileName.Length;
-
- if( bAddLeadingSlash)
- {
- usFullNameLength += sizeof( WCHAR);
- }
-
- if( *Length >= (LONG)(FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
- {
- ulCopyLength = (LONG)usFullNameLength;
-
- ntStatus = STATUS_SUCCESS;
- }
- else
- {
-
- ulCopyLength = *Length - FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName);
-
- ntStatus = STATUS_BUFFER_OVERFLOW;
- }
-
- Buffer->FileNameLength = (ULONG)usFullNameLength;
-
- *Length -= FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName);
-
- if( ulCopyLength > 0)
- {
-
- if( bAddLeadingSlash)
- {
-
- Buffer->FileName[ cchCopied] = L'\\';
-
- ulCopyLength -= sizeof( WCHAR);
- *Length -= sizeof( WCHAR);
- cchCopied++;
- }
-
- if( ulCopyLength >= pCcb->FullFileName.Length)
- {
-
- RtlCopyMemory( &Buffer->FileName[ cchCopied],
- pCcb->FullFileName.Buffer,
- pCcb->FullFileName.Length);
-
- ulCopyLength -= pCcb->FullFileName.Length;
- *Length -= pCcb->FullFileName.Length;
- cchCopied += pCcb->FullFileName.Length/sizeof( WCHAR);
- }
- else
- {
+ RtlZeroMemory( Buffer,
+ *Length);
- RtlCopyMemory( &Buffer->FileName[ cchCopied],
- pCcb->FullFileName.Buffer,
- ulCopyLength);
+ *Length -= FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName);
- *Length -= ulCopyLength;
- }
- }
+ ntStatus = AFSGetFullFileName( pFcb,
+ pCcb,
+ &Buffer->FileNameLength,
+ Buffer->FileName,
+ Length);
}
return ntStatus;
return ntStatus;
}
+
+NTSTATUS
+AFSGetFullFileName( IN AFSFcb *Fcb,
+ IN AFSCcb *Ccb,
+ OUT ULONG *FileNameLength,
+ OUT WCHAR *FileName,
+ IN OUT LONG *RemainingLength)
+{
+
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ ULONG ulCopyLength = 0;
+ ULONG cchCopied = 0;
+ BOOLEAN bAddTrailingSlash = FALSE;
+ BOOLEAN bAddLeadingSlash = FALSE;
+ USHORT usFullNameLength = 0;
+
+ __Enter
+ {
+
+ //
+ // Add a trailing slash for anything which is of the form \server\share
+ //
+
+ if( Ccb->FullFileName.Length == 0 ||
+ Ccb->FullFileName.Buffer[ 0] != L'\\')
+ {
+ bAddLeadingSlash = TRUE;
+ }
+
+ if( Fcb->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY &&
+ Ccb->FullFileName.Length > 0 &&
+ Ccb->FullFileName.Buffer[ (Ccb->FullFileName.Length/sizeof( WCHAR)) - 1] != L'\\')
+ {
+ bAddTrailingSlash = TRUE;
+ }
+
+ usFullNameLength = sizeof( WCHAR) +
+ AFSServerName.Length +
+ Ccb->FullFileName.Length;
+
+ if( bAddLeadingSlash)
+ {
+ usFullNameLength += sizeof( WCHAR);
+ }
+
+ if( bAddTrailingSlash)
+ {
+ usFullNameLength += sizeof( WCHAR);
+ }
+
+ if( *RemainingLength >= (LONG)usFullNameLength)
+ {
+ ulCopyLength = (LONG)usFullNameLength;
+ }
+ else
+ {
+
+ ulCopyLength = *RemainingLength;
+
+ ntStatus = STATUS_BUFFER_OVERFLOW;
+ }
+
+ *FileNameLength = (ULONG)usFullNameLength;
+
+ if( ulCopyLength > 0)
+ {
+
+ FileName[ 0] = L'\\';
+ ulCopyLength -= sizeof( WCHAR);
+
+ *RemainingLength -= sizeof( WCHAR);
+ cchCopied += 1;
+
+ if( ulCopyLength >= AFSServerName.Length)
+ {
+
+ RtlCopyMemory( &FileName[ 1],
+ AFSServerName.Buffer,
+ AFSServerName.Length);
+
+ ulCopyLength -= AFSServerName.Length;
+ *RemainingLength -= AFSServerName.Length;
+ cchCopied += AFSServerName.Length/sizeof( WCHAR);
+
+ if ( ulCopyLength > 0 &&
+ bAddLeadingSlash)
+ {
+
+ FileName[ cchCopied] = L'\\';
+
+ ulCopyLength -= sizeof( WCHAR);
+ *RemainingLength -= sizeof( WCHAR);
+ cchCopied++;
+ }
+
+ if( ulCopyLength >= Ccb->FullFileName.Length)
+ {
+
+ RtlCopyMemory( &FileName[ cchCopied],
+ Ccb->FullFileName.Buffer,
+ Ccb->FullFileName.Length);
+
+ ulCopyLength -= Ccb->FullFileName.Length;
+ *RemainingLength -= Ccb->FullFileName.Length;
+ cchCopied += Ccb->FullFileName.Length/sizeof( WCHAR);
+
+ if( ulCopyLength > 0 &&
+ bAddTrailingSlash)
+ {
+ FileName[ cchCopied] = L'\\';
+
+ *RemainingLength -= sizeof( WCHAR);
+ }
+ }
+ else
+ {
+
+ RtlCopyMemory( &FileName[ cchCopied],
+ Ccb->FullFileName.Buffer,
+ ulCopyLength);
+
+ *RemainingLength -= ulCopyLength;
+ }
+ }
+ }
+ }
+
+ return ntStatus;
+}