由于你的驱动将要绑定到文件系统驱动的上边,文件系统除了处理正常的IRP 之外,还要处理所谓的Fa
stIo.FastIo是Cache Manager 调用所引发的一种没有irp 的请求。换句话说,除了正常的Dispatch Fu
nctions 之外,你还得为DriverObject 撰写另一组Fast Io Functions.这组函数的指针在driver->Fas
tIoDispatch.

首先需要了解的是:FastIo 是独立于普通的处理IRP 的分发函数之外的另一组接口。但是他们的作用是
一样的,就是由驱动处理外部给予的请求。而且所处理的请求也基本相同。其次,文件系统的普通分发
例程和fastio 例程都随时有可能被调用。做好的过滤驱动显然应该同时过滤这两套接口。然而,一般都
只介绍IRP 过滤的方法。Fastio 接口非常复杂。但是与IRP 过滤是基本一一对应的。只要了解了前者,
后者很容易学会。

在开发的初期学习阶段,你可以简单的设置所有的fastio 例程返回FALSE 并不做任何事。这样这些请求
都会通过IRP重新发送被你的普通分发函数捕获。有一定的效率损失,但是并不是很大。
NT 下FASTIO 是一套IO MANAGER 与DEVICE DRIVER 沟通的另外一套API. 在进行基于IRP 为基础的接口
调用前, IO MANAGER 会尝试使用FAST IO 接口来加速各种IO 操作. FASTIO 本身的文档并不多见, 本篇
就是要介绍一下FASTIO 接口.

FastIoCheckIfPossible, 此调用并不是IO MANAGER 直接调用. 而是被FsRtlXXX 系列函数调用. 用于确
认读写操作是否可以用FASTIO 接口进行.
FastIoRead/FastIoWrite, 很明显, 是读写处理的调用.
FastIoQueryBasicInfo/FastIoQueryStandardInfo, 用于获取各种文件信息. 例如创建,修改日期等.
FastIoLock/FastIoUnlockSingle/FastIoUnlockAll/FastIoUnlockAllByKey,用于对文件的锁定操作.
在NT 中有2 种锁定需要存在。1.排他性锁. 2.共享锁. 排他性锁在写操作前获取,不准其他进程获得写
操作权限, 而共享锁则代表需要读文件某区间. 禁止有写动作出现. 在同一地址上, 如果有多个共享锁
请求, 那是被允许的.

FastIoDeviceControl 用于提供NtDeviceIoControlFile 的支持.
AcquireFileForNtCreateSection/ReleaseFileForNtCreateSection 是NTFS 在映射文件内容到内存页面
前进行的操作.
FastIoDetachDevice, 当REMOVABLE 介质被拿走后, FILE SYSTEM 的DEVICE 对象会在任意的时刻被销毁
.只有正确处理这个调用才能把上层DEVICE 和将要销毁的DEVICE 脱钩. 如果不解决这个函数, 系统会

FastIoQueryNetworkOpenInfo, 当CIFS 也就是网上邻居,更准确的说是网络重定向驱动尝试获取文件信
息,会使用这个调用. 该调用是因为各种历史原因而产生. 当时设计CIFS 时为避免多次在网上传输文件
信息请求, 在NT4 时传输协议增加了一个FileNetworkOpenInformation 的网络文件请求. 而FSD 则增加
了这个接口. 用于在一次操作中获得所有的文件信息. 客户段发送FileNetworkOpenInformation, 服务
器端的FSD 用本接口完成信息填写.

FastIoAcquireForModWrite, Modified Page Writer 会调用这个接口来获取文件锁. 如果实现这个接口
. 则能使得文件锁定范围减小到调用指定的范围. 不实现此接口, 整个文件被锁.
FastIoPrepareMdlWrite, FSD 提供MDL. 以后向此MDL 写入数据就代表向文件写入数据. 调用参数中有
FILE_BOJECT 描述要写的目标文件.
FastIoMdlWriteComplete, 写操作完成. FSD 回收MDL.
FastIoReadCompressed, 当此调用被调用时, 读到的数据是压缩后的.应该兼容于标准的NT 提供的压缩
库. 因为调用者负责解压缩.
FastIoWriteCompressed,当此调用被调用时, 可以将数据是压缩后存储.
FastIoMdlReadCompressed/FastIoMdlReadCompleteCompressed, MDL 版本的压缩读. 当后一个接口被调
用时,MDL 必须被释放.
FastIoMdlWriteCompressed/FastIoMdlWriteCompleteCompressed, MDL 版本的压缩写.当后一个接口被
调用时,MDL 必须被释放.
FastIoQueryOpen, 这不是打开文件的操作. 但是却提供了一个IRP_MJ_CREATE 的IRP. 我在以前版本的
SECUSTAR 的软件中错误地实现了功能. 这个操作是打开文件/获取文件基本信息/关闭文件的一个操作.
FastIoReleaseForModWrite,释放FastIoAcquireForModWrite 调用所占有的LOCK.
FastIoAcquireForCcFlush/FastIoReleaseForCcFlush FsRtl 会调用此接口,在LAZY WRITE 线程将要把
修改后的文件数据写入前调用.获取文件锁.

在应用层读写文件等操作将通过 INT 2E切换到内核层。这个不用说大家都很熟悉流程。那么到了内核层
又是如何处理的?

就先拿 ZwReadFile,ZwWriteFile 说事。首先将文件句柄转换成FILE_OBJECT 指针。这时 I/OMGR 收到
一个 FILE I/O 请求,它将首先选择用 FASTIO 接口来进行缓冲操作(注意:FASTIO 对于FSD 来说不是
必须的。且 FASTIO 并不真正读写内容)。如果有 FASTIO 例程则调用FastIoRead,FastIoWrite。在它
们的函数处理例程中返回 TRUE 那么则表示操作完成,继续调用 CC MGR。如果返回 FALSE 那么I/O MG
R 则创建 IRP 。系统判断 FILE_OBJECT 结构中的PrivateCacheMap 项如果不为 NULL,表示已被 CC M
GR映射过了,调用CcCopyRead,CcCopyWrite。如果为 NULL 那么 CC MGR 会调用 CcInitializeCacheMa
p 来初始化,把相应的 FILE_OBJECT 映射进来。

在经过 I/O MGR 处理后无论是 IRP 还是 FASTIO,怎么分支都会走到CC MGR。那么在CC MGR 中又会碰
到几个状况。如 CC MGR 的 LAZY WRITETHREAD 会定期调用 MM MGR 的 MmFlushSection 将 CC MGR 中
已被修改的PAGE 发送到 FSD 写盘。而 MM MGR 又有几种状况,先拿写来说。MM MGR 存在 DIRTY WRIT
E, 那么在这种情况下MM MGR 则调用 IoAsynchronousPageWrite向 FSD 发送 NOCACHE IRP 即 IRP HE
ADER 的 FLAGS 为IRP_NOCACHE 来写盘(也就是说 CC MGR 调用 MM MGR 的 MmFlushSection 而 MM MG
R则调用IoAsynchronousPageWrite 发送 NOCACHE IRP 到 FSD,那么 FSD 则直接发送到 STORAGE DRIV
ER进行写盘操作。这是写盘操作过程)。

在走到 CC MGR 后读盘又分几种状况。在调用 CcCopyRead 时如果数据不在 CC MGR 中,则产生缺页中
断(这其实也是预先读机制)。产生缺页中断后会走到MM MGR 。此时 MM MGR 调用 IoPageRead 来发送
一个 PAGING I/O 的 IRP(即 IRP HEADER 中的 FLAGS为IRP_PAGING_IO 或 IRP_SYNCHRONOUS_PAGING_
IO )到 FSD。
     还有就是用户层调用 CreateFileMapping其实是调用 NtCreateSection 一样产生缺页中断然后到MM MG
R 调用MmCreateSection。其余就跟我上面提到的流程一样了。待一些读/写 IRP 发送到 FSD 时。 FSD
再调用 IoCallDriver继续传递下去。如果你对NT DRIVER 分层机制了解的话。可能就会理解为什么要
有这一步。

关于FastIo的更多相关文章

  1. fastIO

    文件系统除了处理正常的IRP 之外,还要处理所谓的FastIo.FastIo是Cache Manager 调用所引发的一种没有irp 的请求.换句话说,除了正常的Dispatch Functions ...

  2. fastIO模板

    freadIO整理 namespace fastIO{ #define BUF_SIZE 100000 ; inline char nc() { static char buf[BUF_SIZE],* ...

  3. fast-IO

    代码: int Scan() //输入外挂 { ,ch,flag=; if((ch=getchar())=='-') flag=; ') res=ch-'; ') res=res*+ch-'; ret ...

  4. ACM模板(持续补完)

    1.KMP #include<cstring> #include<algorithm> #include<cstdio> using namespace std; ...

  5. 清华学堂 LightHouse

    灯塔(LightHouse) Description As shown in the following figure, If another lighthouse is in gray area, ...

  6. [转]C/C++ 实现文件透明加解密

    今日遇见一个开超市的朋友,真没想到在高校开超市一个月可以达到月净利润50K,相比起我们程序员的工资,真是不可同日而语,这个世道啊,真是做程序员不如经商开超市, 我们高科技的从业者,真是造原子弹不如卖茶 ...

  7. Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses(分组背包+dsu)

    D. Arpa's weak amphitheater and Mehrdad's valuable Hoses Problem Description: Mehrdad wants to invit ...

  8. ACM/ICPC 之 优先级队列+设置IO缓存区(TSH OJ-Schedule(任务调度))

    一个裸的优先级队列(最大堆)题,但也有其他普通队列的做法.这道题我做了两天,结果发现是输入输出太过频繁,一直只能A掉55%的数据,其他都是TLE,如果将输入输出的数据放入缓存区,然后满区输出,可以将I ...

  9. 【Tsinghua OJ】循环移位(Cycle)

    Description Cycle shifting refers to following operation on the sting. Moving first letter to the en ...

随机推荐

  1. excel 处理方法

    //.方法一:采用OleDB读取EXCEL文件: //打开excel 返回指定表中的所有数据 public DataSet ExcelToDS(string Path) { string strCon ...

  2. eslint推荐编码规范和airbnb推荐编码规范

    Eslint规范 for 循环禁止使用无限循环(这个非默认推荐) // bad for (var i = 0; i < 10; i--) { } for (var i = 10; i >= ...

  3. Python学习【第1篇】:环境配置

    1. 下载安装包 https://www.python.org/ftp/python/2.7.14/python-2.7.14.amd64.msi    # 2.7安装包   https://www. ...

  4. javascript实现:在N个字符串中找出最长的公子串

    'use strict' module.exports = function 找出最长公子串 (...strings) { let setsOfSubstrings = [] strings.redu ...

  5. HDU 1241 Oil Deposits (DFS or BFS)

    链接 : Here! 思路 : 搜索判断连通块个数, 所以 $DFS$ 或则 $BFS$ 都行喽...., 首先记录一下整个地图中所有$Oil$的个数, 然后遍历整个地图, 从油田开始搜索它所能连通多 ...

  6. 博弈论题目总结(二)——SG组合游戏及变形

    SG函数 为了更一般化博弈问题,我们引入SG函数 SG函数有如下性质: 1.如果某个状态SG函数值为0,则它后继的每个状态SG函数值都不为0 2.如果某个状态SG函数值不为0,则它至少存在一个后继的状 ...

  7. CentOS7.4上搭建rocketMQ集群

    一.rocketMQ集群部署方案优缺点对比: 多Master模式(2m-noslave) : 一个集群无Slave,全是Master,例如2个Master或者3个Master 优点:配置简单,单个Ma ...

  8. 单例模式的理解【php】

    单例模式(Singleton Pattern):顾名思义,就是只有一个实例.作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 为什么要使用单例模式 1.P ...

  9. python爬虫08 | 你的第二个爬虫,要过年了,爬取豆瓣最受欢迎的250部电影慢慢看

    马上就要过年啦 过年在家干啥咧 准备好被七大姑八大姨轮番「轰炸」了没? 你的内心 os 是这样的 但实际上你是这样的 应付完之后 闲暇时刻不妨看看电影 接下来咱们就来爬取豆瓣上评分最高的 250部电影 ...

  10. Python语言数据结构和语言结构(2)

    目录 1. Python预备基础 2. Python数据类型 3. Python条件语句 4. while循环和for循环 1. Python预备基础 1.1 变量的命名   变量命名规则主要有以下几 ...