文件过滤
来源:互联网 发布:化工就业数据 编辑:程序博客网 时间:2024/05/16 19: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中的设备。
- 文件过滤
- 文件过滤
- 过滤文件
- 文件过滤
- 文件过滤
- 文件过滤
- 文件过滤驱动之一
- [Source Code]文件过滤
- JFileChooser文件过滤
- 文件遍历和过滤
- IHttpModule过滤htm文件
- COPY文件,过滤注释.
- FileDialog文件过滤
- SVN过滤文件设置
- Java 文件过滤 FileFilter
- FileNameFilter文件过滤
- 文件过滤功能
- 文件过滤FilenameFilter
- time value from 1970 to date string.
- String 类的拷贝构造函数, 赋值操作符重载, 算数操作符重载
- Android中Activity频繁进入再退出时程序崩溃的解决方案
- 最小二乘曲线拟合matlab实现
- 跳入c++ 5 memmove 字符串截取
- 文件过滤
- DataTable数据进行排序、检索、合并、分页、统计 [转]
- ssize_t与size_t-linux
- 二、SQL数据操作和查询
- c++ 中CImage类Load函数,路径中含有空格应对策略!
- jquery人才网弹出层选择工作地区特效
- 数据结构(5)——树及树的遍历
- Android中关于FileObserver类的监听文件和目录动态
- 应用场景之Dynamic End Point(DEP)IPSec的配置