try_return( ntStatus);
}
+ else if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB)
+ {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSQueryFileInfo request against Invalid Fcb\n");
+
+ try_return( ntStatus = STATUS_ACCESS_DENIED);
+ }
+
//
// Process the request
//
break;
}
- default:
+ case FileNetworkPhysicalNameInformation:
+ {
- ntStatus = STATUS_INVALID_PARAMETER;
+ ntStatus = AFSQueryPhysicalNameInfo( Irp,
+ pCcb->DirectoryCB,
+ (FILE_NETWORK_PHYSICAL_NAME_INFORMATION *)pBuffer,
+ &lLength);
+
+ break;
+ }
+ default:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
break;
+ }
}
try_exit:
"AFSSetFileInfo Request failed due to read only volume\n",
Irp);
+ try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
+ }
+
+ if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB &&
+ FileInformationClass != FileDispositionInformation)
+ {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetFileInfo request against Invalid Fcb\n");
+
try_return( ntStatus = STATUS_ACCESS_DENIED);
}
ntStatus = AFSUpdateFileInformation( &stParentFileId,
pFcb->ObjectInformation,
- &pFcb->AuthGroup);
+ &pCcb->AuthGroup);
if( !NT_SUCCESS( ntStatus))
{
"EXCEPTION - AFSSetFileInfo\n");
ntStatus = STATUS_UNSUCCESSFUL;
+
+ if( bReleaseMain)
+ {
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+ }
}
AFSCompleteRequest( Irp,
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
- NULL,
+ pCcb->NameArray,
+ &pCcb->AuthGroup,
&stFileInfo)))
{
ulFileAttribs = stFileInfo.FileAttributes;
TRUE);
}
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSQueryBasicInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
+ &pCcb->DirectoryCB->NameInformation.FileName,
+ pCcb->DirectoryCB->ObjectInformation->FileType,
+ pCcb->DirectoryCB->ObjectInformation->FileAttributes,
+ ulFileAttribs);
+
Buffer->CreationTime = DirectoryCB->ObjectInformation->CreationTime;
Buffer->LastAccessTime = DirectoryCB->ObjectInformation->LastAccessTime;
Buffer->LastWriteTime = DirectoryCB->ObjectInformation->LastWriteTime;
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
- NULL,
+ pCcb->NameArray,
+ &pCcb->AuthGroup,
&stFileInfo)))
{
ulFileAttribs = stFileInfo.FileAttributes;
TRUE);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSQueryStandardInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
+ &pCcb->DirectoryCB->NameInformation.FileName,
+ pCcb->DirectoryCB->ObjectInformation->FileType,
+ pCcb->DirectoryCB->ObjectInformation->FileAttributes,
+ ulFileAttribs);
+
Buffer->Directory = BooleanFlagOn( ulFileAttribs, FILE_ATTRIBUTE_DIRECTORY);
*Length -= sizeof( FILE_STANDARD_INFORMATION);
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
- NULL,
+ pCcb->NameArray,
+ &pCcb->AuthGroup,
&stFileInfo)))
{
ulFileAttribs = stFileInfo.FileAttributes;
TRUE);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSQueryNetworkInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
+ &pCcb->DirectoryCB->NameInformation.FileName,
+ pCcb->DirectoryCB->ObjectInformation->FileType,
+ pCcb->DirectoryCB->ObjectInformation->FileAttributes,
+ ulFileAttribs);
+
Buffer->CreationTime.QuadPart = DirectoryCB->ObjectInformation->CreationTime.QuadPart;
Buffer->LastAccessTime.QuadPart = DirectoryCB->ObjectInformation->LastAccessTime.QuadPart;
Buffer->LastWriteTime.QuadPart = DirectoryCB->ObjectInformation->LastWriteTime.QuadPart;
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
- NULL,
+ pCcb->NameArray,
+ &pCcb->AuthGroup,
&stFileInfo)))
{
ulFileAttribs = stFileInfo.FileAttributes;
TRUE);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSAttribTagInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
+ &pCcb->DirectoryCB->NameInformation.FileName,
+ pCcb->DirectoryCB->ObjectInformation->FileType,
+ pCcb->DirectoryCB->ObjectInformation->FileAttributes,
+ ulFileAttribs);
+
Buffer->FileAttributes = ulFileAttribs;
if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
{
- Buffer->ReparseTag = IO_REPARSE_TAG_OPENAFS_DFS;
+ Buffer->ReparseTag = IO_REPARSE_TAG_SURROGATE|IO_REPARSE_TAG_OPENAFS_DFS;
}
*Length -= sizeof( FILE_ATTRIBUTE_TAG_INFORMATION);
}
NTSTATUS
+AFSQueryPhysicalNameInfo( IN PIRP Irp,
+ IN AFSDirectoryCB *DirectoryCB,
+ IN OUT PFILE_NETWORK_PHYSICAL_NAME_INFORMATION Buffer,
+ IN OUT PLONG Length)
+{
+
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ ULONG ulCopyLength = 0;
+ ULONG cchCopied = 0;
+ AFSFcb *pFcb = NULL;
+ AFSCcb *pCcb = NULL;
+ IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
+ BOOLEAN bAddLeadingSlash = FALSE;
+ USHORT usFullNameLength = 0;
+
+ pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
+
+ pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+
+ if( *Length >= FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName))
+ {
+
+ RtlZeroMemory( Buffer,
+ *Length);
+
+ if( pCcb->FullFileName.Length == 0 ||
+ pCcb->FullFileName.Buffer[ 0] != L'\\')
+ {
+ bAddLeadingSlash = TRUE;
+ }
+
+ usFullNameLength = pCcb->FullFileName.Length;
+
+ if( bAddLeadingSlash)
+ {
+ usFullNameLength += sizeof( WCHAR);
+ }
+
+ if( *Length >= (LONG)(FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
+ {
+ ulCopyLength = (LONG)usFullNameLength;
+ }
+ else
+ {
+
+ ulCopyLength = *Length - FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName);
+
+ ntStatus = STATUS_BUFFER_OVERFLOW;
+ }
+
+ Buffer->FileNameLength = (ULONG)usFullNameLength;
+
+ *Length -= FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName);
+
+ if( ulCopyLength > 0)
+ {
+
+ if( bAddLeadingSlash)
+ {
+
+ Buffer->FileName[ cchCopied] = L'\\';
+
+ ulCopyLength -= sizeof( WCHAR);
+ *Length -= sizeof( WCHAR);
+ cchCopied++;
+ }
+
+ if( ulCopyLength >= pCcb->FullFileName.Length)
+ {
+
+ RtlCopyMemory( &Buffer->FileName[ cchCopied],
+ pCcb->FullFileName.Buffer,
+ pCcb->FullFileName.Length);
+
+ ulCopyLength -= pCcb->FullFileName.Length;
+ *Length -= pCcb->FullFileName.Length;
+ cchCopied += pCcb->FullFileName.Length/sizeof( WCHAR);
+ }
+ else
+ {
+
+ RtlCopyMemory( &Buffer->FileName[ cchCopied],
+ pCcb->FullFileName.Buffer,
+ ulCopyLength);
+
+ *Length -= ulCopyLength;
+ }
+ }
+ }
+ else
+ {
+
+ ntStatus = STATUS_BUFFER_TOO_SMALL;
+ }
+
+ return ntStatus;
+}
+
+NTSTATUS
AFSSetBasicInfo( IN PIRP Irp,
IN AFSDirectoryCB *DirectoryCB)
{
//
ntStatus = AFSNotifyDelete( DirectoryCB,
+ &pCcb->AuthGroup,
TRUE);
if( !NT_SUCCESS( ntStatus))
try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
}
+
+ 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
+ else if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
{
//
}
//
+ // 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
//
if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
{
- CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- TRUE);
+ if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ TRUE))
+ {
+
+ SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ }
}
}
-
- 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
{
ULONG ulNotificationAction = 0, ulNotifyFilter = 0;
UNICODE_STRING uniFullTargetPath;
BOOLEAN bCommonParent = FALSE;
- ULONG oldFileIndex;
- BOOLEAN bReleaseVolumeLock = FALSE;
BOOLEAN bReleaseTargetDirLock = FALSE;
BOOLEAN bReleaseSourceDirLock = FALSE;
PERESOURCE pSourceDirLock = NULL;
+ LONG lCount;
__Enter
{
pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
pSrcObject = pSrcFcb->ObjectInformation;
+ pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
//
// Perform some basic checks to ensure FS integrity
try_return( ntStatus = STATUS_ACCESS_DENIED);
}
}
- else
- {
- if( pSrcFcb->OpenHandleCount > 1)
- {
+ //
+ // Extract off the final component name from the Fcb
+ //
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSSetRenameInfo Attempt to rename directory with open references %wZ\n",
- &pSrcCcb->DirectoryCB->NameInformation.FileName);
+ uniSourceName.Length = (USHORT)pSrcCcb->DirectoryCB->NameInformation.FileName.Length;
+ uniSourceName.MaximumLength = uniSourceName.Length;
- try_return( ntStatus = STATUS_ACCESS_DENIED);
- }
- }
+ uniSourceName.Buffer = pSrcCcb->DirectoryCB->NameInformation.FileName.Buffer;
//
// Resolve the target fileobject
pRenameInfo = (PFILE_RENAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
- pTargetParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
+ pTargetParentObject = pSrcParentObject;
pTargetDcb = pTargetParentObject->Fcb;
}
//
+ // 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
//
try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
}
- AFSAcquireExcl( pTargetParentObject->VolumeCB->VolumeLock,
- TRUE);
-
- bReleaseVolumeLock = TRUE;
-
ulTargetCRC = AFSGenerateCRC( &uniTargetName,
FALSE);
bReleaseTargetDirLock = TRUE;
- if( pTargetParentObject != pSrcFcb->ObjectInformation->ParentObjectInformation)
+ if( pTargetParentObject != pSrcParentObject)
{
AFSAcquireExcl( pSrcFcb->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
ASSERT( pTargetParentObject == pTargetDirEntry->ObjectInformation->ParentObjectInformation);
- InterlockedIncrement( &pTargetDirEntry->OpenReferenceCount);
+ lCount = InterlockedIncrement( &pTargetDirEntry->OpenReferenceCount);
if( !bReplaceIfExists)
{
else
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSSetRenameInfo Target 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;
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetRenameInfo Target does NOT exist, normal rename\n");
}
//
pSrcCcb->DirectoryCB,
!bCommonParent);
- oldFileIndex = pSrcCcb->DirectoryCB->FileIndex;
-
- if( !bCommonParent)
- {
-
- //
- // We always need to update the FileIndex since this entry will be put at the 'end'
- // of the enumeraiton list. If we don't it will cause recursion ... We do this
- // here to cover any failures which might occur below
- //
-
- pSrcCcb->DirectoryCB->FileIndex =
- (ULONG)InterlockedIncrement( &pTargetDcb->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.ContentIndex);
- }
-
//
// OK, this is a simple rename. Issue the rename
// request to the service.
//
ntStatus = AFSNotifyRename( pSrcFcb->ObjectInformation,
+ &pSrcCcb->AuthGroup,
pSrcFcb->ObjectInformation->ParentObjectInformation,
pTargetDcb->ObjectInformation,
pSrcCcb->DirectoryCB,
// Attempt to re-insert the directory entry
//
- pSrcCcb->DirectoryCB->FileIndex = oldFileIndex;
AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
pSrcCcb->DirectoryCB,
!bCommonParent);
// Attempt to re-insert the directory entry
//
- pSrcCcb->DirectoryCB->FileIndex = oldFileIndex;
AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
pSrcCcb->DirectoryCB,
!bCommonParent);
&stNewFid))
{
+ AFSAcquireExcl( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
//
// Remove the old information entry
//
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);
}
//
if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation != pTargetParentObject)
{
- InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
- InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
- InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenHandleCount);
- InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenReferenceCount);
pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation = pTargetParentObject;
ASSERT( pTargetDirEntry->OpenReferenceCount > 0);
- InterlockedDecrement( &pTargetDirEntry->OpenReferenceCount); // The count we added above
+ lCount = InterlockedDecrement( &pTargetDirEntry->OpenReferenceCount); // The count we added above
- if( pTargetDirEntry->OpenReferenceCount == 0)
+ if( lCount == 0)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
if( pTargetDirEntry != NULL)
{
- InterlockedDecrement( &pTargetDirEntry->OpenReferenceCount);
- }
-
- if( bReleaseVolumeLock)
- {
- AFSReleaseResource( pTargetParentObject->VolumeCB->VolumeLock);
+ lCount = InterlockedDecrement( &pTargetDirEntry->OpenReferenceCount);
}
if( bReleaseTargetDirLock)
//
// If this is a truncation we need to grab the paging IO resource.
//
+
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
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.
//
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX 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;
{
ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
pFcb->ObjectInformation,
- &pFcb->AuthGroup);
+ &pCcb->AuthGroup);
}
if (NT_SUCCESS(ntStatus))
{
AFSReleaseResource( &pFcb->NPFcb->PagingResource);
+
+ AFSAcquireExcl( &pFcb->NPFcb->Resource,
+ TRUE);
}
return ntStatus;
}
else
{
+
//
// If this is a truncation we need to grab the paging
// IO resource.
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.
+ //
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX 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;
ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
pFcb->ObjectInformation,
- &pFcb->AuthGroup);
+ &pCcb->AuthGroup);
if( NT_SUCCESS(ntStatus))
{
{
AFSReleaseResource( &pFcb->NPFcb->PagingResource);
+
+ AFSAcquireExcl( &pFcb->NPFcb->Resource,
+ TRUE);
}
return ntStatus;
case FileBasicInformation:
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessPIOCtlQueryInfo (FileBasicInformation)\n");
+
if ( *Length >= sizeof( FILE_BASIC_INFORMATION))
{
PFILE_BASIC_INFORMATION pBasic = (PFILE_BASIC_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
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);
}
else
{
- ntStatus = STATUS_BUFFER_OVERFLOW;
+ ntStatus = STATUS_BUFFER_TOO_SMALL;
}
break;
case FileStandardInformation:
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessPIOCtlQueryInfo (FileStandardInformation)\n");
+
if ( *Length >= sizeof( FILE_STANDARD_INFORMATION))
{
PFILE_STANDARD_INFORMATION pStandard = (PFILE_STANDARD_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
pStandard->NumberOfLinks = 1;
pStandard->DeletePending = 0;
- pStandard->AllocationSize.QuadPart = 4096;
- pStandard->EndOfFile.QuadPart = 4096;
+ pStandard->AllocationSize.QuadPart = 0;
+ pStandard->EndOfFile.QuadPart = 0;
pStandard->Directory = 0;
*Length -= sizeof( FILE_STANDARD_INFORMATION);
}
else
{
- ntStatus = STATUS_BUFFER_OVERFLOW;
+ ntStatus = STATUS_BUFFER_TOO_SMALL;
}
break;
PFILE_NAME_INFORMATION pNameInfo = (PFILE_NAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
UNICODE_STRING uniName;
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessPIOCtlQueryInfo (FileNameInformation)\n");
+
pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
PFILE_INTERNAL_INFORMATION pInternalInfo = (PFILE_INTERNAL_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessPIOCtlQueryInfo (FileInternalInformation)\n");
+
if( *Length >= sizeof( FILE_INTERNAL_INFORMATION))
{
break;
}
+ case FileAllInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileAllInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FileEaInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileEaInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FilePositionInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FilePositionInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FileAlternateNameInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileAlternateNameInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FileNetworkOpenInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileNetworkOpenInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FileStreamInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileStreamInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FileAttributeTagInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileAttributeTagInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FileRemoteProtocolInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileRemoteProtocolInformation) Not Implemented\n");
+
+ break;
+ }
+
+ case FileNetworkPhysicalNameInformation:
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSProcessPIOCtlQueryInfo (FileNetworkPhysicalNameInformation) Not Implemented\n");
+
+ break;
+ }
+
default:
{
ntStatus = STATUS_INVALID_PARAMETER;
}
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessPIOCtlQueryInfo ntStatus %08lX\n",
+ ntStatus);
+
return ntStatus;
}