Minifilter 拦截FileMapping IO事件

  • IO类型
  • Minifilter拦截
    • FileMapping拦截
  • 结论

IO类型

在Windows上一般常见的两种IO:

  1. 普通IO, 如通过ReadFile,WriteFile等Windows API进行读写
  2. FileMapping,通过CreateFile打开一个文件,然后通过CreateFileMapping创建FileMapping对象,通过MapViewOfFile映射,之后就像操作内存一样(memcpy, strcpy等等),这些数据的变更会被操作系统同步到对应的文件上。

Minifilter拦截

针对IO类型的(1),其实,绝大多数人都会在minifilter中拦截,因为很简单,只需要拦截IRP_MJ_WRITE/IRP_MJ_READ就可以了。如下。

    { IRP_MJ_WRITE,0,PreWrite,PostWrite }

每当应用程序调用WriteFile的时候,这两个函数都会进来,然后里面可以做一些过滤,阻断,加密等等。
但是对于(2),FileMapping,可能会有一些迷惑。

FileMapping拦截

比如应用程序这样写文件:

void TestIOFileMapping() {HANDLE  hFile;hFile = CreateFile(L"testfilemapping.foo",GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,// CREATE_ALWAYS,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);if (hFile == INVALID_HANDLE_VALUE){return;}HANDLE hMapping = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,MAX_FILESIZE,NULL);if (hMapping == NULL){CloseHandle(hFile);return;}char* puchData = (char*)MapViewOfFile(hMapping,FILE_MAP_WRITE,0,0,0);if (puchData == NULL){CloseHandle(hMapping);CloseHandle(hFile);return;}for (int i = 0; i < 10; i++){memset(puchData + i * 1024, 0x41 + i, 1024);}UnmapViewOfFile(puchData);//    FlushFileBuffers(hFile);CloseHandle(hMapping);CloseHandle(hFile);
}

那么很可能在不同的操作系统上会得到不同的结果。基本分这么几类:

  1. IRP_MJ_WRITE的对应函数(比如PreWrite),直接就被调用,然后进程号就是当前应用。
  2. PreWrite很快被调用,但是发现进程号是System进程的,也就是4号
  3. PreWrite过了好长一会才被调用,进程号是System进程的,也就是4号
  4. PreWrite一直都没有被调用

其实这里有个有趣的问题:
我们在上面的测试代码里面把FlushFileBuffers(hFile);给禁用了。

那么得到的结果就取决于操作系统了。
上面四种情况都有可能发生。对于第四种,其实,操作系统会在关机前把内容写入磁盘(只是你不容易看到)
针对FileMapping,当应用层调用了memset或者strcpy之类的操作内存后,这些内容变更什么时候反映到磁盘(不调用FlushFilebuffers),是由操作系统决定的。
但是有一点是肯定的,就是内容要写入磁盘,一定会经过IRP, 也就是PreWrite一定会被调用。只是时间点有操作系统决定

那么如果我们把 FlushFileBuffers(hFile);打开,那么基本就是第一种情况了,也就是IRP马上被调用,因为应用程序要立即把内容flush到磁盘。

其实,当我们编写FileMapping代码的时候,是需要调用FlushFileBuffers的,不然,假如突然断电,就有可能丢失内容(还没写入磁盘)。只是很多人会遗漏,然后大多数情况,也确实不会有问题。

结论

无论是ReadFile,WriteFile等常规IO手段,还是FileMapping,IRP事件一定有,只是FileMapping可能会有一点点迷惑,因为在没有调用FlushFileBuffers的时候,有时看到的情况不太一样。但是数据要写入磁盘,IRP一定有。

附:

 HANDLE hMapping = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,MAX_FILESIZE,NULL);

这个调用会触发一个IRP:

{ IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION,0,AcquireForSectionSynchronization,PostAcquireForSectionSynchronization }

这里有时也可以做一些事情,比如查看索要的权限等等。

那么在IRP_MJ_WRITE里面怎么获取当前IRP操作文件的文件名呢?这个对于WriteFile和FileMapping还有一些不一样,后面再讲吧。

Minifilter 拦截FileMapping IO事件相关推荐

  1. 网络编程实战之高级篇, 彻底解决面试C10k问题, 高并发服务器, IO多路复用, 同时监视多个IO事件

    目录 一.前言 二.IO多路复用的理解 三.IO多路复用的发展 select poll epoll ​四.C10K服务端代码 五. 总结 一.前言 网络入门篇,从操作系统的层次推开网络大门 网络入门基 ...

  2. android 拦截点击事件,Android事件拦截机制

    一直对事件拦截不是很清楚,读Android群英传的笔记,记录下. 要了解事件拦截,首先要了解触摸事件,触摸事件是捕获触摸屏幕后发生的事件.按一下屏幕通常会有几个事件发生,当按下屏幕,这是事件1.滑动了 ...

  3. Android在string.xml中定义html文档并加载显示,以及拦截WebView链接事件

    一.如何在string.xml中定义html文档 首先最好自己在外部新建一个html文件,然后开始写自己的内容.并且在浏览器中预览效果. 首先预先编写一个简单的html文档: <html> ...

  4. c#使用钩子拦截鼠标键盘事件

    窗体本身带的键盘鼠标事件函数只能响应窗体自己的事件,窗体之外的事件是不会响应的.比如当窗体最小化的时候也响应就要用全局钩子拦截消息来处理了. 大概过程就是在窗体初始化时加载钩子,等待事件消息,事件触发 ...

  5. android 拦截点击事件,Android双击事件拦截方法

    下文我们介绍两种双击事件拦截的方式 1.通过Android的事件分发机制进行拦截(dispatchTouchEvent) 话不多说,直接上代码: /** 判断是否是快速点击 */ private st ...

  6. linux 键盘过滤,linux – 需要拦截HID Keyboard事件(然后阻止它们)

    我有一个RFID USB设备,注册为HID设备(A USB键盘或多或少). 我正在寻找一种方法来捕获此输入,并在它碰到普通键盘事件处理程序(并将10位数的RFID代码输出到控制台)之前对其进行阻塞/过 ...

  7. html 冒泡事件拦截,Js 冒泡事件阻止

    一. 事件目标 现在,事件处理程序中的变量event保存着事件对象.而 event.target 属性保存着产生事件的目标元素.这个属性是 DOM API 中规定的,但是没有被所有浏览器实现 .jQu ...

  8. html 冒泡事件拦截,JavaScript阻止事件冒泡与事件捕获

    1.事件冒泡 在一个对象上触发某类事件,如onclick事件等,在其祖先节点上也会依次触发该事件. 事件冒泡 依次输出:a.div.body 注意:不是所有的事件都能冒泡.blur.focus.loa ...

  9. Mina源码阅读笔记(一)-整体解读

    2019独角兽企业重金招聘Python工程师标准>>> 今天的这一节,将从整体上对mina的源代码进行把握,网上已经有好多关于mina源码的阅读笔记,但好多都是列举了一下每个接口或者 ...

最新文章

  1. MySQL 数据库修改访问权限,不能使用ip连接mysql问题处理:Host ‘host.docker.internal‘ is not allowed to connect to this ...
  2. 用数据挖掘来支持音乐创作
  3. 编译FreeNOS报/usr/lib/grub/i386-pc/modinfo.sh doesn‘t exist错误
  4. AndroidStudio 3.4更新了啥?(转载)
  5. rabbitmq 查看消费者_RabbitMQ 和 Kafka 的比较
  6. Speaker Recognition: Feature Extraction
  7. 普通人也可以制作App
  8. linux 有dll文件吗,linux上可以运行dll吗
  9. 已删除的QQ好友聊天记录怎么查看
  10. 【亲测有效】Ubuntu系统开机速度慢解决办法
  11. android 禁止其他应用开机启动项,禁止各种APP开机后自动运行的方案
  12. [bzoj3939_Usaco2015 Feb]Cow Hopscotch(线段树维护DP)
  13. 表空间脚本[置顶] Oracle 数据库表空间容量调整(表空间缩容脚本)脚本
  14. matlab(slove)如何应用,README.md/matlab/slove at master · SeanXP/README.md · GitHub
  15. 【学习打卡02】可解释机器学习笔记之ZFNet
  16. fect:基于面板数据的因果推断(上)
  17. CSDN上传资源提示:资源上传中断
  18. 软件测试bug分析定位技巧
  19. ARM芯片选型的一些建议
  20. u盘打不开提示格式化怎么办?u盘恢复这样做

热门文章

  1. dom4j在特定位置添加节点
  2. APISpace中秋API推荐
  3. 浅谈连锁中医馆等健康产品的运营策略
  4. Python深度学习-U1:什么是深度学习
  5. windows--port常用和不常用端口
  6. LOGO设计中文字体设计十种手法
  7. FT2000/4查看CPU温度频率以及开关core
  8. JQ input 文件上传并预览 选择图片后,在页面上预览图片,页面渲染
  9. 日本App Store畅销排行榜新鲜出炉!
  10. 用python写注册登录_如何用python 写注册,登录功能的测试