/*
* Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
- * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2014 Your File System, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
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;
__try
if( pFcb == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSQueryFileInfo Attempted access (%08lX) when pFcb == NULL\n",
- Irp);
+ "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;
+ if ( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY))
+ {
+
+ RtlZeroMemory( &stAuthGroup,
+ sizeof( GUID));
+
+ AFSRetrieveAuthGroupFnc( (ULONGLONG)PsGetCurrentProcessId(),
+ (ULONGLONG)PsGetCurrentThreadId(),
+ &stAuthGroup);
+
+ ntStatus = AFSVerifyEntry( &stAuthGroup,
+ pCcb->DirectoryCB,
+ FALSE);
+
+ if ( NT_SUCCESS( ntStatus))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSQueryFileInfo FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pFcb->ObjectInformation->FileId.Cell,
+ pFcb->ObjectInformation->FileId.Volume,
+ pFcb->ObjectInformation->FileId.Vnode,
+ pFcb->ObjectInformation->FileId.Unique));
+
+ ClearFlag( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ }
+ else
+ {
+
+ ntStatus = STATUS_SUCCESS;
+ }
+ }
+
//
// Grab the main shared right off the bat
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( 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());
+ PsGetCurrentThread()));
AFSAcquireShared( &pFcb->NPFcb->Resource,
TRUE);
if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueryFileInfo Processing request against SpecialShare Fcb\n");
+ "AFSQueryFileInfo Processing request against SpecialShare Fcb\n"));
ntStatus = AFSProcessShareQueryInfo( Irp,
pFcb,
}
else if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueryFileInfo request against PIOCtl Fcb\n");
+ "AFSQueryFileInfo request against PIOCtl Fcb\n"));
ntStatus = AFSProcessPIOCtlQueryInfo( Irp,
pFcb,
try_return( ntStatus);
}
+ else if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB)
+ {
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSQueryFileInfo request against Invalid Fcb\n"));
+
+ try_return( ntStatus = STATUS_ACCESS_DENIED);
+ }
+
//
// Process the request
//
try_return( ntStatus);
}
- ntStatus = AFSQueryAccess( Irp,
- pFcb,
- &pAllInfo->AccessInformation,
- &lLength);
+ //
+ // We skip setting AccessInformation since this is set by the IO Mgr prior
+ // to sending this request to the file system
+ //
- if( !NT_SUCCESS( ntStatus))
+ if( lLength < sizeof( FILE_ACCESS_INFORMATION))
{
-
- try_return( ntStatus);
+ try_return( ntStatus = STATUS_BUFFER_TOO_SMALL);
}
+ lLength -= sizeof( FILE_ACCESS_INFORMATION);
+
ntStatus = AFSQueryPositionInfo( Irp,
pFcb,
&pAllInfo->PositionInformation,
try_return( ntStatus);
}
- ntStatus = AFSQueryMode( Irp,
- pFcb,
- &pAllInfo->ModeInformation,
- &lLength);
+ //
+ // We skip setting ModeInformation and AlignmentInformation since this is set by the IO Mgr prior
+ // to sending this request to the file system
+ //
- if( !NT_SUCCESS( ntStatus))
+ if( lLength < sizeof( FILE_MODE_INFORMATION))
{
-
- try_return( ntStatus);
+ try_return( ntStatus = STATUS_BUFFER_TOO_SMALL);
}
- ntStatus = AFSQueryAlignment( Irp,
- pFcb,
- &pAllInfo->AlignmentInformation,
- &lLength);
+ lLength -= sizeof( FILE_MODE_INFORMATION);
- if( !NT_SUCCESS( ntStatus))
+ if( lLength < sizeof( FILE_ALIGNMENT_INFORMATION))
{
-
- try_return( ntStatus);
+ try_return( ntStatus = STATUS_BUFFER_TOO_SMALL);
}
+ lLength -= sizeof( FILE_ALIGNMENT_INFORMATION);
+
+ //
+ // Populate the name information
+ //
+
ntStatus = AFSQueryNameInfo( Irp,
pCcb->DirectoryCB,
&pAllInfo->NameInformation,
break;
}
+ case FileNormalizedNameInformation:
case FileNameInformation:
{
pCcb->DirectoryCB != NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSQueryFileInfo Failed to process request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
&pCcb->DirectoryCB->NameInformation.FileName,
- pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
- pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
- pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
- pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
- ntStatus);
+ pFcb->ObjectInformation->FileId.Cell,
+ pFcb->ObjectInformation->FileId.Volume,
+ pFcb->ObjectInformation->FileId.Vnode,
+ pFcb->ObjectInformation->FileId.Unique,
+ ntStatus));
}
}
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
- AFSDbgLogMsg( 0,
+ AFSDbgTrace(( 0,
0,
- "EXCEPTION - AFSQueryFileInfo\n");
+ "EXCEPTION - AFSQueryFileInfo\n"));
+
+ AFSDumpTraceFilesFnc();
ntStatus = STATUS_UNSUCCESSFUL;
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;
BOOLEAN bReleaseMain = FALSE;
BOOLEAN bUpdateFileInfo = FALSE;
- BOOLEAN bReleaseVolumeLock = FALSE;
AFSFileID stParentFileId;
__try
if( pFcb == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSSetFileInfo Attempted access (%08lX) when pFcb == NULL\n",
- Irp);
+ "AFSSetFileInfo Attempted access (%p) when pFcb == NULL\n",
+ Irp));
try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
}
bCanQueueRequest = !(IoIsOperationSynchronous( Irp) | (KeGetCurrentIrql() != PASSIVE_LEVEL));
FileInformationClass = pIrpSp->Parameters.SetFile.FileInformationClass;
- if( FileInformationClass == FileRenameInformation)
- {
-
- AFSAcquireExcl( pFcb->ObjectInformation->VolumeCB->VolumeLock,
- TRUE);
-
- bReleaseVolumeLock = TRUE;
- }
-
//
// Grab the Fcb EXCL
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( 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());
+ PsGetCurrentThread()));
AFSAcquireExcl( &pFcb->NPFcb->Resource,
TRUE);
if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSSetFileInfo Failing request against PIOCtl Fcb\n");
+ "AFSSetFileInfo Failing request against PIOCtl Fcb\n"));
try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
}
else if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetFileInfo Processing request against SpecialShare Fcb\n");
+ "AFSSetFileInfo Processing request against SpecialShare Fcb\n"));
ntStatus = AFSProcessShareSetInfo( Irp,
pFcb,
try_return( ntStatus);
}
- if( BooleanFlagOn( pFcb->ObjectInformation->VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
+ if( FileInformationClass != FilePositionInformation &&
+ BooleanFlagOn( pFcb->ObjectInformation->VolumeCB->VolumeInformation.FileSystemAttributes, FILE_READ_ONLY_VOLUME))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSSetFileInfo Request failed due to read only volume\n",
- Irp);
+ Irp));
+
+ try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
+ }
+
+ if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB &&
+ FileInformationClass != FileDispositionInformation)
+ {
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetFileInfo request against Invalid Fcb\n"));
try_return( ntStatus = STATUS_ACCESS_DENIED);
}
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;
}
//
case FileBasicInformation:
{
- bUpdateFileInfo = TRUE;
-
ntStatus = AFSSetBasicInfo( Irp,
- pCcb->DirectoryCB);
+ pCcb->DirectoryCB,
+ &bUpdateFileInfo);
break;
}
case FileLinkInformation:
{
- ntStatus = STATUS_INVALID_DEVICE_REQUEST;
+ ntStatus = AFSSetFileLinkInfo( Irp);
break;
}
AFSReleaseResource( &pFcb->NPFcb->Resource);
}
- if( bReleaseVolumeLock)
- {
- AFSReleaseResource( pFcb->ObjectInformation->VolumeCB->VolumeLock);
- }
-
if( NT_SUCCESS( ntStatus) &&
bUpdateFileInfo)
{
AFSUnwindFileInfo( pFcb,
pCcb);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSSetFileInfo Failed to send file info update to service request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
&pCcb->DirectoryCB->NameInformation.FileName,
- pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
- pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
- pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
- pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
- ntStatus);
+ pFcb->ObjectInformation->FileId.Cell,
+ pFcb->ObjectInformation->FileId.Volume,
+ pFcb->ObjectInformation->FileId.Vnode,
+ pFcb->ObjectInformation->FileId.Unique,
+ ntStatus));
AFSReleaseResource( &pFcb->NPFcb->Resource);
}
pCcb->DirectoryCB != NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSSetFileInfo Failed to process request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
&pCcb->DirectoryCB->NameInformation.FileName,
- pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
- pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
- pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
- pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
- ntStatus);
+ pFcb->ObjectInformation->FileId.Cell,
+ pFcb->ObjectInformation->FileId.Volume,
+ pFcb->ObjectInformation->FileId.Vnode,
+ pFcb->ObjectInformation->FileId.Unique,
+ ntStatus));
}
}
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
- AFSDbgLogMsg( 0,
+ AFSDbgTrace(( 0,
0,
- "EXCEPTION - AFSSetFileInfo\n");
+ "EXCEPTION - AFSSetFileInfo\n"));
+
+ AFSDumpTraceFilesFnc();
ntStatus = STATUS_UNSUCCESSFUL;
+
+ if( bReleaseMain)
+ {
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+ }
}
AFSCompleteRequest( Irp,
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,
- NULL,
+ pCcb->NameArray,
&pCcb->AuthGroup,
&stFileInfo)))
{
- ulFileAttribs = stFileInfo.FileAttributes;
- ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
+ if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ {
+
+ ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
+ }
}
AFSAcquireShared( &pFcb->NPFcb->Resource,
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( 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);
+ pFcb->ObjectInformation->FileType,
+ pFcb->ObjectInformation->FileAttributes,
+ ulFileAttribs));
Buffer->CreationTime = DirectoryCB->ObjectInformation->CreationTime;
Buffer->LastAccessTime = DirectoryCB->ObjectInformation->LastAccessTime;
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,
- NULL,
+ pCcb->NameArray,
&pCcb->AuthGroup,
&stFileInfo)))
{
- ulFileAttribs = stFileInfo.FileAttributes;
+
+ if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ {
+
+ ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
+ }
}
AFSAcquireShared( &pFcb->NPFcb->Resource,
TRUE);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( 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);
+ pFcb->ObjectInformation->FileType,
+ pFcb->ObjectInformation->FileAttributes,
+ ulFileAttribs));
Buffer->Directory = BooleanFlagOn( ulFileAttribs, 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);
}
NTSTATUS
-AFSQueryAccess( IN PIRP Irp,
- IN AFSFcb *Fcb,
- IN OUT PFILE_ACCESS_INFORMATION Buffer,
- IN OUT PLONG Length)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if( *Length >= sizeof( FILE_ACCESS_INFORMATION))
- {
-
- RtlZeroMemory( Buffer,
- *Length);
-
- Buffer->AccessFlags = 0;
-
- *Length -= sizeof( FILE_ACCESS_INFORMATION);
- }
- else
- {
-
- ntStatus = STATUS_BUFFER_TOO_SMALL;
- }
-
- return ntStatus;
-}
-
-NTSTATUS
-AFSQueryMode( IN PIRP Irp,
- IN AFSFcb *Fcb,
- IN OUT PFILE_MODE_INFORMATION Buffer,
- IN OUT PLONG Length)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if( *Length >= sizeof( FILE_MODE_INFORMATION))
- {
-
- RtlZeroMemory( Buffer,
- *Length);
-
- Buffer->Mode = 0;
-
- *Length -= sizeof( FILE_MODE_INFORMATION);
- }
- else
- {
-
- ntStatus = STATUS_BUFFER_TOO_SMALL;
- }
-
- return ntStatus;
-}
-
-NTSTATUS
-AFSQueryAlignment( IN PIRP Irp,
- IN AFSFcb *Fcb,
- IN OUT PFILE_ALIGNMENT_INFORMATION Buffer,
- IN OUT PLONG Length)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if( *Length >= sizeof( FILE_ALIGNMENT_INFORMATION))
- {
-
- RtlZeroMemory( Buffer,
- *Length);
-
- Buffer->AlignmentRequirement = 1;
-
- *Length -= sizeof( FILE_ALIGNMENT_INFORMATION);
- }
- else
- {
-
- ntStatus = STATUS_BUFFER_TOO_SMALL;
- }
-
- return ntStatus;
-}
-
-NTSTATUS
AFSQueryNameInfo( IN PIRP Irp,
IN AFSDirectoryCB *DirectoryCB,
IN OUT PFILE_NAME_INFORMATION Buffer,
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,
- NULL,
+ pCcb->NameArray,
&pCcb->AuthGroup,
&stFileInfo)))
{
- ulFileAttribs = stFileInfo.FileAttributes;
- ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
+ if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ {
+
+ ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
+ }
}
AFSAcquireShared( &pFcb->NPFcb->Resource,
TRUE);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( 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);
+ pFcb->ObjectInformation->FileType,
+ pFcb->ObjectInformation->FileAttributes,
+ ulFileAttribs));
Buffer->CreationTime.QuadPart = DirectoryCB->ObjectInformation->CreationTime.QuadPart;
Buffer->LastAccessTime.QuadPart = DirectoryCB->ObjectInformation->LastAccessTime.QuadPart;
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,
- NULL,
+ pCcb->NameArray,
&pCcb->AuthGroup,
&stFileInfo)))
{
- ulFileAttribs = stFileInfo.FileAttributes;
- ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
+ if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ {
+
+ ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
+ }
}
AFSAcquireShared( &pFcb->NPFcb->Resource,
TRUE);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( 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);
+ pFcb->ObjectInformation->FileType,
+ pFcb->ObjectInformation->FileAttributes,
+ ulFileAttribs));
Buffer->FileAttributes = ulFileAttribs;
}
}
- 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_OPENAFS_DFS;
+
+ 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;
NTSTATUS
AFSSetBasicInfo( IN PIRP Irp,
- IN AFSDirectoryCB *DirectoryCB)
+ IN AFSDirectoryCB *DirectoryCB,
+ OUT BOOLEAN *bUpdateFileInfo)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PFILE_BASIC_INFORMATION pBuffer;
if( pBuffer->FileAttributes != (ULONGLONG)0)
{
- if( DirectoryCB->ObjectInformation->Fcb->Header.NodeTypeCode == AFS_FILE_FCB &&
- BooleanFlagOn( pBuffer->FileAttributes, FILE_ATTRIBUTE_DIRECTORY))
- {
+ //
+ // Make sure that the reparse point attribute is not modified.
+ // Fail if the RP attribute is requested but it is not
+ // already a RP. Otherwise, ignore it.
+ //
- try_return( ntStatus = STATUS_INVALID_PARAMETER);
- }
+ if ( !BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes,
+ FILE_ATTRIBUTE_REPARSE_POINT) &&
+ BooleanFlagOn( pBuffer->FileAttributes,
+ FILE_ATTRIBUTE_REPARSE_POINT))
+ {
- if( DirectoryCB->ObjectInformation->Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
- {
+ try_return( ntStatus = STATUS_INVALID_PARAMETER);
+ }
- pBuffer->FileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
- }
+ //
+ // Make sure that the directory attribute is not modified.
+ // Fail if the D attribute is requested but it is not
+ // already a directory. Otherwise, ignore it.
+ //
+
+ if ( !BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes,
+ FILE_ATTRIBUTE_DIRECTORY) &&
+ BooleanFlagOn( pBuffer->FileAttributes,
+ FILE_ATTRIBUTE_DIRECTORY))
+ {
+
+ try_return( ntStatus = STATUS_INVALID_PARAMETER);
+ }
+
+ //
+ // Save the original value
+ //
- pCcb->FileUnwindInfo.FileAttributes = DirectoryCB->ObjectInformation->FileAttributes;
+ pCcb->FileUnwindInfo.FileAttributes = DirectoryCB->ObjectInformation->FileAttributes;
- DirectoryCB->ObjectInformation->FileAttributes = pBuffer->FileAttributes;
+ if( BooleanFlagOn( pBuffer->FileAttributes, FILE_ATTRIBUTE_READONLY))
+ {
- ulNotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
+ //
+ // Set the readonly flag.
+ //
- SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
+ if ( !BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes,
+ FILE_ATTRIBUTE_READONLY))
+ {
+
+ if ( DirectoryCB->ObjectInformation->FileAttributes == FILE_ATTRIBUTE_NORMAL)
+ {
+
+ DirectoryCB->ObjectInformation->FileAttributes = FILE_ATTRIBUTE_READONLY;
+ }
+ else
+ {
+
+ DirectoryCB->ObjectInformation->FileAttributes |= FILE_ATTRIBUTE_READONLY;
+ }
+
+ ulNotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
+
+ SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
+ }
+ }
+ else
+ {
+ //
+ // Reset the readonly flag.
+ //
+
+ if ( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes,
+ FILE_ATTRIBUTE_READONLY))
+ {
+
+ DirectoryCB->ObjectInformation->FileAttributes &= ~FILE_ATTRIBUTE_READONLY;
+
+ if ( DirectoryCB->ObjectInformation->FileAttributes == 0)
+ {
+
+ DirectoryCB->ObjectInformation->FileAttributes = FILE_ATTRIBUTE_NORMAL;
+ }
+
+ ulNotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
+
+ SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
+ }
+ }
}
pCcb->FileUnwindInfo.CreationTime.QuadPart = (ULONGLONG)-1;
ulNotifyFilter |= FILE_NOTIFY_CHANGE_LAST_WRITE;
SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
+
+ SetFlag( pCcb->Flags, CCB_FLAG_LAST_WRITE_TIME_SET);
+
+ } else if ( pBuffer->LastWriteTime.QuadPart == (ULONGLONG)-1) {
+
+ SetFlag( pCcb->Flags, CCB_FLAG_LAST_WRITE_TIME_SET);
}
pCcb->FileUnwindInfo.ChangeTime.QuadPart = (ULONGLONG)-1;
if( ulNotifyFilter > 0)
{
- if( DirectoryCB->ObjectInformation->ParentObjectInformation != NULL)
+ *bUpdateFileInfo = TRUE;
+
+ 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,
+ TRUE);
+
+ if ( pParentObjectInfo != NULL)
+ {
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+ pCcb,
+ (ULONG)ulNotifyFilter,
+ (ULONG)FILE_ACTION_MODIFIED);
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
}
}
if( pFcb->Header.NodeTypeCode == AFS_ROOT_FCB)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSSetDispositionInfo Attempt to delete root entry\n");
+ "AFSSetDispositionInfo Attempt to delete root entry\n"));
try_return( ntStatus = STATUS_CANNOT_DELETE);
}
if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_READONLY))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSSetDispositionInfo Attempt to delete read only entry %wZ\n",
- &DirectoryCB->NameInformation.FileName);
+ &DirectoryCB->NameInformation.FileName));
try_return( ntStatus = STATUS_CANNOT_DELETE);
}
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSSetDispositionInfo Cannot delete entry %wZ Status %08lX\n",
&DirectoryCB->NameInformation.FileName,
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
{
//
+ // Reduce the Link count in the object information block
+ // to correspond with the deletion of the directory entry.
+ //
+
+ pFcb->ObjectInformation->Links--;
+
+ //
// Check if this is a directory that there are not currently other opens
//
if( pFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount > 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSSetDispositionInfo Attempt to delete directory %wZ with open %u handles\n",
&DirectoryCB->NameInformation.FileName,
- pFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount);
-
- try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
- }
-
- if( !AFSIsDirectoryEmptyForDelete( pFcb))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSSetDispositionInfo Attempt to delete non-empty directory %wZ\n",
- &DirectoryCB->NameInformation.FileName);
+ pFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount));
try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
}
- }
- else
- {
//
- // Attempt to flush any outstanding data
+ // Make sure the directory is enumerated before checking to see if it is empty.
//
- if( !MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers,
- MmFlushForDelete))
+ if( !BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSSetDispositionInfo Failed to flush image section for delete Entry %wZ\n",
- &DirectoryCB->NameInformation.FileName);
+ AFSAcquireExcl( pFcb->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
- try_return( ntStatus = STATUS_CANNOT_DELETE);
- }
+ if( !BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
+ {
- //
- // Purge the cache as well
- //
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetDispositionInfo Enumerating parent FID %08lX-%08lX-%08lX-%08lX\n",
+ pFcb->ObjectInformation->FileId.Cell,
+ pFcb->ObjectInformation->FileId.Volume,
+ pFcb->ObjectInformation->FileId.Vnode,
+ pFcb->ObjectInformation->FileId.Unique));
- if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
- {
+ ntStatus = AFSEnumerateDirectory( &pCcb->AuthGroup,
+ pFcb->ObjectInformation,
+ TRUE);
- CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- TRUE);
- }
- }
+ if( !NT_SUCCESS( ntStatus))
+ {
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
- DirectoryCB,
- &DirectoryCB->NameInformation.FileName);
+ AFSReleaseResource( pFcb->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
- SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetDispositionInfo Failed to enumerate parent FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ pFcb->ObjectInformation->FileId.Cell,
+ pFcb->ObjectInformation->FileId.Volume,
+ pFcb->ObjectInformation->FileId.Vnode,
+ pFcb->ObjectInformation->FileId.Unique,
+ ntStatus));
+
+ try_return( ntStatus);
+ }
+ }
+
+ AFSReleaseResource( pFcb->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ }
+
+ if( !AFSIsDirectoryEmptyForDelete( pFcb))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetDispositionInfo Attempt to delete non-empty directory %wZ\n",
+ &DirectoryCB->NameInformation.FileName));
+
+ try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
+ }
+
+ AFSDbgTrace(( 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 if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
+ {
+ BOOLEAN bMmFlushed;
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetDispositionInfo Acquiring Fcb lock %p EXCL %08lX\n",
+ &pFcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pFcb->NPFcb->Resource,
+ TRUE);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetDispositionInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pFcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ __try
+ {
+
+ //
+ // Attempt to flush any outstanding data
+ //
+
+ 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.
+ //
+
+ AFSDbgTrace(( 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
+ //
+
+ if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
+ {
+
+ if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ TRUE))
+ {
+
+ SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ }
+ }
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
+
+ bMmFlushed = FALSE;
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSSetDispositionInfo MmFlushImageSection failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ pFcb->ObjectInformation->FileId.Cell,
+ pFcb->ObjectInformation->FileId.Volume,
+ pFcb->ObjectInformation->FileId.Vnode,
+ pFcb->ObjectInformation->FileId.Unique,
+ ntStatus));
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetDispositionInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pFcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetDispositionInfo Releasing Fcb lock %p EXCL %08lX\n",
+ &pFcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
+ if ( !bMmFlushed)
+ {
+
+ AFSDbgTrace(( 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)
+ {
+
+ AFSDbgTrace(( 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
+AFSSetFileLinkInfo( IN PIRP Irp)
+{
+
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
+ PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
+ PFILE_LINK_INFORMATION pFileLinkInfo = NULL;
+ PFILE_OBJECT pSrcFileObj = NULL;
+ PFILE_OBJECT pTargetFileObj = pIrpSp->Parameters.SetFile.FileObject;
+ AFSFcb *pSrcFcb = NULL, *pTargetDcb = NULL;
+ AFSCcb *pSrcCcb = NULL, *pTargetDirCcb = NULL;
+ AFSObjectInfoCB *pSrcObject = NULL;
+ AFSObjectInfoCB *pSrcParentObject = NULL, *pTargetParentObject = NULL;
+ UNICODE_STRING uniSourceName, uniTargetName;
+ UNICODE_STRING uniFullTargetName, uniTargetParentName;
+ BOOLEAN bCommonParent = FALSE;
+ AFSDirectoryCB *pTargetDirEntry = NULL;
+ AFSDirectoryCB *pNewTargetDirEntry = NULL;
+ ULONG ulTargetCRC;
+ BOOLEAN bTargetEntryExists = FALSE;
+ LONG lCount;
+ BOOLEAN bReleaseTargetDirLock = FALSE;
+ ULONG ulNotificationAction = 0, ulNotifyFilter = 0;
+
+ __Enter
+ {
+
+ pSrcFileObj = pIrpSp->FileObject;
+
+ pSrcFcb = (AFSFcb *)pSrcFileObj->FsContext;
+ pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
+
+ pSrcObject = pSrcFcb->ObjectInformation;
+
+ if ( BooleanFlagOn( pSrcObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pSrcParentObject = AFSFindObjectInfo( pSrcObject->VolumeCB,
+ &pSrcObject->ParentFileId,
+ TRUE);
+ }
+
+ if( pSrcParentObject == NULL)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetFileLinkInfo Unable to resolve SrcParentObject (INVALID_PARAMETER)\n"));
+
+ ASSERT( FALSE);
+
+ try_return( ntStatus = STATUS_INVALID_PARAMETER);
+ }
+
+ pFileLinkInfo = (PFILE_LINK_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
+
+ //
+ // Perform some basic checks to ensure FS integrity
+ //
+
+ if( pSrcFcb->Header.NodeTypeCode != AFS_FILE_FCB)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetFileLinkInfo Attempt to non-file (INVALID_PARAMETER)\n"));
+
+ try_return( ntStatus = STATUS_INVALID_PARAMETER);
+ }
+
+ if( pTargetFileObj == NULL)
+ {
+
+ if ( pFileLinkInfo->RootDirectory)
+ {
+
+ //
+ // The target directory is provided by HANDLE
+ // RootDirectory is only set when the target directory is not the same
+ // as the source directory.
+ //
+ // AFS only supports hard links within a single directory.
+ //
+ // The IOManager should translate any Handle to a FileObject for us.
+ // However, the failure to receive a FileObject is treated as a fatal
+ // error.
+ //
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetFileLinkInfo Attempt to link %wZ to alternate directory by handle INVALID_PARAMETER\n",
+ &pSrcCcb->DirectoryCB->NameInformation.FileName));
+
+ try_return( ntStatus = STATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+
+ uniFullTargetName.Length = (USHORT)pFileLinkInfo->FileNameLength;
+
+ uniFullTargetName.Buffer = (PWSTR)&pFileLinkInfo->FileName;
+
+ AFSRetrieveFinalComponent( &uniFullTargetName,
+ &uniTargetName);
+
+ AFSRetrieveParentPath( &uniFullTargetName,
+ &uniTargetParentName);
+
+ if ( uniTargetParentName.Length == 0)
+ {
+
+ //
+ // This is a simple rename. Here the target directory is the same as the source parent directory
+ // and the name is retrieved from the system buffer information
+ //
+
+ pTargetParentObject = pSrcParentObject;
+ }
+ else
+ {
+ //
+ // uniTargetParentName contains the directory the renamed object
+ // will be moved to. Must obtain the TargetParentObject.
+ //
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetFileLinkInfo Attempt to link %wZ to alternate directory %wZ (NOT_SAME_DEVICE)\n",
+ &pSrcCcb->DirectoryCB->NameInformation.FileName,
+ &uniFullTargetName));
+
+ try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
+ }
+ }
+
+ pTargetDcb = pTargetParentObject->Fcb;
+ }
+ else
+ {
+
+ //
+ // So here we have the target directory taken from the targetfile object
+ //
+
+ pTargetDcb = (AFSFcb *)pTargetFileObj->FsContext;
+
+ pTargetDirCcb = (AFSCcb *)pTargetFileObj->FsContext2;
+
+ pTargetParentObject = (AFSObjectInfoCB *)pTargetDcb->ObjectInformation;
+
+ //
+ // Grab the target name which we setup in the IRP_MJ_CREATE handler. By how we set this up
+ // it is only the target component of the rename operation
+ //
+
+ uniTargetName = *((PUNICODE_STRING)&pTargetFileObj->FileName);
+ }
+
+ //
+ // The quick check to see if they are self linking.
+ // Do the names match? Only do this where the parent directories are
+ // the same
+ //
+
+ if( pTargetParentObject == pSrcParentObject)
+ {
+
+ if( FsRtlAreNamesEqual( &uniTargetName,
+ &uniSourceName,
+ FALSE,
+ NULL))
+ {
+ try_return( ntStatus = STATUS_SUCCESS);
+ }
+
+ bCommonParent = TRUE;
+ }
+ else
+ {
+
+ //
+ // We do not allow cross-volume hard links
+ //
+
+ if( pTargetParentObject->VolumeCB != pSrcObject->VolumeCB)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetFileLinkInfo Attempt to link to different volume %wZ\n",
+ &pSrcCcb->DirectoryCB->NameInformation.FileName));
+
+ try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
+ }
+ }
+
+ ulTargetCRC = AFSGenerateCRC( &uniTargetName,
+ FALSE);
+
+ AFSAcquireExcl( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
+ bReleaseTargetDirLock = TRUE;
+
+ AFSLocateCaseSensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
+ ulTargetCRC,
+ &pTargetDirEntry);
+
+ if( pTargetDirEntry == NULL)
+ {
+
+ //
+ // Missed so perform a case insensitive lookup
+ //
+
+ ulTargetCRC = AFSGenerateCRC( &uniTargetName,
+ TRUE);
+
+ AFSLocateCaseInsensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
+ ulTargetCRC,
+ &pTargetDirEntry);
+ }
+
+ if ( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+ pTargetDirEntry == NULL && RtlIsNameLegalDOS8Dot3( &uniTargetName,
+ NULL,
+ NULL))
+ {
+ //
+ // Try the short name
+ //
+ AFSLocateShortNameDirEntry( pTargetParentObject->Specific.Directory.ShortNameTree,
+ ulTargetCRC,
+ &pTargetDirEntry);
+ }
+
+ //
+ // Increment our ref count on the dir entry
+ //
+
+ if( pTargetDirEntry != NULL)
+ {
+
+ ASSERT( BooleanFlagOn( pTargetDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+ AFSIsEqualFID( &pTargetParentObject->FileId, &pTargetDirEntry->ObjectInformation->ParentFileId));
+
+ lCount = InterlockedIncrement( &pTargetDirEntry->DirOpenReferenceCount);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetFileLinkInfo Increment count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pTargetDirEntry->NameInformation.FileName,
+ pTargetDirEntry,
+ pSrcCcb,
+ lCount));
+
+ ASSERT( lCount >= 0);
+
+ if( !pFileLinkInfo->ReplaceIfExists)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetFileLinkInfo Attempt to link with target collision %wZ Target %wZ\n",
+ &pSrcCcb->DirectoryCB->NameInformation.FileName,
+ &pTargetDirEntry->NameInformation.FileName));
+
+ try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetFileLinkInfo Target %wZ exists DE %p Count %d, performing delete of target\n",
+ &pTargetDirEntry->NameInformation.FileName,
+ pTargetDirEntry,
+ lCount));
+
+ //
+ // Pull the directory entry from the parent
+ //
+
+ AFSRemoveDirNodeFromParent( pTargetParentObject,
+ pTargetDirEntry,
+ FALSE);
+
+ bTargetEntryExists = TRUE;
+ }
+ else
+ {
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetFileLinkInfo Target does NOT exist, normal linking\n"));
+ }
+
+ //
+ // OK, this is a simple rename. Issue the rename
+ // request to the service.
+ //
+
+ ntStatus = AFSNotifyHardLink( pSrcObject,
+ &pSrcCcb->AuthGroup,
+ pSrcParentObject,
+ pTargetDcb->ObjectInformation,
+ pSrcCcb->DirectoryCB,
+ &uniTargetName,
+ pFileLinkInfo->ReplaceIfExists,
+ &pNewTargetDirEntry);
+
+ if( ntStatus != STATUS_REPARSE &&
+ !NT_SUCCESS( ntStatus))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetFileLinkInfo Failed link of %wZ to target %wZ Status %08lX\n",
+ &pSrcCcb->DirectoryCB->NameInformation.FileName,
+ &uniTargetName,
+ ntStatus));
+
+ try_return( ntStatus);
+ }
+
+ if ( ntStatus != STATUS_REPARSE)
+ {
+
+ AFSInsertDirectoryNode( pTargetDcb->ObjectInformation,
+ pNewTargetDirEntry,
+ TRUE);
+ }
+
+ //
+ // Send notification for the target link file
+ //
+
+ if( bTargetEntryExists || pNewTargetDirEntry)
+ {
+
+ ulNotificationAction = FILE_ACTION_MODIFIED;
+ }
+ else
+ {
+
+ ulNotificationAction = FILE_ACTION_ADDED;
+ }
+
+ AFSFsRtlNotifyFullReportChange( pTargetParentObject,
+ pSrcCcb,
+ (ULONG)ulNotifyFilter,
+ (ULONG)ulNotificationAction);
+
+ try_exit:
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+
+ if( bTargetEntryExists)
+ {
+
+ AFSInsertDirectoryNode( pTargetParentObject,
+ pTargetDirEntry,
+ FALSE);
+ }
+ }
+
+ if( pTargetDirEntry != NULL)
+ {
+
+ //
+ // Release DirOpenReferenceCount obtained above
+ //
+
+ lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetFileLinkInfo Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pTargetDirEntry->NameInformation.FileName,
+ pTargetDirEntry,
+ pSrcCcb,
+ lCount));
+
+ ASSERT( lCount >= 0);
+ }
+
+ if( pNewTargetDirEntry != NULL)
+ {
+
+ //
+ // Release DirOpenReferenceCount obtained from AFSNotifyHardLink
+ //
+
+ lCount = InterlockedDecrement( &pNewTargetDirEntry->DirOpenReferenceCount);
+
+ AFSDbgTrace(( 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
AFSSetRenameInfo( IN PIRP Irp)
{
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;
PFILE_OBJECT pTargetFileObj = pIrpSp->Parameters.SetFile.FileObject;
+ PFILE_OBJECT pTargetParentFileObj = NULL;
PFILE_RENAME_INFORMATION pRenameInfo = NULL;
- UNICODE_STRING uniTargetName, uniSourceName;
+ UNICODE_STRING uniTargetName, uniSourceName, uniTargetParentName;
BOOLEAN bReplaceIfExists = FALSE;
UNICODE_STRING uniShortName;
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 uniFullTargetPath;
+ UNICODE_STRING uniFullTargetName;
BOOLEAN bCommonParent = FALSE;
BOOLEAN bReleaseTargetDirLock = FALSE;
BOOLEAN bReleaseSourceDirLock = FALSE;
+ BOOLEAN bDereferenceTargetParentObject = FALSE;
PERESOURCE pSourceDirLock = NULL;
+ LONG lCount;
__Enter
{
bReplaceIfExists = pIrpSp->Parameters.SetFile.ReplaceIfExists;
+ pRenameInfo = (PFILE_RENAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
+
pSrcFcb = (AFSFcb *)pSrcFileObj->FsContext;
pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
pSrcObject = pSrcFcb->ObjectInformation;
+ if ( BooleanFlagOn( pSrcObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pSrcParentObject = AFSFindObjectInfo( pSrcObject->VolumeCB,
+ &pSrcObject->ParentFileId,
+ TRUE);
+ }
+
+ if( pSrcParentObject == NULL)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetRenameInfo Unable to resolve SrcParentObject (INVALID_PARAMETER)\n"));
+
+ ASSERT( FALSE);
+
+ try_return( ntStatus = STATUS_INVALID_PARAMETER);
+ }
+
//
// Perform some basic checks to ensure FS integrity
//
// Can't rename the root directory
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSSetRenameInfo Attempt to rename root entry\n");
+ "AFSSetRenameInfo Attempt to rename root entry\n"));
try_return( ntStatus = STATUS_INVALID_PARAMETER);
}
// If there are any open children then fail the rename
//
- if( pSrcFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount > 0)
+ if( pSrcObject->Specific.Directory.ChildOpenHandleCount > 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSSetRenameInfo Attempt to rename directory with open children %wZ\n",
- &pSrcCcb->DirectoryCB->NameInformation.FileName);
+ &pSrcCcb->DirectoryCB->NameInformation.FileName));
try_return( ntStatus = STATUS_ACCESS_DENIED);
}
}
- else
+
+
+ //
+ // Extract off the final component name from the Fcb
+ //
+
+ uniSourceName.Length = (USHORT)pSrcCcb->DirectoryCB->NameInformation.FileName.Length;
+ uniSourceName.MaximumLength = uniSourceName.Length;
+
+ uniSourceName.Buffer = pSrcCcb->DirectoryCB->NameInformation.FileName.Buffer;
+
+ //
+ // Resolve the target fileobject
+ //
+
+ if( pTargetFileObj == NULL)
{
- if( pSrcFcb->OpenHandleCount > 1)
+ if ( pRenameInfo->RootDirectory)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetRenameInfo Handle provided but no FileObject ntStatus INVALID_PARAMETER\n"));
+
+ try_return( ntStatus = STATUS_INVALID_PARAMETER);
+ }
+ else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSSetRenameInfo Attempt to rename directory with open references %wZ\n",
- &pSrcCcb->DirectoryCB->NameInformation.FileName);
+ uniFullTargetName.Length = (USHORT)pRenameInfo->FileNameLength;
- try_return( ntStatus = STATUS_ACCESS_DENIED);
- }
- }
+ uniFullTargetName.Buffer = (PWSTR)&pRenameInfo->FileName;
- //
- // Resolve the target fileobject
- //
+ AFSRetrieveFinalComponent( &uniFullTargetName,
+ &uniTargetName);
- if( pTargetFileObj == NULL)
- {
+ AFSRetrieveParentPath( &uniFullTargetName,
+ &uniTargetParentName);
- //
- // This is a simple rename. Here the target directory is the same as the source parent directory
- // and the name is retrieved from the system buffer information
- //
+ if ( uniTargetParentName.Length == 0)
+ {
- pRenameInfo = (PFILE_RENAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
+ //
+ // This is a simple rename. Here the target directory is the same as the source parent directory
+ // and the name is retrieved from the system buffer information
+ //
- pTargetParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
+ pTargetParentObject = pSrcParentObject;
+ }
+ else
+ {
+ //
+ // uniTargetParentName contains the directory the renamed object
+ // will be moved to. Must obtain the TargetParentObject.
+ //
- pTargetDcb = pTargetParentObject->Fcb;
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetRenameInfo Attempt to move %wZ to %wZ -- not yet supported (NOT_SAME_DEVICE)\n",
+ &pSrcCcb->DirectoryCB->NameInformation.FileName,
+ &uniFullTargetName));
+
+ try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
+ }
+ }
- uniTargetName.Length = (USHORT)pRenameInfo->FileNameLength;
- uniTargetName.Buffer = (PWSTR)&pRenameInfo->FileName;
+ pTargetDcb = pTargetParentObject->Fcb;
}
else
{
}
//
+ // The quick check to see if they are not really performing a rename
+ // Do the names match? Only do this where the parent directories are
+ // the same
+ //
+
+ if( pTargetParentObject == pSrcParentObject)
+ {
+
+ if( FsRtlAreNamesEqual( &uniTargetName,
+ &uniSourceName,
+ FALSE,
+ NULL))
+ {
+ try_return( ntStatus = STATUS_SUCCESS);
+ }
+
+ bCommonParent = TRUE;
+ }
+ else
+ {
+
+ bCommonParent = FALSE;
+ }
+
+ //
// We do not allow cross-volume renames to occur
//
if( pTargetParentObject->VolumeCB != pSrcObject->VolumeCB)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSSetRenameInfo Attempt to rename directory to different volume %wZ\n",
- &pSrcCcb->DirectoryCB->NameInformation.FileName);
+ &pSrcCcb->DirectoryCB->NameInformation.FileName));
try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
}
bReleaseTargetDirLock = TRUE;
- if( pTargetParentObject != pSrcFcb->ObjectInformation->ParentObjectInformation)
+ if( pTargetParentObject != pSrcParentObject)
{
- AFSAcquireExcl( pSrcFcb->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ AFSAcquireExcl( pSrcParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
bReleaseSourceDirLock = TRUE;
- pSourceDirLock = pSrcFcb->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock;
+ pSourceDirLock = pSrcParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock;
}
AFSLocateCaseSensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
&pTargetDirEntry);
}
- if( pTargetDirEntry == NULL && RtlIsNameLegalDOS8Dot3( &uniTargetName,
+ if ( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+ pTargetDirEntry == NULL && RtlIsNameLegalDOS8Dot3( &uniTargetName,
NULL,
NULL))
{
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);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetRenameInfo Increment count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pTargetDirEntry->NameInformation.FileName,
+ pTargetDirEntry,
+ pSrcCcb,
+ lCount));
- InterlockedIncrement( &pTargetDirEntry->OpenReferenceCount);
+ ASSERT( lCount >= 0);
if( !bReplaceIfExists)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSSetRenameInfo Attempt to rename directory with target collision %wZ Target %wZ\n",
&pSrcCcb->DirectoryCB->NameInformation.FileName,
- &pTargetDirEntry->NameInformation.FileName);
+ &pTargetDirEntry->NameInformation.FileName));
try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( 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->OpenReferenceCount);
+ lCount));
//
// Pull the directory entry from the parent
}
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( 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
- //
-
- uniSourceName.Length = (USHORT)pSrcCcb->DirectoryCB->NameInformation.FileName.Length;
- uniSourceName.MaximumLength = uniSourceName.Length;
-
- uniSourceName.Buffer = pSrcCcb->DirectoryCB->NameInformation.FileName.Buffer;
-
- //
- // The quick check to see if they are not really performing a rename
- // Do the names match? Only do this where the parent directories are
- // the same
- //
-
- if( pTargetParentObject == pSrcFcb->ObjectInformation->ParentObjectInformation)
- {
-
- bCommonParent = TRUE;
-
- if( FsRtlAreNamesEqual( &uniTargetName,
- &uniSourceName,
- FALSE,
- NULL))
- {
- try_return( ntStatus = STATUS_SUCCESS);
- }
- }
- else
- {
-
- bCommonParent = FALSE;
+ "AFSSetRenameInfo Target does NOT exist, normal rename\n"));
}
//
// same parent we do not pull the node from the enumeration list
//
- AFSRemoveDirNodeFromParent( pSrcFcb->ObjectInformation->ParentObjectInformation,
+ AFSRemoveDirNodeFromParent( pSrcParentObject,
pSrcCcb->DirectoryCB,
!bCommonParent);
// request to the service.
//
- ntStatus = AFSNotifyRename( pSrcFcb->ObjectInformation,
+ ntStatus = AFSNotifyRename( pSrcObject,
&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);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSSetRenameInfo Failed rename of %wZ to target %wZ Status %08lX\n",
&pSrcCcb->DirectoryCB->NameInformation.FileName,
&uniTargetName,
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
// Set the notification up for the source file
//
- if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation == pTargetParentObject &&
+ if( pSrcParentObject == pTargetParentObject &&
!bTargetEntryExists)
{
ulNotificationAction = FILE_ACTION_REMOVED;
}
- if( pSrcCcb->DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
+ if( pSrcObject->FileType == AFS_FILE_TYPE_DIRECTORY)
{
ulNotifyFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
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);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSSetRenameInfo Failed update of dir entry %wZ to target %wZ Status %08lX\n",
&pSrcCcb->DirectoryCB->NameInformation.FileName,
&uniTargetName,
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
&stNewFid))
{
+ AFSAcquireExcl( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
//
// Remove the old information entry
//
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( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+ pSrcCcb->DirectoryCB->NameInformation.ShortNameLength > 0 &&
!RtlIsNameLegalDOS8Dot3( &pSrcCcb->DirectoryCB->NameInformation.FileName,
NULL,
NULL))
pSrcCcb->DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
TRUE);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSSetRenameInfo Initialized short name hash for %wZ longname %wZ\n",
&uniShortName,
- &pSrcCcb->DirectoryCB->NameInformation.FileName);
+ &pSrcCcb->DirectoryCB->NameInformation.FileName));
}
else
{
// Update the parent pointer in the source object if they are different
//
- if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation != pTargetParentObject)
+ if( pSrcParentObject != pTargetParentObject)
{
- InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedDecrement( &pSrcParentObject->Specific.Directory.ChildOpenHandleCount);
+
+ lCount = InterlockedDecrement( &pSrcParentObject->Specific.Directory.ChildOpenReferenceCount);
+
+ lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenHandleCount);
+
+ lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenReferenceCount);
+
+
+ //
+ // Guaranteed to be in the same volume
+ //
+
+ AFSAcquireExcl( pSrcParentObject->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
+ lCount = AFSObjectInfoIncrement( pTargetParentObject,
+ AFS_OBJECT_REFERENCE_CHILD);
- InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ AFSDbgTrace(( 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);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetRenameInfo Decrement count on parent object %p Cnt %d\n",
+ pSrcParentObject,
+ lCount));
- InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenHandleCount);
+ pSrcObject->ParentFileId = pTargetParentObject->FileId;
- InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenReferenceCount);
+ SetFlag( pSrcObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
- pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation = pTargetParentObject;
+ AFSReleaseResource( pSrcParentObject->VolumeCB->ObjectInfoTree.TreeLock);
ulNotificationAction = FILE_ACTION_ADDED;
}
// Now update the notification for the target file
//
- AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
+ AFSFsRtlNotifyFullReportChange( pTargetParentObject,
pSrcCcb,
(ULONG)ulNotifyFilter,
(ULONG)ulNotificationAction);
if( bTargetEntryExists)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSSetRenameInfo Setting DELETE flag in dir entry %p name %wZ\n",
pTargetDirEntry,
- &pTargetDirEntry->NameInformation.FileName);
+ &pTargetDirEntry->NameInformation.FileName));
SetFlag( pTargetDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
if( pTargetDirEntry->ObjectInformation->FileType == AFS_FILE_TYPE_FILE &&
pTargetDirEntry->ObjectInformation->Fcb != NULL &&
- pTargetDirEntry->OpenReferenceCount > 1)
+ pTargetDirEntry->DirOpenReferenceCount > 1)
{
pTargetFcb = pTargetDirEntry->ObjectInformation->Fcb;
+ }
- AFSAcquireExcl( &pTargetFcb->NPFcb->Resource,
- TRUE);
+ ASSERT( pTargetDirEntry->DirOpenReferenceCount > 0);
+
+ lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount); // The count we added above
+
+ AFSDbgTrace(( 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)
+ {
+
+ AFSDbgTrace(( 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)
+ {
//
- // Close the section in the event it was mapped
+ // Do not hold TreeLocks across the MmForceSectionClosed() call as
+ // it can deadlock with Trend Micro's TmPreFlt!TmpQueryFullName
//
- if( !MmForceSectionClosed( &pTargetFcb->NPFcb->SectionObjectPointers,
- TRUE))
+ if( bReleaseTargetDirLock)
{
+ AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSSetRenameInfo Failed to delete section for target file %wZ\n",
- &pTargetDirEntry->NameInformation.FileName);
+ bReleaseTargetDirLock = FALSE;
}
- AFSReleaseResource( &pTargetFcb->NPFcb->Resource);
- }
+ if( bReleaseSourceDirLock)
+ {
- ASSERT( pTargetDirEntry->OpenReferenceCount > 0);
+ AFSReleaseResource( pSourceDirLock);
- InterlockedDecrement( &pTargetDirEntry->OpenReferenceCount); // The count we added above
+ bReleaseSourceDirLock = FALSE;
+ }
- if( pTargetDirEntry->OpenReferenceCount == 0)
- {
+ //
+ // 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_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetRenameInfo Deleting dir entry %p name %wZ\n",
- pTargetDirEntry,
- &pTargetDirEntry->NameInformation.FileName);
+ "AFSSetRenameInfo Acquiring Fcb lock %p EXCL %08lX\n",
+ &pTargetFcb->NPFcb->Resource,
+ PsGetCurrentThread()));
- AFSDeleteDirEntry( pTargetParentObject,
- pTargetDirEntry);
- }
+ AFSAcquireExcl( &pTargetFcb->NPFcb->Resource,
+ TRUE);
- pTargetDirEntry = NULL;
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetRenameInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pTargetFcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pTargetFcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ __try
+ {
+
+ //
+ // Close the section in the event it was mapped
+ //
+
+ if( !MmForceSectionClosed( &pTargetFcb->NPFcb->SectionObjectPointers,
+ TRUE))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSSetRenameInfo Failed to delete section for target file %wZ\n",
+ &uniTargetName));
+ }
+ }
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ {
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSSetRenameInfo MmForceSectionClosed failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ pTargetFcb->ObjectInformation->FileId.Cell,
+ pTargetFcb->ObjectInformation->FileId.Volume,
+ pTargetFcb->ObjectInformation->FileId.Vnode,
+ pTargetFcb->ObjectInformation->FileId.Unique,
+ ntStatus));
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetRenameInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pTargetFcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &pTargetFcb->NPFcb->SectionObjectResource);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetRenameInfo Releasing Fcb lock %p EXCL %08lX\n",
+ &pTargetFcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &pTargetFcb->NPFcb->Resource);
+ }
}
try_exit:
-
if( !NT_SUCCESS( ntStatus))
{
if( bTargetEntryExists)
{
- AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
+
+ ASSERT( pTargetParentObject != NULL);
+
+ AFSInsertDirectoryNode( pTargetParentObject,
pTargetDirEntry,
FALSE);
}
if( pTargetDirEntry != NULL)
{
- InterlockedDecrement( &pTargetDirEntry->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetRenameInfo Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pTargetDirEntry->NameInformation.FileName,
+ pTargetDirEntry,
+ pSrcCcb,
+ lCount));
+
+ ASSERT( lCount >= 0);
}
if( bReleaseTargetDirLock)
{
+
AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
if( bReleaseSourceDirLock)
{
+
AFSReleaseResource( pSourceDirLock);
}
+
+ if ( bDereferenceTargetParentObject)
+ {
+
+ 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;
BOOLEAN bTellCc = FALSE;
BOOLEAN bTellService = FALSE;
+ BOOLEAN bUserMapped = FALSE;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
PFILE_OBJECT pFileObject = pIrpSp->FileObject;
AFSFcb *pFcb = NULL;
if( pFcb->Header.AllocationSize.QuadPart > pBuffer->AllocationSize.QuadPart)
{
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetAllocationInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pFcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ __try
+ {
+
+ bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
+ &pBuffer->AllocationSize);
+ }
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ {
+
+ bUserMapped = FALSE;
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSSetAllocationInfo MmCanFileBeTruncated failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ pFcb->ObjectInformation->FileId.Cell,
+ pFcb->ObjectInformation->FileId.Volume,
+ pFcb->ObjectInformation->FileId.Vnode,
+ pFcb->ObjectInformation->FileId.Unique,
+ ntStatus));
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetAllocationInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pFcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
+
//
// Truncating the file
//
- if( !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
- &pBuffer->AllocationSize))
+ if ( bUserMapped)
{
ntStatus = STATUS_USER_MAPPED_FILE ;
}
else
{
+
//
// If this is a truncation we need to grab the paging IO resource.
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+
+ AFSDbgTrace(( 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());
+ PsGetCurrentThread()));
AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
TRUE);
bReleasePaging = TRUE;
+ //
+ // Must drop the Fcb Resource. When changing the file size
+ // a deadlock can occur with Trend Micro's filter if the file
+ // size is set to zero.
+ //
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
pFcb->Header.AllocationSize = pBuffer->AllocationSize;
//
// Tell Cc if allocation is increased.
//
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
+ &pFcb->NPFcb->PagingResource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
+ TRUE);
+
+ bReleasePaging = TRUE;
+
+ //
+ // Must drop the Fcb Resource. When changing the file size
+ // a deadlock can occur with Trend Micro's filter if the file
+ // size is set to zero.
+ //
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
bTellCc = pBuffer->AllocationSize.QuadPart > pFcb->Header.AllocationSize.QuadPart;
pFcb->Header.AllocationSize = pBuffer->AllocationSize;
//
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);
}
CcSetFileSizes( pFileObject,
(PCC_FILE_SIZES)&pFcb->Header.AllocationSize);
}
+
+ //
+ // Mark the file as modified so as to reflect the change into the last write on close.
+ //
+ SetFlag( pFileObject->Flags, FO_FILE_MODIFIED);
}
else
{
{
AFSReleaseResource( &pFcb->NPFcb->PagingResource);
+
+ AFSAcquireExcl( &pFcb->NPFcb->Resource,
+ TRUE);
}
return ntStatus;
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);
BOOLEAN bModified = FALSE;
BOOLEAN bReleasePaging = FALSE;
BOOLEAN bTruncated = FALSE;
+ BOOLEAN bUserMapped = FALSE;
AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
if( pBuffer->EndOfFile.QuadPart < pFcb->Header.FileSize.QuadPart)
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetEndOfFileInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pFcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ __try
+ {
+
+ bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
+ &pBuffer->EndOfFile);
+ }
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ {
+
+ bUserMapped = FALSE;
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSSetEndOfFileInfo MmCanFileBeTruncated failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ pFcb->ObjectInformation->FileId.Cell,
+ pFcb->ObjectInformation->FileId.Volume,
+ pFcb->ObjectInformation->FileId.Vnode,
+ pFcb->ObjectInformation->FileId.Unique,
+ ntStatus));
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetEndOfFileInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pFcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
+
// Truncating the file
- if( !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
- &pBuffer->EndOfFile))
+ if ( bUserMapped)
{
ntStatus = STATUS_USER_MAPPED_FILE;
}
else
{
+
//
// If this is a truncation we need to grab the paging
// IO resource.
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
+ "AFSSetEndOfFileInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
&pFcb->NPFcb->PagingResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
TRUE);
bReleasePaging = TRUE;
+ //
+ // Must drop the Fcb Resource. When changing the file size
+ // a deadlock can occur with Trend Micro's filter if the file
+ // size is set to zero.
+ //
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
pFcb->Header.AllocationSize = pBuffer->EndOfFile;
pFcb->Header.FileSize = pBuffer->EndOfFile;
}
else
{
+
//
// extending the file, move EOF
//
+ //
+ // If this is a truncation we need to grab the paging
+ // IO resource.
+ //
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetEndOfFileInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
+ &pFcb->NPFcb->PagingResource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
+ TRUE);
+
+ bReleasePaging = TRUE;
+
+ //
+ // Must drop the Fcb Resource. When changing the file size
+ // a deadlock can occur with Trend Micro's filter if the file
+ // size is set to zero.
+ //
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
pFcb->Header.FileSize = pBuffer->EndOfFile;
pFcb->ObjectInformation->EndOfFile = pBuffer->EndOfFile;
// 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);
AFSTrimExtents( pFcb,
&pFcb->Header.FileSize);
}
+
+ //
+ // Mark the file as modified so as to reflect the change into the last write on close.
+ //
+ SetFlag( pFileObject->Flags, FO_FILE_MODIFIED);
}
else
{
{
AFSReleaseResource( &pFcb->NPFcb->PagingResource);
+
+ AFSAcquireExcl( &pFcb->NPFcb->Resource,
+ TRUE);
}
return ntStatus;
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;
{
ulFileInformationClass = pIrpSp->Parameters.SetFile.FileInformationClass;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessShareSetInfo On pipe %wZ Class %08lX\n",
&Ccb->DirectoryCB->NameInformation.FileName,
- ulFileInformationClass);
+ ulFileInformationClass));
pPipeInfo = AFSLockSystemBuffer( Irp,
pIrpSp->Parameters.SetFile.Length);
if( pPipeInfo == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSProcessShareSetInfo Failed to lock buffer on pipe %wZ\n",
- &Ccb->DirectoryCB->NameInformation.FileName);
+ &Ccb->DirectoryCB->NameInformation.FileName));
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSProcessShareSetInfo Failed to send request to service on pipe %wZ Status %08lX\n",
&Ccb->DirectoryCB->NameInformation.FileName,
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessShareSetInfo Completed request on pipe %wZ Class %08lX\n",
&Ccb->DirectoryCB->NameInformation.FileName,
- ulFileInformationClass);
+ ulFileInformationClass));
try_exit:
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;
ulFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessShareQueryInfo On pipe %wZ Class %08lX\n",
&Ccb->DirectoryCB->NameInformation.FileName,
- ulFileInformationClass);
+ ulFileInformationClass));
pPipeInfo = AFSLockSystemBuffer( Irp,
pIrpSp->Parameters.QueryFile.Length);
if( pPipeInfo == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSProcessShareQueryInfo Failed to lock buffer on pipe %wZ\n",
- &Ccb->DirectoryCB->NameInformation.FileName);
+ &Ccb->DirectoryCB->NameInformation.FileName));
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSProcessShareQueryInfo Failed to send request to service on pipe %wZ Status %08lX\n",
&Ccb->DirectoryCB->NameInformation.FileName,
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessShareQueryInfo Completed request on pipe %wZ Class %08lX\n",
&Ccb->DirectoryCB->NameInformation.FileName,
- ulFileInformationClass);
+ ulFileInformationClass));
try_exit:
IN OUT LONG *Length)
{
+ UNREFERENCED_PARAMETER(Fcb);
+ UNREFERENCED_PARAMETER(Ccb);
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
FILE_INFORMATION_CLASS ulFileInformationClass;
case FileBasicInformation:
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessPIOCtlQueryInfo (FileBasicInformation)\n");
+ "AFSProcessPIOCtlQueryInfo (FileBasicInformation)\n"));
if ( *Length >= sizeof( FILE_BASIC_INFORMATION))
{
pBasic->LastAccessTime.QuadPart = 0;
pBasic->ChangeTime.QuadPart = 0;
pBasic->LastWriteTime.QuadPart = 0;
- pBasic->FileAttributes = FILE_ATTRIBUTE_SYSTEM;
+ pBasic->FileAttributes = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
*Length -= sizeof( FILE_BASIC_INFORMATION);
}
case FileStandardInformation:
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessPIOCtlQueryInfo (FileStandardInformation)\n");
+ "AFSProcessPIOCtlQueryInfo (FileStandardInformation)\n"));
if ( *Length >= sizeof( FILE_STANDARD_INFORMATION))
{
break;
}
+ case FileNormalizedNameInformation:
case FileNameInformation:
{
PFILE_NAME_INFORMATION pNameInfo = (PFILE_NAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
UNICODE_STRING uniName;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessPIOCtlQueryInfo (FileNameInformation)\n");
+ "AFSProcessPIOCtlQueryInfo (FileNameInformation)\n"));
pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
uniName.Buffer = pNameInfo->FileName;
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessPIOCtlQueryInfo (FileNameInformation) Returning %wZ\n",
- &uniName);
+ &uniName));
}
}
PFILE_INTERNAL_INFORMATION pInternalInfo = (PFILE_INTERNAL_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessPIOCtlQueryInfo (FileInternalInformation)\n");
+ "AFSProcessPIOCtlQueryInfo (FileInternalInformation)\n"));
if( *Length >= sizeof( FILE_INTERNAL_INFORMATION))
{
{
ntStatus = STATUS_INVALID_PARAMETER;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSProcessPIOCtlQueryInfo (FileAllInformation) Not Implemented\n");
+ "AFSProcessPIOCtlQueryInfo (FileAllInformation) Not Implemented\n"));
break;
}
{
ntStatus = STATUS_INVALID_PARAMETER;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSProcessPIOCtlQueryInfo (FileEaInformation) Not Implemented\n");
+ "AFSProcessPIOCtlQueryInfo (FileEaInformation) Not Implemented\n"));
break;
}
{
ntStatus = STATUS_INVALID_PARAMETER;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSProcessPIOCtlQueryInfo (FilePositionInformation) Not Implemented\n");
+ "AFSProcessPIOCtlQueryInfo (FilePositionInformation) Not Implemented\n"));
break;
}
{
ntStatus = STATUS_INVALID_PARAMETER;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSProcessPIOCtlQueryInfo (FileAlternateNameInformation) Not Implemented\n");
+ "AFSProcessPIOCtlQueryInfo (FileAlternateNameInformation) Not Implemented\n"));
break;
}
{
ntStatus = STATUS_INVALID_PARAMETER;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSProcessPIOCtlQueryInfo (FileNetworkOpenInformation) Not Implemented\n");
+ "AFSProcessPIOCtlQueryInfo (FileNetworkOpenInformation) Not Implemented\n"));
break;
}
{
ntStatus = STATUS_INVALID_PARAMETER;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSProcessPIOCtlQueryInfo (FileStreamInformation) Not Implemented\n");
+ "AFSProcessPIOCtlQueryInfo (FileStreamInformation) Not Implemented\n"));
break;
}
{
ntStatus = STATUS_INVALID_PARAMETER;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSProcessPIOCtlQueryInfo (FileAttributeTagInformation) Not Implemented\n");
+ "AFSProcessPIOCtlQueryInfo (FileAttributeTagInformation) Not Implemented\n"));
break;
}
{
ntStatus = STATUS_INVALID_PARAMETER;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSProcessPIOCtlQueryInfo (FileRemoteProtocolInformation) Not Implemented\n");
+ "AFSProcessPIOCtlQueryInfo (FileRemoteProtocolInformation) Not Implemented\n"));
break;
}
{
ntStatus = STATUS_INVALID_PARAMETER;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSProcessPIOCtlQueryInfo (FileNetworkPhysicalNameInformation) Not Implemented\n");
+ "AFSProcessPIOCtlQueryInfo (FileNetworkPhysicalNameInformation) Not Implemented\n"));
break;
}
{
ntStatus = STATUS_INVALID_PARAMETER;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
"AFSProcessPIOCtlQueryInfo Not handling request %08lX\n",
- ulFileInformationClass);
+ ulFileInformationClass));
break;
}
}
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessPIOCtlQueryInfo ntStatus %08lX\n",
- ntStatus);
+ ntStatus));
return ntStatus;
}