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 = AFSUpdateFileInformation( &stParentFileId,
pFcb->ObjectInformation,
- &pFcb->AuthGroup);
+ &pCcb->AuthGroup);
if( !NT_SUCCESS( ntStatus))
{
{
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;
+ AFSDirectoryCB *pParentDirectoryCB = NULL;
+ UNICODE_STRING uniParentPath;
if( *Length >= sizeof( FILE_BASIC_INFORMATION))
{
RtlZeroMemory( Buffer,
*Length);
+ ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
+
+ pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
+ pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+
+ if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
+ {
+
+ pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
+
+ AFSRetrieveParentPath( &pCcb->FullFileName,
+ &uniParentPath);
+
+ 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,
+ NULL,
+ &pCcb->AuthGroup,
+ &stFileInfo)))
+ {
+ ulFileAttribs = stFileInfo.FileAttributes;
+
+ 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;
Buffer->ChangeTime = DirectoryCB->ObjectInformation->ChangeTime;
- Buffer->FileAttributes = DirectoryCB->ObjectInformation->FileAttributes;
+ Buffer->FileAttributes = ulFileAttribs;
if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
- BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
+ BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
{
if ( Buffer->FileAttributes != FILE_ATTRIBUTE_NORMAL)
{
-
Buffer->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
}
else
{
-
Buffer->FileAttributes = FILE_ATTRIBUTE_HIDDEN;
}
}
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSFileInfoCB stFileInformation;
+ AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
+ AFSFileInfoCB stFileInfo;
+ AFSDirectoryCB *pParentDirectoryCB = NULL;
+ UNICODE_STRING uniParentPath;
+ ULONG ulFileAttribs = 0;
if( *Length >= sizeof( FILE_STANDARD_INFORMATION))
{
+ pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
RtlZeroMemory( Buffer,
Buffer->NumberOfLinks = 1;
Buffer->DeletePending = BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
- RtlZeroMemory( &stFileInformation,
- sizeof( AFSFileInfoCB));
-
Buffer->AllocationSize.QuadPart = (ULONGLONG)((DirectoryCB->ObjectInformation->AllocationSize.QuadPart/PAGE_SIZE) + 1) * PAGE_SIZE;
Buffer->EndOfFile = DirectoryCB->ObjectInformation->EndOfFile;
- Buffer->Directory = BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_DIRECTORY);
+ ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
+
+ if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
+ {
+
+ pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
+
+ AFSRetrieveParentPath( &pCcb->FullFileName,
+ &uniParentPath);
+
+ 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,
+ NULL,
+ &pCcb->AuthGroup,
+ &stFileInfo)))
+ {
+ 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;
+ AFSDirectoryCB *pParentDirectoryCB = NULL;
+ UNICODE_STRING uniParentPath;
+ ULONG ulFileAttribs = 0;
RtlZeroMemory( Buffer,
*Length);
if( *Length >= sizeof( FILE_NETWORK_OPEN_INFORMATION))
{
+ ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
+
+ pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
+ pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+
+ if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
+ {
+
+ pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
+
+ AFSRetrieveParentPath( &pCcb->FullFileName,
+ &uniParentPath);
+
+ 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,
+ NULL,
+ &pCcb->AuthGroup,
+ &stFileInfo)))
+ {
+ ulFileAttribs = stFileInfo.FileAttributes;
+
+ 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;
Buffer->AllocationSize.QuadPart = DirectoryCB->ObjectInformation->AllocationSize.QuadPart;
Buffer->EndOfFile.QuadPart = DirectoryCB->ObjectInformation->EndOfFile.QuadPart;
- Buffer->FileAttributes = DirectoryCB->ObjectInformation->FileAttributes;
+ Buffer->FileAttributes = ulFileAttribs;
if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
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;
+ AFSDirectoryCB *pParentDirectoryCB = NULL;
+ UNICODE_STRING uniParentPath;
+ ULONG ulFileAttribs = 0;
if( *Length >= sizeof( FILE_ATTRIBUTE_TAG_INFORMATION))
{
RtlZeroMemory( Buffer,
*Length);
- Buffer->FileAttributes = DirectoryCB->ObjectInformation->FileAttributes;
+ ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
+
+ pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
+ pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+
+ if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
+ {
+
+ pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
+
+ AFSRetrieveParentPath( &pCcb->FullFileName,
+ &uniParentPath);
+
+ 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,
+ NULL,
+ &pCcb->AuthGroup,
+ &stFileInfo)))
+ {
+ ulFileAttribs = stFileInfo.FileAttributes;
+
+ 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'.' &&
BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
}
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)
{
//
ntStatus = AFSNotifyDelete( DirectoryCB,
+ &pCcb->AuthGroup,
TRUE);
if( !NT_SUCCESS( ntStatus))
AFSObjectInfoCB *pSrcObject = NULL, *pTargetObject = NULL;
AFSObjectInfoCB *pSrcParentObject = NULL, *pTargetParentObject = NULL;
AFSFileID stNewFid, stTmpTargetFid;
- UNICODE_STRING uniTmpTargetName;
- BOOLEAN bReplaceTmpTargetEntry = FALSE;
ULONG ulNotificationAction = 0, ulNotifyFilter = 0;
UNICODE_STRING uniFullTargetPath;
BOOLEAN bCommonParent = FALSE;
- ULONG oldFileIndex;
+ BOOLEAN bReleaseTargetDirLock = FALSE;
+ BOOLEAN bReleaseSourceDirLock = FALSE;
+ PERESOURCE pSourceDirLock = NULL;
__Enter
{
pSrcObject = pSrcFcb->ObjectInformation;
- uniTmpTargetName.Length = 0;
- uniTmpTargetName.MaximumLength = 0;
- uniTmpTargetName.Buffer = NULL;
-
//
// Perform some basic checks to ensure FS integrity
//
try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
}
- //
- // If the target exists be sure the ReplaceIfExists flag is set
- //
-
- AFSAcquireShared( pTargetParentObject->VolumeCB->VolumeLock,
- TRUE);
-
ulTargetCRC = AFSGenerateCRC( &uniTargetName,
FALSE);
- AFSAcquireShared( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock,
- TRUE);
+ AFSAcquireExcl( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
+ bReleaseTargetDirLock = TRUE;
+
+ if( pTargetParentObject != pSrcFcb->ObjectInformation->ParentObjectInformation)
+ {
+ AFSAcquireExcl( pSrcFcb->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
+ bReleaseSourceDirLock = TRUE;
+
+ pSourceDirLock = pSrcFcb->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock;
+ }
AFSLocateCaseSensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
ulTargetCRC,
ulTargetCRC,
&pTargetDirEntry);
}
+
//
// Increment our ref count on the dir entry
//
if( pTargetDirEntry != NULL)
{
- InterlockedIncrement( &pTargetDirEntry->OpenReferenceCount);
- }
- AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ ASSERT( pTargetParentObject == pTargetDirEntry->ObjectInformation->ParentObjectInformation);
- if( pTargetDirEntry != NULL)
- {
+ InterlockedIncrement( &pTargetDirEntry->OpenReferenceCount);
if( !bReplaceIfExists)
{
- AFSReleaseResource( pTargetParentObject->VolumeCB->VolumeLock);
-
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSSetRenameInfo Attempt to rename directory with target collision %wZ Target %wZ\n",
pTargetDirEntry,
pTargetDirEntry->OpenReferenceCount);
+ //
+ // Pull the directory entry from the parent
+ //
+
+ AFSRemoveDirNodeFromParent( pTargetParentObject,
+ pTargetDirEntry,
+ FALSE);
+
bTargetEntryExists = TRUE;
}
-
- AFSReleaseResource( pTargetParentObject->VolumeCB->VolumeLock);
+ else
+ {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetRenameInfo Target does NOT exist, normal rename\n");
+ }
//
// Extract off the final component name from the Fcb
if( FsRtlAreNamesEqual( &uniTargetName,
&uniSourceName,
- TRUE,
+ FALSE,
NULL))
{
-
- //
- // Check for case only rename
- //
-
- if( !FsRtlAreNamesEqual( &uniTargetName,
- &uniSourceName,
- FALSE,
- NULL))
- {
-
- //
- // Just move in the new case form of the name
- //
-
- RtlCopyMemory( pSrcCcb->DirectoryCB->NameInformation.FileName.Buffer,
- uniTargetName.Buffer,
- uniTargetName.Length);
- }
-
try_return( ntStatus = STATUS_SUCCESS);
}
}
}
//
- // If the target name exists then we need to 'move' the target before
- // sending the rename to the service
- //
-
- if( bReplaceIfExists &&
- pTargetDirEntry != NULL)
- {
-
- //
- // What we will do is temporarily rename the file to a tmp file
- // so we can back out if anything fails below
- // First thing is to remove the original target from the parent
- //
-
- AFSAcquireExcl( pTargetDirEntry->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
- TRUE);
-
- AFSRemoveDirNodeFromParent( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
- pTargetDirEntry,
- TRUE);
-
- AFSReleaseResource( pTargetDirEntry->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
- pTargetDirEntry->FileIndex = (ULONG)InterlockedIncrement( &pTargetDirEntry->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.ContentIndex);
-
- uniTmpTargetName.Length = 0;
- uniTmpTargetName.MaximumLength = uniTargetName.Length + (4 * sizeof( WCHAR));
-
- uniTmpTargetName.Buffer = (WCHAR *)AFSExAllocatePoolWithTag( PagedPool,
- uniTmpTargetName.MaximumLength,
- AFS_GENERIC_MEMORY_11_TAG);
-
- if( uniTmpTargetName.Buffer == NULL)
- {
-
- //
- // Re-insert the entry
- //
-
- AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
- pTargetDirEntry,
- TRUE);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSSetRenameInfo Failed tmp buffer allocation during rename of %wZ\n",
- &pSrcCcb->DirectoryCB->NameInformation.FileName);
-
- try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
- }
-
- RtlZeroMemory( uniTmpTargetName.Buffer,
- uniTmpTargetName.MaximumLength);
-
- uniTmpTargetName.Length = uniTargetName.Length;
-
- RtlCopyMemory( uniTmpTargetName.Buffer,
- uniTargetName.Buffer,
- uniTmpTargetName.Length);
-
- RtlCopyMemory( &uniTmpTargetName.Buffer[ uniTmpTargetName.Length/sizeof( WCHAR)],
- L".tmp",
- 4 * sizeof( WCHAR));
-
- uniTmpTargetName.Length += (4 * sizeof( WCHAR));
-
- ntStatus = AFSNotifyRename( pTargetDirEntry->ObjectInformation,
- pTargetDirEntry->ObjectInformation->ParentObjectInformation,
- pTargetDcb->ObjectInformation,
- pTargetDirEntry,
- &uniTmpTargetName,
- &stTmpTargetFid);
-
- if( !NT_SUCCESS( ntStatus))
- {
-
- //
- // Re-insert the entry
- //
-
- AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
- pTargetDirEntry,
- TRUE);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSSetRenameInfo Failed rename of %wZ to tmp %wZ Status %08lX\n",
- &pSrcCcb->DirectoryCB->NameInformation.FileName,
- &uniTmpTargetName,
- ntStatus);
-
- try_return( ntStatus);
- }
-
- //
- // Indicate we need to replace this entry if any failure occurs below
- //
-
- bReplaceTmpTargetEntry = TRUE;
- }
-
- //
// We need to remove the DirEntry from the parent node, update the index
// and reinsert it into the parent tree. Note that for entries with the
// same parent we do not pull the node from the enumeration list
//
- AFSAcquireExcl( pSrcFcb->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
- TRUE);
-
AFSRemoveDirNodeFromParent( pSrcFcb->ObjectInformation->ParentObjectInformation,
pSrcCcb->DirectoryCB,
!bCommonParent);
- AFSReleaseResource( pSrcFcb->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
- oldFileIndex = pSrcCcb->DirectoryCB->FileIndex;
- if( !bCommonParent)
- {
-
- //
- // We always need to update the FileIndex since this entry will be put at the 'end'
- // of the enumeraiton list. If we don't it will cause recursion ... We do this
- // here to cover any failures which might occur below
- //
-
- pSrcCcb->DirectoryCB->FileIndex =
- (ULONG)InterlockedIncrement( &pTargetDcb->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.ContentIndex);
- }
-
//
// OK, this is a simple rename. Issue the rename
// request to the service.
//
ntStatus = AFSNotifyRename( pSrcFcb->ObjectInformation,
+ &pSrcCcb->AuthGroup,
pSrcFcb->ObjectInformation->ParentObjectInformation,
pTargetDcb->ObjectInformation,
pSrcCcb->DirectoryCB,
// Attempt to re-insert the directory entry
//
- pSrcCcb->DirectoryCB->FileIndex = oldFileIndex;
AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
pSrcCcb->DirectoryCB,
!bCommonParent);
//
if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation == pTargetParentObject &&
- !bReplaceTmpTargetEntry)
+ !bTargetEntryExists)
{
ulNotificationAction = FILE_ACTION_RENAMED_OLD_NAME;
// Attempt to re-insert the directory entry
//
- pSrcCcb->DirectoryCB->FileIndex = oldFileIndex;
AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
pSrcCcb->DirectoryCB,
!bCommonParent);
&stNewFid))
{
+ AFSAcquireExcl( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
//
// Remove the old information entry
//
- AFSAcquireExcl( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
-
AFSRemoveHashEntry( &pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
&pSrcObject->TreeEntry);
else
{
- AFSInsertHashEntry( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
- &pSrcObject->TreeEntry);
+ if ( !NT_SUCCESS( AFSInsertHashEntry( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
+ &pSrcObject->TreeEntry)))
+ {
+
+ //
+ // Lost a race, an ObjectInfo object already exists for this FID.
+ // Let this copy be garbage collected.
+ //
+
+ ClearFlag( pSrcObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
+ }
}
AFSReleaseResource( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock);
pSrcCcb->DirectoryCB->CaseInsensitiveTreeEntry.HashIndex = AFSGenerateCRC( &pSrcCcb->DirectoryCB->NameInformation.FileName,
TRUE);
- if( pSrcCcb->DirectoryCB->NameInformation.ShortNameLength > 0)
+ if( pSrcCcb->DirectoryCB->NameInformation.ShortNameLength > 0 &&
+ !RtlIsNameLegalDOS8Dot3( &pSrcCcb->DirectoryCB->NameInformation.FileName,
+ NULL,
+ NULL))
{
uniShortName.Length = pSrcCcb->DirectoryCB->NameInformation.ShortNameLength;
+ uniShortName.MaximumLength = uniShortName.Length;
uniShortName.Buffer = pSrcCcb->DirectoryCB->NameInformation.ShortName;
pSrcCcb->DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
// delete the tmp target we created above
//
- if( bReplaceTmpTargetEntry)
+ if( bTargetEntryExists)
{
- RtlCopyMemory( &pTargetDirEntry->ObjectInformation->FileId,
- &stTmpTargetFid,
- sizeof( AFSFileID));
-
- //
- // Update the name in the dir entry
- //
-
- ntStatus = AFSUpdateDirEntryName( pTargetDirEntry,
- &uniTmpTargetName);
-
- if( !NT_SUCCESS( ntStatus))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSSetRenameInfo Failed update of target dir entry %wZ to tmp %wZ Status %08lX\n",
- &pTargetDirEntry->NameInformation.FileName,
- &uniTmpTargetName,
- ntStatus);
-
- try_return( ntStatus);
- }
-
- ntStatus = AFSNotifyDelete( pTargetDirEntry,
- FALSE);
-
- if( !NT_SUCCESS( ntStatus))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetRenameInfo object deletion failure dir entry %p name %wZ to tmp %wZ\n",
- pTargetDirEntry,
- &pTargetDirEntry->NameInformation.FileName,
- &uniTmpTargetName);
-
- try_return( ntStatus);
- }
-
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSSetRenameInfo Setting DELETE flag in dir entry %p name %wZ\n",
TRUE);
//
- // Try and flush the cache map
+ // Close the section in the event it was mapped
//
- if( !MmFlushImageSection( &pTargetFcb->NPFcb->SectionObjectPointers,
- MmFlushForDelete))
+ if( !MmForceSectionClosed( &pTargetFcb->NPFcb->SectionObjectPointers,
+ TRUE))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
ASSERT( pTargetDirEntry->OpenReferenceCount > 0);
- InterlockedDecrement( &pTargetDirEntry->OpenReferenceCount);
+ InterlockedDecrement( &pTargetDirEntry->OpenReferenceCount); // The count we added above
if( pTargetDirEntry->OpenReferenceCount == 0)
{
- SetFlag( pTargetDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED);
-
- ASSERT( BooleanFlagOn( pTargetDirEntry->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE));
-
- //
- // Free up the name buffer if it was reallocated
- //
-
- if( BooleanFlagOn( pTargetDirEntry->Flags, AFS_DIR_RELEASE_NAME_BUFFER))
- {
-
- AFSExFreePool( pTargetDirEntry->NameInformation.FileName.Buffer);
- }
-
- if( BooleanFlagOn( pTargetDirEntry->Flags, AFS_DIR_RELEASE_TARGET_NAME_BUFFER))
- {
-
- AFSExFreePool( pTargetDirEntry->NameInformation.TargetName.Buffer);
- }
-
- //
- // Dereference the object for this dir entry
- //
-
- ASSERT( pTargetDirEntry->ObjectInformation->ObjectReferenceCount > 0);
-
- InterlockedDecrement( &pTargetDirEntry->ObjectInformation->ObjectReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetRenameInfo Decrement3 count on object %08lX Cnt %d\n",
- pTargetDirEntry->ObjectInformation,
- pTargetDirEntry->ObjectInformation->ObjectReferenceCount);
-
- //
- // Free up the dir entry
- //
-
- ExDeleteResourceLite( &pTargetDirEntry->NonPaged->Lock);
-
- AFSExFreePool( pTargetDirEntry->NonPaged);
+ "AFSSetRenameInfo Deleting dir entry %p name %wZ\n",
+ pTargetDirEntry,
+ &pTargetDirEntry->NameInformation.FileName);
- AFSExFreePool( pTargetDirEntry);
+ AFSDeleteDirEntry( pTargetParentObject,
+ pTargetDirEntry);
}
pTargetDirEntry = NULL;
if( !NT_SUCCESS( ntStatus))
{
- if( bReplaceTmpTargetEntry)
+ if( bTargetEntryExists)
{
-
- AFSNotifyRename( pTargetDirEntry->ObjectInformation,
- pTargetDirEntry->ObjectInformation->ParentObjectInformation,
- pTargetDcb->ObjectInformation,
- pTargetDirEntry,
- &uniTargetName,
- &stTmpTargetFid);
-
- //
- // Replace the target entry
- //
-
- AFSAcquireExcl( pTargetDirEntry->ObjectInformation->VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
-
- if( pTargetDirEntry->ObjectInformation->VolumeCB->ObjectInfoTree.TreeHead == NULL)
- {
-
- pTargetDirEntry->ObjectInformation->VolumeCB->ObjectInfoTree.TreeHead = &pTargetDirEntry->ObjectInformation->TreeEntry;
- }
- else
- {
- AFSInsertHashEntry( pTargetDirEntry->ObjectInformation->VolumeCB->ObjectInfoTree.TreeHead,
- &pTargetDirEntry->ObjectInformation->TreeEntry);
- }
-
- AFSReleaseResource( pTargetDirEntry->ObjectInformation->VolumeCB->ObjectInfoTree.TreeLock);
-
- //
- // We always need to update the FileIndex since this entry will be put at the 'end'
- // of the enumeraiton list. If we don't it will cause recursion ...
- //
-
- pTargetDirEntry->FileIndex = (ULONG)InterlockedIncrement( &pTargetDirEntry->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.ContentIndex);
-
AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
pTargetDirEntry,
- TRUE);
+ FALSE);
}
}
InterlockedDecrement( &pTargetDirEntry->OpenReferenceCount);
}
- if( uniTmpTargetName.Buffer != NULL)
+ if( bReleaseTargetDirLock)
{
+ AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ }
- AFSExFreePool( uniTmpTargetName.Buffer);
+ if( bReleaseSourceDirLock)
+ {
+ AFSReleaseResource( pSourceDirLock);
}
}
{
ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
pFcb->ObjectInformation,
- &pFcb->AuthGroup);
+ &pCcb->AuthGroup);
}
if (NT_SUCCESS(ntStatus))
ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
pFcb->ObjectInformation,
- &pFcb->AuthGroup);
+ &pCcb->AuthGroup);
if( NT_SUCCESS(ntStatus))
{
case FileBasicInformation:
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessPIOCtlQueryInfo (FileBasicInformation)\n");
+
if ( *Length >= sizeof( FILE_BASIC_INFORMATION))
{
PFILE_BASIC_INFORMATION pBasic = (PFILE_BASIC_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
}
else
{
- ntStatus = STATUS_BUFFER_OVERFLOW;
+ ntStatus = STATUS_BUFFER_TOO_SMALL;
}
break;
case FileStandardInformation:
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessPIOCtlQueryInfo (FileStandardInformation)\n");
+
if ( *Length >= sizeof( FILE_STANDARD_INFORMATION))
{
PFILE_STANDARD_INFORMATION pStandard = (PFILE_STANDARD_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
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);
}
else
{
- ntStatus = STATUS_BUFFER_OVERFLOW;
+ ntStatus = STATUS_BUFFER_TOO_SMALL;
}
break;
PFILE_NAME_INFORMATION pNameInfo = (PFILE_NAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
UNICODE_STRING uniName;
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessPIOCtlQueryInfo (FileNameInformation)\n");
+
pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
PFILE_INTERNAL_INFORMATION pInternalInfo = (PFILE_INTERNAL_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessPIOCtlQueryInfo (FileInternalInformation)\n");
+
if( *Length >= sizeof( FILE_INTERNAL_INFORMATION))
{
break;
}
+ case FileAllInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileAllInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FileEaInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileEaInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FilePositionInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FilePositionInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FileAlternateNameInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileAlternateNameInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FileNetworkOpenInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileNetworkOpenInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FileStreamInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileStreamInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FileAttributeTagInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileAttributeTagInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FileRemoteProtocolInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileRemoteProtocolInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FileNetworkPhysicalNameInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileNetworkPhysicalNameInformation) Not Implemented\n");
+
+ break;
+ }
+
default:
{
ntStatus = STATUS_INVALID_PARAMETER;
}
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessPIOCtlQueryInfo ntStatus %08lX\n",
+ ntStatus);
+
return ntStatus;
}