文件系统除了处理正常的IRP 之外,还要处理所谓的FastIo.FastIo是Cache Manager 调用所引发的一种没有irp 的请求。换句话说,除了正常的Dispatch Functions 之外,你还得为DriverObject 撰写另一组Fast Io Functions.这组函数的指针在driver->FastIoDispatch.

  I/O管理起在进行I/O操作时,首先查看该设备是否支持fast io。也就是fast io dispach 的哪张表项是否为空,如果不为空,则调用之,当发现函数返回值为FALSE时,才build a Irp ,然后下传。

  首先需要了解的是:FastIo 是独立于普通的处理IRP 的分发函数之外的另一组接口。但是他们的作用是

一样的,就是由驱动处理外部给予的请求。而且所处理的请求也基本相同。其次,文件系统的普通分发

例程和fastio 例程都随时有可能被调用。做好的过滤驱动显然应该同时过滤这两套接口。

  FASTIO 是一套IO MANAGER 与DEVICE DRIVER 沟通的另外一套API. 在进行基于IRP 为基础的接口

调用前, IO MANAGER 会尝试使用FAST IO 接口来加速各种IO 操作.

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 线程将要把

修改后的文件数据写入前调用.获取文件锁.

fastIO的更多相关文章

  1. fastIO模板

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

  2. 关于FastIo

    由于你的驱动将要绑定到文件系统驱动的上边,文件系统除了处理正常的IRP 之外,还要处理所谓的FastIo.FastIo是Cache Manager 调用所引发的一种没有irp 的请求.换句话说,除了正 ...

  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. 在远程连接一个 Wndows 10的情况下,重启远程机器

    如果你从菜单找的话,是找不到这个菜单的!!! 你应该直接按 alt + F4 , 就会出现这个选项了. 参考: https://tommynation.com/shut-windows-10-remo ...

  2. PHP多种序列化/反序列化的方法(serialize和unserialize函数)

    serialize和unserialize函数 这两个是序列化和反序列化PHP中数据的常用函数. <?php $a = array('a' => 'Apple' ,'b' => 'b ...

  3. day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)

    day11:装饰器(装饰器形成.装饰器作用.@语法糖.原则.固定模式) 装饰器形成:最简单的.有返回值的.有一个参数的.万能参数 函数起的作用:装饰器用于在已经完成的函数前后增加功能 语法糖:使代码变 ...

  4. MySQL事务(一)

    一.基本介绍 事务就是一组dml语句,这些语句存在逻辑上的相关性,这一组dml语句要么全部成功,要么全部失败,是一个整体.ACID属性(原子性,一致性,隔离性,持久性):mysql提供一种机制,保证我 ...

  5. 终于可以从百度云上BOS读取数据到本地了

    终于可以从百度云上BOS读取数据到本地了

  6. ERROR: java.lang.NullPointerException的一种情况

    java.lang.NullPointerException错误,错误原因就是以下六条没配置完: 1.JAVA环境配置正确.2.源码里面的包没有与tomcat的包冲突.3.把数据库文件给导入到了SQL ...

  7. Spring的几种注入bean的方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式).   使用属性的se ...

  8. 从tcp的角度看,打开一个网页到底发生了什么

    使用wireshark进行抓包分析:新建表达式过滤器,选择协议,字段,匹配方式,应用就能筛选出想要的数据包. 一个示例:(tcp.srcport == 1523 or tcp.dstport == 1 ...

  9. makefile文件写法解析

    一.makefile文件示例 makefile文件并不难写,一个makefile模版如下所示,所有makefile文件在此基上稍微修改就可以了. # this is a makefile #这一行是注 ...

  10. Qt画笔实现曲线

    效果图: void CurvePoint::paintEvent(QPaintEvent *event) { // 曲线上的点 static QList<QPointF> points = ...