IN PIRP Irp)
{
+ UNREFERENCED_PARAMETER(LibDeviceObject);
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
- ULONG ulRequestType = 0;
IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
- PFILE_OBJECT pFileObject;
BOOLEAN bReleaseMain = FALSE;
- LONG lLength;
+ LONG lLength = 0;
FILE_INFORMATION_CLASS stFileInformationClass;
GUID stAuthGroup;
PVOID pBuffer;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSQueryFileInfo Attempted access (%08lX) when pFcb == NULL\n",
+ "AFSQueryFileInfo Attempted access (%p) when pFcb == NULL\n",
Irp);
try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
stFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
pBuffer = Irp->AssociatedIrp.SystemBuffer;
- RtlZeroMemory( &stAuthGroup,
- sizeof( GUID));
+ if ( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY))
+ {
+
+ RtlZeroMemory( &stAuthGroup,
+ sizeof( GUID));
+
+ AFSRetrieveAuthGroupFnc( (ULONGLONG)PsGetCurrentProcessId(),
+ (ULONGLONG)PsGetCurrentThreadId(),
+ &stAuthGroup);
+
+ ntStatus = AFSVerifyEntry( &stAuthGroup,
+ pCcb->DirectoryCB);
- AFSRetrieveAuthGroupFnc( (ULONGLONG)PsGetCurrentProcessId(),
- (ULONGLONG)PsGetCurrentThreadId(),
- &stAuthGroup);
+ if ( NT_SUCCESS( ntStatus))
+ {
+
+ ClearFlag( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ }
+ else
+ {
- AFSVerifyEntry( &stAuthGroup,
- pCcb->DirectoryCB);
+ ntStatus = STATUS_SUCCESS;
+ }
+ }
//
// Grab the main shared right off the bat
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueryFileInfo Acquiring Fcb lock %08lX SHARED %08lX\n",
+ "AFSQueryFileInfo Acquiring Fcb lock %p SHARED %08lX\n",
&pFcb->NPFcb->Resource,
PsGetCurrentThread());
IN PIRP Irp)
{
+ UNREFERENCED_PARAMETER(LibDeviceObject);
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
- BOOLEAN bCompleteRequest = TRUE;
FILE_INFORMATION_CLASS FileInformationClass;
BOOLEAN bCanQueueRequest = FALSE;
PFILE_OBJECT pFileObject = NULL;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSSetFileInfo Attempted access (%08lX) when pFcb == NULL\n",
+ "AFSSetFileInfo Attempted access (%p) when pFcb == NULL\n",
Irp);
try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetFileInfo Acquiring Fcb lock %08lX EXCL %08lX\n",
+ "AFSSetFileInfo Acquiring Fcb lock %p EXCL %08lX\n",
&pFcb->NPFcb->Resource,
PsGetCurrentThread());
RtlZeroMemory( &stParentFileId,
sizeof( AFSFileID));
- if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+ if( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
- stParentFileId = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+
+ stParentFileId = pFcb->ObjectInformation->ParentFileId;
}
//
AFSReleaseResource( &pFcb->NPFcb->Resource);
+ //
+ // Its a reparse point regardless of whether the file attributes
+ // can be retrieved for the target.
+ //
+
+ if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
+ {
+
+ ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+ else
+ {
+
+ ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
&stFileInfo)))
{
- if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
- {
-
- ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
- }
- else
- {
-
- ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
- }
-
if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
AFSReleaseResource( &pFcb->NPFcb->Resource);
+ //
+ // Its a reparse point regardless of whether or not the
+ // file attributes can be retrieved.
+ //
+
+ if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
+ {
+
+ ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+ else
+ {
+
+ ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
&stFileInfo)))
{
- if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
- {
-
- ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
- }
- else
- {
-
- ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
- }
-
if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
IN OUT PLONG Length)
{
+ UNREFERENCED_PARAMETER(Irp);
NTSTATUS ntStatus = STATUS_SUCCESS;
if( *Length >= sizeof( FILE_INTERNAL_INFORMATION))
{
- Buffer->IndexNumber.HighPart = Fcb->ObjectInformation->FileId.Volume;
+ Buffer->IndexNumber.HighPart = Fcb->ObjectInformation->FileId.Vnode;
- Buffer->IndexNumber.LowPart = Fcb->ObjectInformation->FileId.Vnode;
+ Buffer->IndexNumber.LowPart = Fcb->ObjectInformation->FileId.Unique;
*Length -= sizeof( FILE_INTERNAL_INFORMATION);
}
IN OUT PLONG Length)
{
+ UNREFERENCED_PARAMETER(Irp);
+ UNREFERENCED_PARAMETER(DirectoryCB);
NTSTATUS ntStatus = STATUS_SUCCESS;
RtlZeroMemory( Buffer,
IN OUT PLONG Length)
{
+ UNREFERENCED_PARAMETER(Fcb);
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
IN OUT PLONG Length)
{
+ UNREFERENCED_PARAMETER(Irp);
+ UNREFERENCED_PARAMETER(Fcb);
NTSTATUS ntStatus = STATUS_SUCCESS;
if( *Length >= sizeof( FILE_ACCESS_INFORMATION))
IN OUT PLONG Length)
{
+ UNREFERENCED_PARAMETER(Irp);
+ UNREFERENCED_PARAMETER(Fcb);
NTSTATUS ntStatus = STATUS_SUCCESS;
if( *Length >= sizeof( FILE_MODE_INFORMATION))
IN OUT PLONG Length)
{
+ UNREFERENCED_PARAMETER(Irp);
+ UNREFERENCED_PARAMETER(Fcb);
NTSTATUS ntStatus = STATUS_SUCCESS;
if( *Length >= sizeof( FILE_ALIGNMENT_INFORMATION))
IN OUT PLONG Length)
{
+ UNREFERENCED_PARAMETER(DirectoryCB);
NTSTATUS ntStatus = STATUS_SUCCESS;
ULONG ulCopyLength = 0;
ULONG cchCopied = 0;
IN OUT PLONG Length)
{
+ UNREFERENCED_PARAMETER(Irp);
NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
ULONG ulCopyLength = 0;
AFSReleaseResource( &pFcb->NPFcb->Resource);
+ //
+ // Its a reparse point regardless of whether the file attributes
+ // can be retrieved for the target.
+ //
+
+ if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
+ {
+
+ ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+ else
+ {
+
+ ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
&stFileInfo)))
{
- if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
- {
-
- ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
- }
- else
- {
-
- ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
- }
-
if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
IN OUT PLONG Length)
{
+ UNREFERENCED_PARAMETER(Irp);
NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
ULONG ulCopyLength = 0;
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
if( *Length >= FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName))
{
{
NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
- ULONG ulCopyLength = 0;
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
AFSReleaseResource( &pFcb->NPFcb->Resource);
+ //
+ // Its a reparse point regardless of whether the file attributes
+ // can be retrieved for the target.
+ //
+
+ if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
+ {
+
+ ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+ else
+ {
+
+ ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
&stFileInfo)))
{
- if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
- {
-
- ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
- }
- else
- {
-
- ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
- }
-
if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
}
}
- if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
+ if ( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_MOUNTPOINT)
{
+
Buffer->ReparseTag = IO_REPARSE_TAG_SURROGATE|IO_REPARSE_TAG_OPENAFS_DFS;
}
+ else if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
+ {
+
+ Buffer->ReparseTag = IO_REPARSE_TAG_SYMLINK;
+ }
*Length -= sizeof( FILE_ATTRIBUTE_TAG_INFORMATION);
IN OUT PLONG Length)
{
+ UNREFERENCED_PARAMETER(Irp);
+ UNREFERENCED_PARAMETER(DirectoryCB);
NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
- ULONG ulCopyLength = 0;
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
if( *Length >= sizeof( FILE_REMOTE_PROTOCOL_INFORMATION))
{
IN OUT PLONG Length)
{
+ UNREFERENCED_PARAMETER(DirectoryCB);
NTSTATUS ntStatus = STATUS_SUCCESS;
ULONG ulCopyLength = 0;
ULONG cchCopied = 0;
if( ulNotifyFilter > 0)
{
- if( DirectoryCB->ObjectInformation->ParentObjectInformation != NULL)
+ if( BooleanFlagOn( DirectoryCB->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
- AFSFsRtlNotifyFullReportChange( DirectoryCB->ObjectInformation->ParentObjectInformation,
- pCcb,
- (ULONG)ulNotifyFilter,
- (ULONG)FILE_ACTION_MODIFIED);
+ AFSObjectInfoCB * pParentObjectInfo = AFSFindObjectInfo( DirectoryCB->ObjectInformation->VolumeCB,
+ &DirectoryCB->ObjectInformation->ParentFileId);
+
+ if ( pParentObjectInfo != NULL)
+ {
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+ pCcb,
+ (ULONG)ulNotifyFilter,
+ (ULONG)FILE_ACTION_MODIFIED);
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
}
}
}
else if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
{
+ BOOLEAN bMmFlushed;
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetDispositionInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+ "AFSSetDispositionInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
&pFcb->NPFcb->SectionObjectResource,
PsGetCurrentThread());
// Attempt to flush any outstanding data
//
- if( !MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers,
- MmFlushForDelete))
+ bMmFlushed = MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers,
+ MmFlushForDelete);
+
+ if ( bMmFlushed)
{
+ //
+ // Set PENDING_DELETE before CcPurgeCacheSection to avoid a
+ // deadlock with Trend Micro's Enterprise anti-virus product
+ // which attempts to open the file which is being deleted.
+ //
+
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSSetDispositionInfo Failed to flush image section for delete Entry %wZ\n",
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
+ DirectoryCB,
&DirectoryCB->NameInformation.FileName);
- try_return( ntStatus = STATUS_CANNOT_DELETE);
- }
-
- //
- // Set PENDING_DELETE before CcPurgeCacheSection to avoid a
- // deadlock with Trend Micro's Enterprise anti-virus product
- // which attempts to open the file which is being deleted.
- //
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
- DirectoryCB,
- &DirectoryCB->NameInformation.FileName);
-
- SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
-
- //
- // Purge the cache as well
- //
+ SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
- if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
- {
+ //
+ // Purge the cache as well
+ //
- if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- TRUE))
+ if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
{
- SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ TRUE))
+ {
+
+ SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ }
}
}
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetDispositionInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+ "AFSSetDispositionInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
&pFcb->NPFcb->SectionObjectResource,
PsGetCurrentThread());
AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
+
+ if ( !bMmFlushed)
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetDispositionInfo Failed to flush image section for delete Entry %wZ\n",
+ &DirectoryCB->NameInformation.FileName);
+
+ try_return( ntStatus = STATUS_CANNOT_DELETE);
+ }
+ }
+ else if( pFcb->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
+ pFcb->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
+ pFcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
+ pFcb->Header.NodeTypeCode == AFS_INVALID_FCB)
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
+ DirectoryCB,
+ &DirectoryCB->NameInformation.FileName);
+
+ SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
}
}
else
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
- IO_STATUS_BLOCK stIoSb = {0,0};
PFILE_LINK_INFORMATION pFileLinkInfo = NULL;
PFILE_OBJECT pSrcFileObj = NULL;
PFILE_OBJECT pTargetFileObj = pIrpSp->Parameters.SetFile.FileObject;
- AFSFcb *pSrcFcb = NULL, *pTargetDcb = NULL, *pTargetFcb = NULL;
+ AFSFcb *pSrcFcb = NULL, *pTargetDcb = NULL;
AFSCcb *pSrcCcb = NULL, *pTargetDirCcb = NULL;
- AFSObjectInfoCB *pSrcObject = NULL, *pTargetObject = NULL;
+ AFSObjectInfoCB *pSrcObject = NULL;
AFSObjectInfoCB *pSrcParentObject = NULL, *pTargetParentObject = NULL;
UNICODE_STRING uniSourceName, uniTargetName;
UNICODE_STRING uniFullTargetName, uniTargetParentName;
- UNICODE_STRING uniShortName;
BOOLEAN bCommonParent = FALSE;
AFSDirectoryCB *pTargetDirEntry = NULL;
AFSDirectoryCB *pNewTargetDirEntry = NULL;
BOOLEAN bTargetEntryExists = FALSE;
LONG lCount;
BOOLEAN bReleaseTargetDirLock = FALSE;
- AFSFileID stNewFid;
ULONG ulNotificationAction = 0, ulNotifyFilter = 0;
__Enter
pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
pSrcObject = pSrcFcb->ObjectInformation;
- pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
+
+ if ( BooleanFlagOn( pSrcFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pSrcParentObject = AFSFindObjectInfo( pSrcFcb->ObjectInformation->VolumeCB,
+ &pSrcFcb->ObjectInformation->ParentFileId);
+ }
pFileLinkInfo = (PFILE_LINK_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
if( pTargetDirEntry != NULL)
{
- ASSERT( pTargetParentObject == pTargetDirEntry->ObjectInformation->ParentObjectInformation);
+ ASSERT( BooleanFlagOn( pTargetDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+ AFSIsEqualFID( &pTargetParentObject->FileId, &pTargetDirEntry->ObjectInformation->ParentFileId));
lCount = InterlockedIncrement( &pTargetDirEntry->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_ERROR,
- "AFSSetFileLinkInfo Target %wZ exists DE %p Count %08lX, performing delete of target\n",
+ "AFSSetFileLinkInfo Target %wZ exists DE %p Count %d, performing delete of target\n",
&pTargetDirEntry->NameInformation.FileName,
pTargetDirEntry,
- pTargetDirEntry->DirOpenReferenceCount);
+ lCount);
//
// Pull the directory entry from the parent
ntStatus = AFSNotifyHardLink( pSrcFcb->ObjectInformation,
&pSrcCcb->AuthGroup,
- pSrcFcb->ObjectInformation->ParentObjectInformation,
+ pSrcParentObject,
pTargetDcb->ObjectInformation,
pSrcCcb->DirectoryCB,
&uniTargetName,
pFileLinkInfo->ReplaceIfExists,
&pNewTargetDirEntry);
- if( !NT_SUCCESS( ntStatus))
+ if( ntStatus != STATUS_REPARSE &&
+ !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
try_return( ntStatus);
}
- AFSInsertDirectoryNode( pTargetDcb->ObjectInformation,
- pNewTargetDirEntry,
- TRUE);
+ if ( ntStatus != STATUS_REPARSE)
+ {
+
+ AFSInsertDirectoryNode( pTargetDcb->ObjectInformation,
+ pNewTargetDirEntry,
+ TRUE);
+ }
//
// Send notification for the target link file
ulNotificationAction = FILE_ACTION_ADDED;
}
- AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
+ AFSFsRtlNotifyFullReportChange( pTargetParentObject,
pSrcCcb,
(ULONG)ulNotifyFilter,
(ULONG)ulNotificationAction);
if( bTargetEntryExists)
{
- AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
+ AFSInsertDirectoryNode( pTargetParentObject,
pTargetDirEntry,
FALSE);
}
if( pTargetDirEntry != NULL)
{
+ //
+ // Release DirOpenReferenceCount obtained above
+ //
+
lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
ASSERT( lCount >= 0);
}
+ if( pNewTargetDirEntry != NULL)
+ {
+
+ //
+ // Release DirOpenReferenceCount obtained from AFSNotifyHardLink
+ //
+
+ lCount = InterlockedDecrement( &pNewTargetDirEntry->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetFileLinkInfo Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pNewTargetDirEntry->NameInformation.FileName,
+ pNewTargetDirEntry,
+ pSrcCcb,
+ lCount);
+
+ ASSERT( lCount >= 0);
+ }
+
if( bReleaseTargetDirLock)
{
AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
+
+ if ( pSrcParentObject != NULL)
+ {
+
+ AFSReleaseObjectInfo( &pSrcParentObject);
+ }
+
+ //
+ // No need to release pTargetParentObject as it is either a copy of pSrcParentObject
+ // or (AFSFcb *)pTargetFileObj->FsContext->ObjectInformation
+ //
+
+ pTargetParentObject = NULL;
}
return ntStatus;
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
- IO_STATUS_BLOCK stIoSb = {0,0};
AFSFcb *pSrcFcb = NULL, *pTargetDcb = NULL, *pTargetFcb = NULL;
AFSCcb *pSrcCcb = NULL, *pTargetDirCcb = NULL;
PFILE_OBJECT pSrcFileObj = pIrpSp->FileObject;
AFSDirectoryCB *pTargetDirEntry = NULL;
ULONG ulTargetCRC = 0;
BOOLEAN bTargetEntryExists = FALSE;
- AFSObjectInfoCB *pSrcObject = NULL, *pTargetObject = NULL;
+ AFSObjectInfoCB *pSrcObject = NULL;
AFSObjectInfoCB *pSrcParentObject = NULL, *pTargetParentObject = NULL;
- AFSFileID stNewFid, stTmpTargetFid;
+ AFSFileID stNewFid;
ULONG ulNotificationAction = 0, ulNotifyFilter = 0;
UNICODE_STRING uniFullTargetName;
BOOLEAN bCommonParent = FALSE;
pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
pSrcObject = pSrcFcb->ObjectInformation;
- pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
+
+ if ( BooleanFlagOn( pSrcFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pSrcParentObject = AFSFindObjectInfo( pSrcFcb->ObjectInformation->VolumeCB,
+ &pSrcFcb->ObjectInformation->ParentFileId);
+ }
//
// Perform some basic checks to ensure FS integrity
if( pTargetDirEntry != NULL)
{
- ASSERT( pTargetParentObject == pTargetDirEntry->ObjectInformation->ParentObjectInformation);
+ ASSERT( BooleanFlagOn( pTargetDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+ AFSIsEqualFID( &pTargetParentObject->FileId, &pTargetDirEntry->ObjectInformation->ParentFileId));
lCount = InterlockedIncrement( &pTargetDirEntry->DirOpenReferenceCount);
-
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSSetRenameInfo Increment count on %wZ DE %p Ccb %p Cnt %d\n",
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_ERROR,
- "AFSSetRenameInfo Target %wZ exists DE %p Count %08lX, performing delete of target\n",
+ "AFSSetRenameInfo Target %wZ exists DE %p Count %d, performing delete of target\n",
&pTargetDirEntry->NameInformation.FileName,
pTargetDirEntry,
- pTargetDirEntry->DirOpenReferenceCount);
+ lCount);
//
// Pull the directory entry from the parent
// same parent we do not pull the node from the enumeration list
//
- AFSRemoveDirNodeFromParent( pSrcFcb->ObjectInformation->ParentObjectInformation,
+ AFSRemoveDirNodeFromParent( pSrcParentObject,
pSrcCcb->DirectoryCB,
!bCommonParent);
ntStatus = AFSNotifyRename( pSrcFcb->ObjectInformation,
&pSrcCcb->AuthGroup,
- pSrcFcb->ObjectInformation->ParentObjectInformation,
+ pSrcParentObject,
pTargetDcb->ObjectInformation,
pSrcCcb->DirectoryCB,
&uniTargetName,
// Attempt to re-insert the directory entry
//
- AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
+ AFSInsertDirectoryNode( pSrcParentObject,
pSrcCcb->DirectoryCB,
!bCommonParent);
// Set the notification up for the source file
//
- if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation == pTargetParentObject &&
+ if( pSrcParentObject == pTargetParentObject &&
!bTargetEntryExists)
{
ulNotifyFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
}
- AFSFsRtlNotifyFullReportChange( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation,
+ AFSFsRtlNotifyFullReportChange( pSrcParentObject,
pSrcCcb,
(ULONG)ulNotifyFilter,
(ULONG)ulNotificationAction);
// Attempt to re-insert the directory entry
//
- AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
+ AFSInsertDirectoryNode( pSrcParentObject,
pSrcCcb->DirectoryCB,
!bCommonParent);
// Update the parent pointer in the source object if they are different
//
- if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation != pTargetParentObject)
+ if( pSrcParentObject != pTargetParentObject)
{
- lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedDecrement( &pSrcParentObject->Specific.Directory.ChildOpenHandleCount);
- lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedDecrement( &pSrcParentObject->Specific.Directory.ChildOpenReferenceCount);
lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenHandleCount);
lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenReferenceCount);
- pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation = pTargetParentObject;
+ lCount = AFSObjectInfoIncrement( pTargetParentObject,
+ AFS_OBJECT_REFERENCE_CHILD);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetRenameInfo Increment count on parent object %p Cnt %d\n",
+ pTargetParentObject,
+ lCount);
+
+ lCount = AFSObjectInfoDecrement( pSrcParentObject,
+ AFS_OBJECT_REFERENCE_CHILD);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetRenameInfo Decrement count on parent object %p Cnt %d\n",
+ pSrcParentObject,
+ lCount);
+
+ pSrcCcb->DirectoryCB->ObjectInformation->ParentFileId = pTargetParentObject->FileId;
+
+ SetFlag( pSrcCcb->DirectoryCB->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
+ pSrcParentObject = pTargetParentObject;
ulNotificationAction = FILE_ACTION_ADDED;
}
// Now update the notification for the target file
//
- AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
+ AFSFsRtlNotifyFullReportChange( pTargetParentObject,
pSrcCcb,
(ULONG)ulNotifyFilter,
(ULONG)ulNotificationAction);
{
pTargetFcb = pTargetDirEntry->ObjectInformation->Fcb;
+ }
+
+ ASSERT( pTargetDirEntry->DirOpenReferenceCount > 0);
+
+ lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount); // The count we added above
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetRenameInfo Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pTargetDirEntry->NameInformation.FileName,
+ pTargetDirEntry,
+ pSrcCcb,
+ lCount);
+
+ ASSERT( lCount >= 0);
+
+ if( lCount == 0 &&
+ pTargetDirEntry->NameArrayReferenceCount <= 0)
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetRenameInfo Deleting dir entry %p name %wZ\n",
+ pTargetDirEntry,
+ &pTargetDirEntry->NameInformation.FileName);
+
+ AFSDeleteDirEntry( pTargetParentObject,
+ pTargetDirEntry);
+ }
+
+ pTargetDirEntry = NULL;
+
+ if ( pTargetFcb != NULL)
+ {
+
+ //
+ // Do not hold TreeLocks across the MmForceSectionClosed() call as
+ // it can deadlock with Trend Micro's TmPreFlt!TmpQueryFullName
+ //
+
+ if( bReleaseTargetDirLock)
+ {
+ AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+ bReleaseTargetDirLock = FALSE;
+ }
+
+ if( bReleaseSourceDirLock)
+ {
+
+ AFSReleaseResource( pSourceDirLock);
+
+ bReleaseSourceDirLock = FALSE;
+ }
+
+ //
+ // MmForceSectionClosed() can eventually call back into AFSCleanup
+ // which will need to acquire Fcb->Resource exclusively. Failure
+ // to obtain it here before holding the SectionObjectResource will
+ // permit the locks to be obtained out of order risking a deadlock.
+ //
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetRenameInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+ "AFSSetRenameInfo Acquiring Fcb lock %p EXCL %08lX\n",
+ &pTargetFcb->NPFcb->Resource,
+ PsGetCurrentThread());
+
+ AFSAcquireExcl( &pTargetFcb->NPFcb->Resource,
+ TRUE);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetRenameInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
&pTargetFcb->NPFcb->SectionObjectResource,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSSetRenameInfo Failed to delete section for target file %wZ\n",
- &pTargetDirEntry->NameInformation.FileName);
+ &uniTargetName);
}
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetRenameInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+ "AFSSetRenameInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
&pTargetFcb->NPFcb->SectionObjectResource,
PsGetCurrentThread());
AFSReleaseResource( &pTargetFcb->NPFcb->SectionObjectResource);
- }
-
- ASSERT( pTargetDirEntry->DirOpenReferenceCount > 0);
-
- lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount); // The count we added above
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetRenameInfo Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
- &pTargetDirEntry->NameInformation.FileName,
- pTargetDirEntry,
- pSrcCcb,
- lCount);
- ASSERT( lCount >= 0);
-
- if( lCount == 0)
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetRenameInfo Deleting dir entry %p name %wZ\n",
- pTargetDirEntry,
- &pTargetDirEntry->NameInformation.FileName);
+ "AFSSetRenameInfo Releasing Fcb lock %p EXCL %08lX\n",
+ &pTargetFcb->NPFcb->Resource,
+ PsGetCurrentThread());
- AFSDeleteDirEntry( pTargetParentObject,
- pTargetDirEntry);
+ AFSReleaseResource( &pTargetFcb->NPFcb->Resource);
}
-
- pTargetDirEntry = NULL;
}
try_exit:
if( bTargetEntryExists)
{
- AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
+
+ ASSERT( pTargetParentObject != NULL);
+
+ AFSInsertDirectoryNode( pTargetParentObject,
pTargetDirEntry,
FALSE);
}
if( bReleaseTargetDirLock)
{
+
AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
if( bReleaseSourceDirLock)
{
+
AFSReleaseResource( pSourceDirLock);
}
- }
- if ( bDereferenceTargetParentObject)
- {
+ if ( bDereferenceTargetParentObject)
+ {
- ObDereferenceObject( pTargetParentFileObj);
+ ObDereferenceObject( pTargetParentFileObj);
+ }
+
+ if ( pSrcParentObject != NULL)
+ {
+
+ AFSReleaseObjectInfo( &pSrcParentObject);
+ }
+
+ //
+ // No need to release pTargetParentObject as it is either a copy of pSrcParentObject
+ // or (AFSFcb *)pTargetFileObj->FsContext->ObjectInformation
+ //
+
+ pTargetParentObject = NULL;
}
return ntStatus;
AFSSetPositionInfo( IN PIRP Irp,
IN AFSDirectoryCB *DirectoryCB)
{
+ UNREFERENCED_PARAMETER(DirectoryCB);
NTSTATUS ntStatus = STATUS_SUCCESS;
PFILE_POSITION_INFORMATION pBuffer;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSSetAllocationInfo( IN PIRP Irp,
IN AFSDirectoryCB *DirectoryCB)
{
+ UNREFERENCED_PARAMETER(DirectoryCB);
NTSTATUS ntStatus = STATUS_SUCCESS;
PFILE_ALLOCATION_INFORMATION pBuffer;
BOOLEAN bReleasePaging = FALSE;
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetAllocationInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+ "AFSSetAllocationInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
&pFcb->NPFcb->SectionObjectResource,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetAllocationInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+ "AFSSetAllocationInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
&pFcb->NPFcb->SectionObjectResource,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
+ "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
&pFcb->NPFcb->PagingResource,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
+ "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
&pFcb->NPFcb->PagingResource,
PsGetCurrentThread());
//
if (bTellService)
{
- ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
+
+ ASSERT( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID));
+
+ ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentFileId,
pFcb->ObjectInformation,
&pCcb->AuthGroup);
}
AFSSetEndOfFileInfo( IN PIRP Irp,
IN AFSDirectoryCB *DirectoryCB)
{
+ UNREFERENCED_PARAMETER(DirectoryCB);
NTSTATUS ntStatus = STATUS_SUCCESS;
PFILE_END_OF_FILE_INFORMATION pBuffer;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetEndOfFileInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+ "AFSSetEndOfFileInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
&pFcb->NPFcb->SectionObjectResource,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetEndOfFileInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+ "AFSSetEndOfFileInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
&pFcb->NPFcb->SectionObjectResource,
PsGetCurrentThread());
//
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
+ "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
&pFcb->NPFcb->PagingResource,
PsGetCurrentThread());
//
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
+ "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
&pFcb->NPFcb->PagingResource,
PsGetCurrentThread());
// Tell the server
//
- ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
+ ASSERT( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID));
+
+ ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentFileId,
pFcb->ObjectInformation,
&pCcb->AuthGroup);
IN AFSCcb *Ccb)
{
+ UNREFERENCED_PARAMETER(Fcb);
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
- ULONG ulOutputBufferLen = 0, ulInputBufferLen;
FILE_INFORMATION_CLASS ulFileInformationClass;
void *pPipeInfo = NULL;
IN AFSCcb *Ccb)
{
+ UNREFERENCED_PARAMETER(Fcb);
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
- ULONG ulOutputBufferLen = 0, ulInputBufferLen;
FILE_INFORMATION_CLASS ulFileInformationClass;
void *pPipeInfo = NULL;
IN OUT LONG *Length)
{
+ UNREFERENCED_PARAMETER(Fcb);
+ UNREFERENCED_PARAMETER(Ccb);
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
FILE_INFORMATION_CLASS ulFileInformationClass;