📄 fileinfo.c
字号:
Irp->IoStatus.Information = sizeof(FILE_ALL_INFORMATION) +
Fcb->RfsdMcb->ShortName.Length - sizeof(WCHAR);
Status = STATUS_SUCCESS;
__leave;
}
/*
case FileAlternateNameInformation:
{
// TODO: [ext2fsd] Handle FileAlternateNameInformation
// Here we would like to use RtlGenerate8dot3Name but I don't
// know how to use the argument PGENERATE_NAME_CONTEXT
}
*/
case FileNetworkOpenInformation:
{
PFILE_NETWORK_OPEN_INFORMATION FileNetworkOpenInformation;
if (Length < sizeof(FILE_NETWORK_OPEN_INFORMATION)) {
Status = STATUS_INFO_LENGTH_MISMATCH;
__leave;
}
FileNetworkOpenInformation =
(PFILE_NETWORK_OPEN_INFORMATION) Buffer;
FileNetworkOpenInformation->CreationTime = RfsdSysTime(Fcb->Inode->i_ctime);
FileNetworkOpenInformation->LastAccessTime = RfsdSysTime(Fcb->Inode->i_atime);
FileNetworkOpenInformation->LastWriteTime = RfsdSysTime(Fcb->Inode->i_mtime);
FileNetworkOpenInformation->ChangeTime = RfsdSysTime(Fcb->Inode->i_mtime);
FileNetworkOpenInformation->AllocationSize.QuadPart = AllocationSize;
FileNetworkOpenInformation->EndOfFile.QuadPart = FileSize;
FileNetworkOpenInformation->FileAttributes = Fcb->RfsdMcb->FileAttr;
Irp->IoStatus.Information =
sizeof(FILE_NETWORK_OPEN_INFORMATION);
Status = STATUS_SUCCESS;
__leave;
}
default:
Status = STATUS_INVALID_INFO_CLASS;
}
} __finally {
if (FcbResourceAcquired) {
ExReleaseResourceForThreadLite(
&Fcb->MainResource,
ExGetCurrentResourceThread());
}
if (!IrpContext->ExceptionInProgress) {
if (Status == STATUS_PENDING) {
RfsdQueueRequest(IrpContext);
} else {
RfsdCompleteIrpContext(IrpContext, Status);
}
}
}
return Status;
}
#if DISABLED
NTSTATUS
RfsdSetInformation (IN PRFSD_IRP_CONTEXT IrpContext)
{
DbgBreak();
PDEVICE_OBJECT DeviceObject;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
PRFSD_VCB Vcb;
PFILE_OBJECT FileObject;
PRFSD_FCB Fcb;
PRFSD_CCB Ccb;
PIRP Irp;
PIO_STACK_LOCATION IoStackLocation;
FILE_INFORMATION_CLASS FileInformationClass;
ULONG NotifyFilter = 0;
ULONG Length;
PVOID Buffer;
BOOLEAN FcbMainResourceAcquired = FALSE;
BOOLEAN VcbResourceAcquired = FALSE;
BOOLEAN FcbPagingIoResourceAcquired = FALSE;
__try {
ASSERT(IrpContext != NULL);
ASSERT((IrpContext->Identifier.Type == RFSDICX) &&
(IrpContext->Identifier.Size == sizeof(RFSD_IRP_CONTEXT)));
DeviceObject = IrpContext->DeviceObject;
//
// This request is not allowed on the main device object
//
if (DeviceObject == RfsdGlobal->DeviceObject) {
Status = STATUS_INVALID_DEVICE_REQUEST;
__leave;
}
Vcb = (PRFSD_VCB) DeviceObject->DeviceExtension;
ASSERT(Vcb != NULL);
ASSERT((Vcb->Identifier.Type == RFSDVCB) &&
(Vcb->Identifier.Size == sizeof(RFSD_VCB)));
ASSERT(IsMounted(Vcb));
FileObject = IrpContext->FileObject;
Fcb = (PRFSD_FCB) FileObject->FsContext;
ASSERT(Fcb != NULL);
//
// This request is not allowed on volumes
//
if (Fcb->Identifier.Type == RFSDVCB) {
DbgBreak();
Status = STATUS_INVALID_PARAMETER;
__leave;
}
ASSERT((Fcb->Identifier.Type == RFSDFCB) &&
(Fcb->Identifier.Size == sizeof(RFSD_FCB)));
if (IsFlagOn(Fcb->Flags, FCB_FILE_DELETED)) {
Status = STATUS_FILE_DELETED;
__leave;
}
Ccb = (PRFSD_CCB) FileObject->FsContext2;
ASSERT(Ccb != NULL);
ASSERT((Ccb->Identifier.Type == RFSDCCB) &&
(Ccb->Identifier.Size == sizeof(RFSD_CCB)));
Irp = IrpContext->Irp;
IoStackLocation = IoGetCurrentIrpStackLocation(Irp);
FileInformationClass =
IoStackLocation->Parameters.SetFile.FileInformationClass;
Length = IoStackLocation->Parameters.SetFile.Length;
Buffer = Irp->AssociatedIrp.SystemBuffer;
if (IsFlagOn(Vcb->Flags, VCB_READ_ONLY)) {
if (FileInformationClass == FileDispositionInformation ||
FileInformationClass == FileRenameInformation ||
FileInformationClass == FileLinkInformation) {
if (!ExAcquireResourceExclusiveLite(
&Vcb->MainResource,
IrpContext->IsSynchronous )) {
Status = STATUS_PENDING;
__leave;
}
VcbResourceAcquired = TRUE;
}
} else if (!FlagOn(Fcb->Flags, FCB_PAGE_FILE)) {
if (!ExAcquireResourceExclusiveLite(
&Fcb->MainResource,
IrpContext->IsSynchronous )) {
Status = STATUS_PENDING;
__leave;
}
FcbMainResourceAcquired = TRUE;
}
if (IsFlagOn(Vcb->Flags, VCB_READ_ONLY)) {
if (FileInformationClass != FilePositionInformation) {
Status = STATUS_MEDIA_WRITE_PROTECTED;
__leave;
}
}
if (FileInformationClass == FileDispositionInformation ||
FileInformationClass == FileRenameInformation ||
FileInformationClass == FileLinkInformation ||
FileInformationClass == FileAllocationInformation ||
FileInformationClass == FileEndOfFileInformation) {
if (!ExAcquireResourceExclusiveLite(
&Fcb->PagingIoResource,
IrpContext->IsSynchronous )) {
Status = STATUS_PENDING;
__leave;
}
FcbPagingIoResourceAcquired = TRUE;
}
/*
if (FileInformationClass != FileDispositionInformation
&& FlagOn(Fcb->Flags, FCB_DELETE_PENDING))
{
Status = STATUS_DELETE_PENDING;
__leave;
}
*/
switch (FileInformationClass) {
case FileBasicInformation:
{
PFILE_BASIC_INFORMATION FBI = (PFILE_BASIC_INFORMATION) Buffer;
PRFSD_INODE RfsdInode = Fcb->Inode;
if (FBI->CreationTime.QuadPart) {
RfsdInode->i_ctime = (ULONG)(RfsdInodeTime(FBI->CreationTime));
}
if (FBI->LastAccessTime.QuadPart) {
RfsdInode->i_atime = (ULONG)(RfsdInodeTime(FBI->LastAccessTime));
}
if (FBI->LastWriteTime.QuadPart) {
RfsdInode->i_mtime = (ULONG)(RfsdInodeTime(FBI->LastWriteTime));
}
if (IsFlagOn(FBI->FileAttributes, FILE_ATTRIBUTE_READONLY)) {
RfsdSetReadOnly(Fcb->Inode->i_mode);
SetFlag(Fcb->RfsdMcb->FileAttr, FILE_ATTRIBUTE_READONLY);
} else {
RfsdSetWritable(Fcb->Inode->i_mode);
ClearFlag(Fcb->RfsdMcb->FileAttr, FILE_ATTRIBUTE_READONLY);
}
if(RfsdSaveInode(IrpContext, Vcb, Fcb->RfsdMcb->Inode, RfsdInode)) {
Status = STATUS_SUCCESS;
}
if (FBI->FileAttributes & FILE_ATTRIBUTE_TEMPORARY) {
SetFlag(FileObject->Flags, FO_TEMPORARY_FILE);
} else {
ClearFlag(FileObject->Flags, FO_TEMPORARY_FILE);
}
NotifyFilter = FILE_NOTIFY_CHANGE_ATTRIBUTES |
FILE_NOTIFY_CHANGE_CREATION |
FILE_NOTIFY_CHANGE_LAST_ACCESS |
FILE_NOTIFY_CHANGE_LAST_WRITE ;
Status = STATUS_SUCCESS;
}
break;
case FileAllocationInformation:
{
PFILE_ALLOCATION_INFORMATION FAI = (PFILE_ALLOCATION_INFORMATION)Buffer;
if (FlagOn(Fcb->RfsdMcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY)) {
Status = STATUS_INVALID_DEVICE_REQUEST;
__leave;
}
if ( FAI->AllocationSize.QuadPart ==
Fcb->Header.AllocationSize.QuadPart) {
Status = STATUS_SUCCESS;
} else if ( FAI->AllocationSize.QuadPart >
Fcb->Header.AllocationSize.QuadPart ) {
Status = RfsdExpandFile(
IrpContext,
Vcb, Fcb,
&(FAI->AllocationSize));
if (NT_SUCCESS(Status)) {
RfsdSaveInode( IrpContext,
Vcb,
Fcb->RfsdMcb->Inode,
Fcb->Inode );
}
} else {
if (MmCanFileBeTruncated(&(Fcb->SectionObject), &(FAI->AllocationSize))) {
LARGE_INTEGER EndOfFile;
EndOfFile.QuadPart = FAI->AllocationSize.QuadPart +
(LONGLONG)(Vcb->BlockSize - 1);
Status = RfsdTruncateFile(IrpContext, Vcb, Fcb, &(EndOfFile));
if (NT_SUCCESS(Status)) {
if ( FAI->AllocationSize.QuadPart <
Fcb->Header.FileSize.QuadPart) {
Fcb->Header.FileSize.QuadPart =
FAI->AllocationSize.QuadPart;
}
RfsdSaveInode( IrpContext,
Vcb,
Fcb->RfsdMcb->Inode,
Fcb->Inode);
}
} else {
Status = STATUS_USER_MAPPED_FILE;
__leave;
}
}
if (NT_SUCCESS(Status)) {
CcSetFileSizes(FileObject,
(PCC_FILE_SIZES)(&(Fcb->Header.AllocationSize)));
SetFlag(FileObject->Flags, FO_FILE_MODIFIED);
NotifyFilter = FILE_NOTIFY_CHANGE_SIZE |
FILE_NOTIFY_CHANGE_LAST_WRITE ;
}
}
break;
case FileEndOfFileInformation:
{
PFILE_END_OF_FILE_INFORMATION FEOFI = (PFILE_END_OF_FILE_INFORMATION) Buffer;
BOOLEAN CacheInitialized = FALSE;
if (IsDirectory(Fcb)) {
Status = STATUS_INVALID_DEVICE_REQUEST;
__leave;
}
if (FEOFI->EndOfFile.HighPart != 0) {
Status = STATUS_INVALID_PARAMETER;
__leave;
}
if (IoStackLocation->Parameters.SetFile.AdvanceOnly) {
Status = STATUS_SUCCESS;
__leave;
}
if ((FileObject->SectionObjectPointer->DataSectionObject != NULL) &&
(FileObject->SectionObjectPointer->SharedCacheMap == NULL) &&
!FlagOn(Irp->Flags, IRP_PAGING_IO)) {
ASSERT( !FlagOn( FileObject->Flags, FO_CLEANUP_COMPLETE ) );
CcInitializeCacheMap(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -