[转]Windows文件系统的杂谈

 
2011-08-19 11:37

author: jonathan

本文档的CopyRight归jonathan所有,可自由转载,转载时请保持文档的完整性。
/*---------------------------------------------------------------------------------------------------------------------*/

1 杂谈

1.1 FCB/SCB的COMMON结构定义
// fat
#define NTC_UNDEFINED                    ((NODE_TYPE_CODE)0x0000)

#define FAT_NTC_DATA_HEADER              ((NODE_TYPE_CODE)0x0500)
#define FAT_NTC_VCB                      ((NODE_TYPE_CODE)0x0501)
#define FAT_NTC_FCB                      ((NODE_TYPE_CODE)0x0502)
#define FAT_NTC_DCB                      ((NODE_TYPE_CODE)0x0503)
#define FAT_NTC_ROOT_DCB                 ((NODE_TYPE_CODE)0x0504)
#define FAT_NTC_CCB                      ((NODE_TYPE_CODE)0x0507)
#define FAT_NTC_IRP_CONTEXT              ((NODE_TYPE_CODE)0x0508)

// ntfs
#define NTC_UNDEFINED                    ((NODE_TYPE_CODE)0x0000)

#define NTFS_NTC_DATA_HEADER             ((NODE_TYPE_CODE)0x0700)
#define NTFS_NTC_VCB                     ((NODE_TYPE_CODE)0x0701)
#define NTFS_NTC_FCB                     ((NODE_TYPE_CODE)0x0702)
#define NTFS_NTC_SCB_INDEX               ((NODE_TYPE_CODE)0x0703)
#define NTFS_NTC_SCB_ROOT_INDEX          ((NODE_TYPE_CODE)0x0704)
#define NTFS_NTC_SCB_DATA                ((NODE_TYPE_CODE)0x0705)
#define NTFS_NTC_SCB_MFT                 ((NODE_TYPE_CODE)0x0706)
#define NTFS_NTC_SCB_NONPAGED            ((NODE_TYPE_CODE)0x0707)
#define NTFS_NTC_CCB_INDEX               ((NODE_TYPE_CODE)0x0708)
#define NTFS_NTC_CCB_DATA                ((NODE_TYPE_CODE)0x0709)
#define NTFS_NTC_IRP_CONTEXT             ((NODE_TYPE_CODE)0x070A)
#define NTFS_NTC_LCB                     ((NODE_TYPE_CODE)0x070B)
#define NTFS_NTC_PREFIX_ENTRY            ((NODE_TYPE_CODE)0x070C)
#define NTFS_NTC_QUOTA_CONTROL           ((NODE_TYPE_CODE)0x070D)

//cdfs
#define NTC_UNDEFINED                   ((NODE_TYPE_CODE)0x0000)

#define CDFS_NTC_DATA_HEADER            ((NODE_TYPE_CODE)0x0301)
#define CDFS_NTC_VCB                    ((NODE_TYPE_CODE)0x0302)
#define CDFS_NTC_FCB_PATH_TABLE         ((NODE_TYPE_CODE)0x0303)
#define CDFS_NTC_FCB_INDEX              ((NODE_TYPE_CODE)0x0304)
#define CDFS_NTC_FCB_DATA               ((NODE_TYPE_CODE)0x0305)
#define CDFS_NTC_FCB_NONPAGED           ((NODE_TYPE_CODE)0x0306)
#define CDFS_NTC_CCB                    ((NODE_TYPE_CODE)0x0307)
#define CDFS_NTC_IRP_CONTEXT            ((NODE_TYPE_CODE)0x0308)
#define CDFS_NTC_IRP_CONTEXT_LITE       ((NODE_TYPE_CODE)0x0309)

typedef struct _FSRTL_COMMON_FCB_HEADER {
CSHORT NodeTypeCode;
CSHORT NodeByteSize;
UCHAR Flags;
UCHAR IsFastIoPossible;
UCHAR Flags2;
UCHAR Reserved : 4;
UCHAR Version : 4;
PERESOURCE Resource;
PERESOURCE PagingIoResource;
LARGE_INTEGER AllocationSize;
LARGE_INTEGER FileSize;
LARGE_INTEGER ValidDataLength;
} FSRTL_COMMON_FCB_HEADER;
typedef FSRTL_COMMON_FCB_HEADER *PFSRTL_COMMON_FCB_HEADER;

Flags2 & FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS

typedef struct _FSRTL_ADVANCED_FCB_HEADER {
FSRTL_COMMON_FCB_HEADER;
PFAST_MUTEX FastMutex;
LIST_ENTRY FilterContexts;
EX_PUSH_LOCK PushLock;
PVOID* FileContextSupportPointer;
} FSRTL_ADVANCED_FCB_HEADER;
typedef FSRTL_ADVANCED_FCB_HEADER *PFSRTL_ADVANCED_FCB_HEADER;

typedef struct _FSRTL_PER_STREAM_CONTEXT {
LIST_ENTRY Links;
PVOID OwnerId;
PVOID InstanceId;
PFREE_FUNCTION FreeCallback;
} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT;

OwnerId和InstanceId都需要有意义的值:
OwnerId = 可以是驱动对象的地址等
InstanceId = 可以使流上下文地址 (FsRtlGetPerStreamContextPointer)

1.2 Cleanup和Close的区别

在FCB或者SCB中都有如下两个变量:

    CLONG CleanupCount; 打开未关闭文件句柄。   
    CLONG CloseCount; 打开未关闭文件对象。

在SCB中还有一变量:

    //
    // A count of the number of file objects opened on this stream
    // which represent user non-cached handles. We use this count to
    // determine when to flush and purge the data section in only
    // non-cached handles remain on the file.
    //
    CLONG NonCachedCleanupCount;

1.3 资源同步问题

在文件过滤驱动中,如要访问ExAcquireResourceExclusive等资源时,为了防止一般内核的APC调度,需调用如下接口:

FsRtlEnterFileSystem(KeEnterCriticalRegion)
FsRtlExitFileSystem(KeExitCriticalRegion)

关于设置TopLevelIrp也是很重要的,在访问ExAcquireResourceExclusive等资源时,也需要考虑该接口调用:

if ( IoGetTopLevelIrp() == NULL ) {

        IoSetTopLevelIrp( Irp );

        return TRUE;

    } else {

        return FALSE;
    }

设置IoSetTopLevelIrp目的:当前调用的irp是否是原始的线程操作irp还是由于线程的其他操作从而又产生的新的irp操作。

1.4 文件对象状态跟踪

跟踪一个文件操作的状态,一般使用FCB。而FCB的生命周期,又是以CREATE开始,以CLOSE结束。
但是文件系统内部也会通过IoCreateStreamFileObject(会调用IRP_MJ_CLEANUP) 和 IoCreateStreamFileObjectLite(会调用IRP_MJ_CLEANUP或者IRP_MJ_CLOSE)等创建文件对象,但是这些文件对象却不会调用Create,为跟踪状态带来困难。

因此,必须在IRP_MJ_READ、IRP_MJ_WRITE、IRP_MJ_SET_INFORMATION和IRP_MJ_GET_INFORMATION中动态创建。

1.5 文件加密中注意要清缓存

1.5.1 文件加密关注重点是缓存问题

1.5.2 清缓存有两个时机:create和cleanup

1.5.3 清缓存方式

1.5.4 双缓存与双FCB,个人认为本质是相同,不过是管理缓存的方法和机制作了改变,结果可能双FCB有更加稳定和高移植性

1.6 同步机制

spin_lock, event, resource, mutex, time, semaphore, thread, process, file等各种对象

1.7 IRP_MJ_FILE_SYSTEM_CONTROL

    此接口调用的device是设备,但是这个设备参数哪里来的呢?

    其实就是IrpSp->Parameters.MountVolume.Vpb->RealDevice中的设备。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
公司文件存放的数据库结构可以根据具体需求和业务流程进行设计。一种常见的数据库结构是使用主数据库文件和次数据库文件来组织文件存放。主数据库文件是数据库的起点,可以指向数据库中的其他部分,每个数据库都有一个主数据库文件。次数据库文件是可选的,有些数据库可能没有次数据文件,而有的数据库则有多个次数据文件。这些文件可以根据需要进行扩展和管理,文件扩展名一般是 .mdf 和 .ndf。此外,还需要考虑事务日志文件,它包含恢复数据库所需的所有日志信息,每个数据库必须至少有一个日志文件,但可以不止一个,推荐的文件扩展名是 .ldf。这样的数据库文件组织结构可以满足数据库的存储和管理需求。\[1\] 另外,需要注意的是,数据库文件的管理不一定要依赖于操作系统的文件管理系统。传统的文件系统可能无法提供数据库系统所需的附加信息和快速访问路径。数据库中的文件是供所有数据库用户共享的,因此需要兼顾多方面的要求,并能适应数据的动态变化。因此,数据库系统通常会在文件目录、文件描述块、物理块等部分附加一些信息,以满足数据库的功能需求。这样的设计可以提供更好的性能和灵活性。\[2\] 此外,还有一些特殊的系统数据库,如master数据库和tempdb数据库。master数据库记录了安装以及随后创建的所有数据库的信息,包括数据库所用磁盘空间、文件分配、空间使用率、系统级的配置设置、登录帐户密码、存储位置等。它是系统的关键,不允许任何人对其进行修改,因此需要经常保留一份当前备份的拷贝。tempdb数据库用于存储临时数据,例如临时表和临时存储过程的执行结果。\[3\] 综上所述,公司文件存放的数据库结构可以根据具体需求和业务流程进行设计,常见的结构包括主数据库文件、次数据库文件和事务日志文件。此外,还需要考虑特殊的系统数据库,如master数据库和tempdb数据库。 #### 引用[.reference_title] - *1* *3* [SQL Server数据库结构](https://blog.csdn.net/weixin_45962068/article/details/122537346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [数据库杂谈(七)——数据库的存储结构](https://blog.csdn.net/chengyuhaomei520/article/details/123324598)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值