break;
}
- default:
+ case FileNetworkPhysicalNameInformation:
+ {
- ntStatus = STATUS_INVALID_PARAMETER;
+ ntStatus = AFSQueryPhysicalNameInfo( Irp,
+ pCcb->DirectoryCB,
+ (FILE_NETWORK_PHYSICAL_NAME_INFORMATION *)pBuffer,
+ &lLength);
break;
+ }
+
+ default:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+ break;
+ }
}
try_exit:
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
ULONG ulFileAttribs = 0;
+ AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSFileInfoCB stFileInfo;
ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
+ pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
+ pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+
if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
{
- pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
-
pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
AFSRetrieveParentPath( &pCcb->FullFileName,
RtlZeroMemory( &stFileInfo,
sizeof( AFSFileInfoCB));
+ //
+ // Can't hold the Fcb while evaluating the path, leads to lock inversion
+ //
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
}
+
+ AFSAcquireShared( &pFcb->NPFcb->Resource,
+ TRUE);
}
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSQueryBasicInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
+ &pCcb->DirectoryCB->NameInformation.FileName,
+ pCcb->DirectoryCB->ObjectInformation->FileType,
+ pCcb->DirectoryCB->ObjectInformation->FileAttributes,
+ ulFileAttribs);
+
Buffer->CreationTime = DirectoryCB->ObjectInformation->CreationTime;
Buffer->LastAccessTime = DirectoryCB->ObjectInformation->LastAccessTime;
Buffer->LastWriteTime = DirectoryCB->ObjectInformation->LastWriteTime;
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSFileInfoCB stFileInfo;
if( *Length >= sizeof( FILE_STANDARD_INFORMATION))
{
+ pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
RtlZeroMemory( Buffer,
if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
{
- pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
-
pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
AFSRetrieveParentPath( &pCcb->FullFileName,
RtlZeroMemory( &stFileInfo,
sizeof( AFSFileInfoCB));
+ //
+ // Can't hold the Fcb while evaluating the path, leads to lock inversion
+ //
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
{
ulFileAttribs = stFileInfo.FileAttributes;
}
+
+ AFSAcquireShared( &pFcb->NPFcb->Resource,
+ TRUE);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSQueryStandardInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
+ &pCcb->DirectoryCB->NameInformation.FileName,
+ pCcb->DirectoryCB->ObjectInformation->FileType,
+ pCcb->DirectoryCB->ObjectInformation->FileAttributes,
+ ulFileAttribs);
+
Buffer->Directory = BooleanFlagOn( ulFileAttribs, FILE_ATTRIBUTE_DIRECTORY);
*Length -= sizeof( FILE_STANDARD_INFORMATION);
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
+ AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSFileInfoCB stFileInfo;
ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
+ pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
+ pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+
if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
{
- pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
-
pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
AFSRetrieveParentPath( &pCcb->FullFileName,
RtlZeroMemory( &stFileInfo,
sizeof( AFSFileInfoCB));
+ //
+ // Can't hold the Fcb while evaluating the path, leads to lock inversion
+ //
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
}
+
+ AFSAcquireShared( &pFcb->NPFcb->Resource,
+ TRUE);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSQueryNetworkInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
+ &pCcb->DirectoryCB->NameInformation.FileName,
+ pCcb->DirectoryCB->ObjectInformation->FileType,
+ pCcb->DirectoryCB->ObjectInformation->FileAttributes,
+ ulFileAttribs);
+
Buffer->CreationTime.QuadPart = DirectoryCB->ObjectInformation->CreationTime.QuadPart;
Buffer->LastAccessTime.QuadPart = DirectoryCB->ObjectInformation->LastAccessTime.QuadPart;
Buffer->LastWriteTime.QuadPart = DirectoryCB->ObjectInformation->LastWriteTime.QuadPart;
NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
ULONG ulCopyLength = 0;
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
+ AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSFileInfoCB stFileInfo;
ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
+ pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
+ pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+
if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
{
- pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
-
pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
AFSRetrieveParentPath( &pCcb->FullFileName,
RtlZeroMemory( &stFileInfo,
sizeof( AFSFileInfoCB));
+ //
+ // Can't hold the Fcb while evaluating the path, leads to lock inversion
+ //
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
}
+
+ AFSAcquireShared( &pFcb->NPFcb->Resource,
+ TRUE);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSAttribTagInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
+ &pCcb->DirectoryCB->NameInformation.FileName,
+ pCcb->DirectoryCB->ObjectInformation->FileType,
+ pCcb->DirectoryCB->ObjectInformation->FileAttributes,
+ ulFileAttribs);
+
Buffer->FileAttributes = ulFileAttribs;
if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
}
NTSTATUS
+AFSQueryPhysicalNameInfo( IN PIRP Irp,
+ IN AFSDirectoryCB *DirectoryCB,
+ IN OUT PFILE_NETWORK_PHYSICAL_NAME_INFORMATION Buffer,
+ IN OUT PLONG Length)
+{
+
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ 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;
+
+ pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+
+ 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;
+ }
+ 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
+ {
+
+ RtlCopyMemory( &Buffer->FileName[ cchCopied],
+ pCcb->FullFileName.Buffer,
+ ulCopyLength);
+
+ *Length -= ulCopyLength;
+ }
+ }
+ }
+ else
+ {
+
+ ntStatus = STATUS_BUFFER_TOO_SMALL;
+ }
+
+ return ntStatus;
+}
+
+NTSTATUS
AFSSetBasicInfo( IN PIRP Irp,
IN AFSDirectoryCB *DirectoryCB)
{
BOOLEAN bReleaseVolumeLock = FALSE;
BOOLEAN bReleaseTargetDirLock = FALSE;
BOOLEAN bReleaseSourceDirLock = FALSE;
+ PERESOURCE pSourceDirLock = NULL;
__Enter
{
try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
}
- //
- // If the target exists be sure the ReplaceIfExists flag is set
- //
-
AFSAcquireExcl( pTargetParentObject->VolumeCB->VolumeLock,
TRUE);
TRUE);
bReleaseSourceDirLock = TRUE;
+
+ pSourceDirLock = pSrcFcb->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock;
}
AFSLocateCaseSensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
if( bReleaseSourceDirLock)
{
- AFSReleaseResource( pSrcFcb->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ AFSReleaseResource( pSourceDirLock);
}
}
pStandard->NumberOfLinks = 1;
pStandard->DeletePending = 0;
- pStandard->AllocationSize.QuadPart = 4096;
- pStandard->EndOfFile.QuadPart = 4096;
+ pStandard->AllocationSize.QuadPart = 0;
+ pStandard->EndOfFile.QuadPart = 0;
pStandard->Directory = 0;
*Length -= sizeof( FILE_STANDARD_INFORMATION);