📄 fileinfo.c
字号:
/*
* COPYRIGHT: GNU GENERAL PUBLIC LICENSE VERSION 2
* PROJECT: ReiserFs file system driver for Windows NT/2000/XP/Vista.
* FILE: fileinfo.c
* PURPOSE:
* PROGRAMMER: Mark Piper, Matt Wu, Bo Brant閚.
* HOMEPAGE:
* UPDATE HISTORY:
*/
/* INCLUDES *****************************************************************/
#include "rfsd.h"
/* GLOBALS ***************************************************************/
extern PRFSD_GLOBAL RfsdGlobal;
/* DEFINITIONS *************************************************************/
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, RfsdQueryInformation)
#if DISABLED
#pragma alloc_text(PAGE, RfsdSetInformation)
#pragma alloc_text(PAGE, RfsdExpandFile)
#pragma alloc_text(PAGE, RfsdTruncateFile)
#pragma alloc_text(PAGE, RfsdSetDispositionInfo)
#pragma alloc_text(PAGE, RfsdSetRenameInfo)
#pragma alloc_text(PAGE, RfsdDeleteFile)
#endif
#endif
NTSTATUS
RfsdQueryInformation (IN PRFSD_IRP_CONTEXT IrpContext)
{
PDEVICE_OBJECT DeviceObject;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
PFILE_OBJECT FileObject;
PRFSD_VCB Vcb;
PRFSD_FCB Fcb;
PRFSD_CCB Ccb;
PIRP Irp;
PIO_STACK_LOCATION IoStackLocation;
FILE_INFORMATION_CLASS FileInformationClass;
ULONG Length;
PVOID Buffer;
BOOLEAN FcbResourceAcquired = FALSE;
LONGLONG FileSize;
LONGLONG AllocationSize;
__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;
}
FileObject = IrpContext->FileObject;
Fcb = (PRFSD_FCB) FileObject->FsContext;
ASSERT(Fcb != NULL);
//
// This request is not allowed on volumes
//
if (Fcb->Identifier.Type == RFSDVCB) {
Status = STATUS_INVALID_PARAMETER;
__leave;
}
ASSERT((Fcb->Identifier.Type == RFSDFCB) &&
(Fcb->Identifier.Size == sizeof(RFSD_FCB)));
Vcb = Fcb->Vcb;
/*
if ( !IsFlagOn(Fcb->Vcb->Flags, VCB_READ_ONLY) &&
!FlagOn(Fcb->Flags, FCB_PAGE_FILE))
*/
{
if (!ExAcquireResourceSharedLite(
&Fcb->MainResource,
IrpContext->IsSynchronous
)) {
Status = STATUS_PENDING;
__leave;
}
FcbResourceAcquired = TRUE;
}
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.QueryFile.FileInformationClass;
Length = IoStackLocation->Parameters.QueryFile.Length;
Buffer = Irp->AssociatedIrp.SystemBuffer;
RtlZeroMemory(Buffer, Length);
FileSize = (LONGLONG) Fcb->Inode->i_size;
AllocationSize = CEILING_ALIGNED(FileSize, (ULONGLONG)Vcb->BlockSize);
switch (FileInformationClass) {
case FileBasicInformation:
{
PFILE_BASIC_INFORMATION FileBasicInformation;
if (Length < sizeof(FILE_BASIC_INFORMATION)) {
Status = STATUS_INFO_LENGTH_MISMATCH;
__leave;
}
FileBasicInformation = (PFILE_BASIC_INFORMATION) Buffer;
FileBasicInformation->CreationTime = RfsdSysTime(Fcb->Inode->i_ctime);
FileBasicInformation->LastAccessTime = RfsdSysTime(Fcb->Inode->i_atime);
FileBasicInformation->LastWriteTime = RfsdSysTime(Fcb->Inode->i_mtime);
FileBasicInformation->ChangeTime = RfsdSysTime(Fcb->Inode->i_mtime);
FileBasicInformation->FileAttributes = Fcb->RfsdMcb->FileAttr;
Irp->IoStatus.Information = sizeof(FILE_BASIC_INFORMATION);
Status = STATUS_SUCCESS;
__leave;
}
#if (_WIN32_WINNT >= 0x0500)
case FileAttributeTagInformation:
{
PFILE_ATTRIBUTE_TAG_INFORMATION FATI;
if (Length < sizeof(FILE_ATTRIBUTE_TAG_INFORMATION)) {
Status = STATUS_INFO_LENGTH_MISMATCH;
__leave;
}
FATI = (PFILE_ATTRIBUTE_TAG_INFORMATION) Buffer;
FATI->FileAttributes = Fcb->RfsdMcb->FileAttr;
FATI->ReparseTag = 0;
Irp->IoStatus.Information = sizeof(FILE_ATTRIBUTE_TAG_INFORMATION);
Status = STATUS_SUCCESS;
__leave;
}
#endif // (_WIN32_WINNT >= 0x0500)
case FileStandardInformation:
{
PFILE_STANDARD_INFORMATION FileStandardInformation;
if (Length < sizeof(FILE_STANDARD_INFORMATION)) {
Status = STATUS_INFO_LENGTH_MISMATCH;
__leave;
}
FileStandardInformation = (PFILE_STANDARD_INFORMATION) Buffer;
FileStandardInformation->AllocationSize.QuadPart = AllocationSize;
FileStandardInformation->EndOfFile.QuadPart = FileSize;
FileStandardInformation->NumberOfLinks = Fcb->Inode->i_links_count;
if (IsFlagOn(Fcb->Vcb->Flags, VCB_READ_ONLY))
FileStandardInformation->DeletePending = FALSE;
else
FileStandardInformation->DeletePending = IsFlagOn(Fcb->Flags, FCB_DELETE_PENDING);
if (Fcb->RfsdMcb->FileAttr & FILE_ATTRIBUTE_DIRECTORY) {
FileStandardInformation->Directory = TRUE;
} else {
FileStandardInformation->Directory = FALSE;
}
Irp->IoStatus.Information = sizeof(FILE_STANDARD_INFORMATION);
Status = STATUS_SUCCESS;
__leave;
}
case FileInternalInformation:
{
PFILE_INTERNAL_INFORMATION FileInternalInformation;
if (Length < sizeof(FILE_INTERNAL_INFORMATION)) {
Status = STATUS_INFO_LENGTH_MISMATCH;
__leave;
}
FileInternalInformation = (PFILE_INTERNAL_INFORMATION) Buffer;
// The "inode number"
FileInternalInformation->IndexNumber.LowPart = Fcb->RfsdMcb->Key.k_dir_id;
FileInternalInformation->IndexNumber.HighPart = Fcb->RfsdMcb->Key.k_objectid;
Irp->IoStatus.Information = sizeof(FILE_INTERNAL_INFORMATION);
Status = STATUS_SUCCESS;
__leave;
}
case FileEaInformation:
{
PFILE_EA_INFORMATION FileEaInformation;
if (Length < sizeof(FILE_EA_INFORMATION)) {
Status = STATUS_INFO_LENGTH_MISMATCH;
__leave;
}
FileEaInformation = (PFILE_EA_INFORMATION) Buffer;
// Romfs doesn't have any extended attributes
FileEaInformation->EaSize = 0;
Irp->IoStatus.Information = sizeof(FILE_EA_INFORMATION);
Status = STATUS_SUCCESS;
__leave;
}
case FileNameInformation:
{
PFILE_NAME_INFORMATION FileNameInformation;
if (Length < sizeof(FILE_NAME_INFORMATION) +
Fcb->RfsdMcb->ShortName.Length - sizeof(WCHAR)) {
Status = STATUS_INFO_LENGTH_MISMATCH;
__leave;
}
FileNameInformation = (PFILE_NAME_INFORMATION) Buffer;
FileNameInformation->FileNameLength = Fcb->RfsdMcb->ShortName.Length;
RtlCopyMemory(
FileNameInformation->FileName,
Fcb->RfsdMcb->ShortName.Buffer,
Fcb->RfsdMcb->ShortName.Length );
Irp->IoStatus.Information = sizeof(FILE_NAME_INFORMATION) +
Fcb->RfsdMcb->ShortName.Length - sizeof(WCHAR);
Status = STATUS_SUCCESS;
__leave;
}
case FilePositionInformation:
{
PFILE_POSITION_INFORMATION FilePositionInformation;
if (Length < sizeof(FILE_POSITION_INFORMATION)) {
Status = STATUS_INFO_LENGTH_MISMATCH;
__leave;
}
FilePositionInformation = (PFILE_POSITION_INFORMATION) Buffer;
FilePositionInformation->CurrentByteOffset =
FileObject->CurrentByteOffset;
Irp->IoStatus.Information = sizeof(FILE_POSITION_INFORMATION);
Status = STATUS_SUCCESS;
__leave;
}
case FileAllInformation:
{
PFILE_ALL_INFORMATION FileAllInformation;
PFILE_BASIC_INFORMATION FileBasicInformation;
PFILE_STANDARD_INFORMATION FileStandardInformation;
PFILE_INTERNAL_INFORMATION FileInternalInformation;
PFILE_EA_INFORMATION FileEaInformation;
PFILE_POSITION_INFORMATION FilePositionInformation;
PFILE_NAME_INFORMATION FileNameInformation;
if (Length < sizeof(FILE_ALL_INFORMATION)) {
Status = STATUS_INFO_LENGTH_MISMATCH;
__leave;
}
FileAllInformation = (PFILE_ALL_INFORMATION) Buffer;
FileBasicInformation =
&FileAllInformation->BasicInformation;
FileStandardInformation =
&FileAllInformation->StandardInformation;
FileInternalInformation =
&FileAllInformation->InternalInformation;
FileEaInformation =
&FileAllInformation->EaInformation;
FilePositionInformation =
&FileAllInformation->PositionInformation;
FileNameInformation =
&FileAllInformation->NameInformation;
FileBasicInformation->CreationTime = RfsdSysTime(Fcb->Inode->i_ctime);
FileBasicInformation->LastAccessTime = RfsdSysTime(Fcb->Inode->i_atime);
FileBasicInformation->LastWriteTime = RfsdSysTime(Fcb->Inode->i_mtime);
FileBasicInformation->ChangeTime = RfsdSysTime(Fcb->Inode->i_mtime);
FileBasicInformation->FileAttributes = Fcb->RfsdMcb->FileAttr;
FileStandardInformation->AllocationSize.QuadPart = AllocationSize;
FileStandardInformation->EndOfFile.QuadPart = FileSize;
FileStandardInformation->NumberOfLinks = Fcb->Inode->i_links_count;
if (IsFlagOn(Fcb->Vcb->Flags, VCB_READ_ONLY))
FileStandardInformation->DeletePending = FALSE;
else
FileStandardInformation->DeletePending = IsFlagOn(Fcb->Flags, FCB_DELETE_PENDING);
if (FlagOn(Fcb->RfsdMcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY)) {
FileStandardInformation->Directory = TRUE;
} else {
FileStandardInformation->Directory = FALSE;
}
// The "inode number"
FileInternalInformation->IndexNumber.LowPart = Fcb->RfsdMcb->Key.k_dir_id;
FileInternalInformation->IndexNumber.HighPart = Fcb->RfsdMcb->Key.k_objectid;
// Romfs doesn't have any extended attributes
FileEaInformation->EaSize = 0;
FilePositionInformation->CurrentByteOffset =
FileObject->CurrentByteOffset;
if (Length < sizeof(FILE_ALL_INFORMATION) +
Fcb->RfsdMcb->ShortName.Length - sizeof(WCHAR)) {
Irp->IoStatus.Information = sizeof(FILE_ALL_INFORMATION);
Status = STATUS_BUFFER_OVERFLOW;
__leave;
}
FileNameInformation->FileNameLength = Fcb->RfsdMcb->ShortName.Length;
RtlCopyMemory(
FileNameInformation->FileName,
Fcb->RfsdMcb->ShortName.Buffer,
Fcb->RfsdMcb->ShortName.Length
);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -