文件系统Minifilter驱动(九)

Minifilter微过滤框架:框架介绍以及驱动层和应用层的通讯 minifilter是sfilter后微软推出的过滤驱动框架。相比于sfilter,他更容易使用,需要程序员做的编码更简洁。系统为minifilter专门制作了一个过滤管理器,这个管理器本身其实是一个传统过滤驱动,它向minifilter的使用者提供许多接口,让原本复杂的文件过滤驱动变得方便简单。之所以简单是因为传统的过滤驱动把大量的工作放在绑定设备上,而现在这些工作都交给minifilter中的 阅读详情

六、决定一个I/O操作的Buffering方法 

与设备驱动一样,文件系统负责在用户模式应用程序和一个系统的设备之间传输数据.操作系统提供了以下三种方法访问数据buffer: 

· 在buffered I/O方法中,I/O管理器从非分页池中为操作分配一个系统buffer.I/O管理器在发起该I/O操作的上下文中,从这个系统buffer中复制数据到应用程序的user buffer中,反之亦然.

· 在direct I/O方法中,I/O管理器探测并锁住user buffer.然后它创建一个MDL来映射被锁的buffer.I/O管理器在发起I/O操作的线程上下文中访问该buffer.

· 在neither I/O中,I/O管理器既不分配一个系统buffer也不锁住或映射 user buffer.而是简单地把buffer的原始用户空间虚拟地址传给文件系统栈.驱动负责确保它们正执行在发起线程的上下文中且buffer地址是有效的.

Minifilter驱动必须在试图使用这些地址之前验证其在用户空间中是否有效. I/O管理器和filter管理器不会验证这样的地址也不会验证内含在要被传给minifilter驱动的buffer中的指针.

所有标准的微软文件系统对大多数I/O处理都使用NEITHER I/O.

更多关于buffering方法的信息,参考Methods for Accessing Data Buffers. 

对IRP-I/O操作来说,所使用的buffering方法是操作指定的且由以下要素决定: 

· 正被执行的I/O操作的类型 

· 文件系统卷的DEVICE_OBJECT 结构的成员Flags的值 

· 对IOCTL和FSCTL操作来说,当IOCTL或FSCTL被定义时,被传给CTL_CODE宏的参数TransferType 的值 

有buffer的Fast I/O操作总是用NEITHER I/O. 

文件系统callback操作没有buffer.

本节包括: 

1.可以是IRP-I/O或Fast I/O的操作 

以下类型的操作可以是基于IRP或fast I/O的操作: 

· IRP_MJ_DEVICE_CONTROL. (注意IRP_MJ_INTERNAL_DEVICE_CONTROL总是基于IRP的.) 

· IRP_MJ_QUERY_INFORMATION. 如果FileInformationClass参数为FileBasicInformation、FileStandardInformation或FileNetworkOpenInformation则这个操作可以是fast I/O. 

· IRP_MJ_READ. Minifilter驱动可以在FLT_OPERATION_REGISTRATION结构中设置FLTFL_OPERATION_REGISTRATION_SKIP_CACHED_IO标记来避免收到fast I/O IRP_MJ_READ操作和cached 基于IRP的读. 

· IRP_MJ_WRITE. Minifilter驱动可以在FLT_OPERATION_REGISTRATION结构中设置FLTFL_OPERATION_REGISTRATION_SKIP_CACHED_IO标记来避免收到fast I/O IRP_MJ_WRITE操作和cached基于IRP的写. 

当所有这些操作都是fast I/O操作时,它总是使用NEITHER I/O,即使等价的基于IRP的操作使用不同的buffering方法.

当IRP_MJ_DEVICE_CONTROL是一个fast I/O操作时,它总是使用NEITHER I/O而不管IOCTL的传输类型是什么.

尽管IRP_MJ_LOCK_CONTROL可以是一个基于IRP或fast I/O的操作,但它没有buffer. 

2. 遵从Device Object Flags的IRP-I/O操作

以下IRP-I/O操作所使用的buffering方法由文件系统卷的DEVICE_OBJECT 结构的成员Flags的值决定: 

· IRP_MJ_DIRECTORY_CONTROL 

· IRP_MJ_QUERY_EA 

· IRP_MJ_QUERY_QUOTA 

· IRP_MJ_READ 

· IRP_MJ_SET_EA 

· IRP_MJ_SET_QUOTA 

· IRP_MJ_WRITE 

在Flags成员中使用的DO_BUFFERED_IO和DO_DIRECT_IO标记的使用如下: 

· 如果设置了DO_BUFFERED_IO,则操作使用buffered I/O. 

· 如果设置了DO_DIRECT_IO且没有设置DO_BUFFERED_IO,则操作使用direct I/O. 

· 如果两个标记都没有设置,则操作使用NEITHER I/O. 

更多设备对象标记的信息,参考DEVICE_OBJECT and Initializing a Device Object. 

注意IRP_MJ_READ和IRP_MJ_WRITE可以是基于IRP或fast I/O的操作.当它们基于IRP时,buffering方法由以上描述的设备对象标记决定.当它们是fast I/O,它们总是使用neither I/O.更多关于可以是基于IRP或fast I/O的操作的I/O操作的信息,参考可以是IRP-I/O或Fast I/O的操作. 

3.总是使用buffered I/O的IRP-I/O操作 

以下IRP-I/O操作总是使用buffered I/O,而不管文件系统卷的DEVICE_OBJECT结构的成员Flags的值是什么: 

· IRP_MJ_CREATE (EaBuffer参数) 

· IRP_MJ_QUERY_INFORMATION 

· IRP_MJ_QUERY_VOLUME_INFORMATION 

· IRP_MJ_SET_INFORMATION 

· IRP_MJ_SET_VOLUME_INFORMATION 

注意IRP_MJ_QUERY_INFORMATION也可以是一个fast I/O操作.当它是一个fast I/O操作时,它用neither I/O.更多关于可以是基于IRP或fast I/O的操作的信息,参考可以是IRP-I/O或Fast I/O的操作. 

4. 总是使用Neither 的IRP-I/O操作 

以下IRP-I/O操作总是使用neither I/O,而不管文件系统卷的DEVICE_OBJECT结构的成员Flags的值是什么: 

· IRP_MJ_PNP 

· IRP_MJ_QUERY_SECURITY 

· IRP_MJ_SET_SECURITY 

· IRP_MJ_SYSTEM_CONTROL 

5.基于IRP的IOCTL和FSCTL操作

以下IRP-I/O操作所使用的buffering方法与IOCTL或FSCTL中定义的传输类型相匹配: 

· IRP_MJ_DEVICE_CONTROL 

· IRP_MJ_FILE_SYSTEM_CONTROL 

· IRP_MJ_INTERNAL_DEVICE_CONTROL 

传输类型是在CTL_CODE宏的参数TransferType 中指定的. 要获得一个给定的IOCTL或FSCTL的传输类型,使用以下宏: 

#define METHOD_FROM_CTL_CODE(ctrlCode)         ((ULONG)(ctrlCode & 3))

这个宏的返回值为以下之一: 

#define METHOD_BUFFERED                 0
#define METHOD_IN_DIRECT                1
#define METHOD_OUT_DIRECT               2
#define METHOD_NEITHER                  3

更多关于CTL_CODE宏的信息,参考Defining I/O Control Codes. 

注意IRP_MJ_DEVICE_CONTROL也可以是一个fast I/O操作.当它是一个fast I/O操作时,它总是使用neither I/O,而不管IOCTL的传输类型是什么.更多关于IRP_MJ_DEVICE_CONTROL什么时候可以是一个fast I/O操作的信息,参考可以是IRP-I/O或Fast I/O的操作. 

6. 没有buffer的IRP- I/O操作 

以下IRP-I/O操作没有buffer因此也没有buffering方法: 

· IRP_MJ_CREATE_MAILSLOT 

· IRP_MJ_CREATE_NAMED_PIPE 

· IRP_MJ_LOCK_CONTROL 

七、访问一个I/O操作的User Buffers

一个I/O操作的FLT_PARAMETERS结构包含操作的操作指定的参数,包括buffer地址和操作中使用的一切buffer的MDL. 

对IRP-I/O操作来说,它的buffer可以通过使用以下来指定: 

· 仅MDL (一般为分页I/O) 

· 仅Buffer地址 

· Buffer地址和MDL 

对fast I/O操作来说,只有用户空间buffer地址是指定的. 有buffer的Fast I/O操作总是使用neither I/O因此没有MDL参数. 

下文提供了在minifilter驱动的pre-oper和post-oper callback例程中处理基于IRP和fast I/O的操作的buffer地址和MDL的指导方针: 

1.在pre-oper callback例程中访问User Buffers 

Minifilter驱动的pre-oper callback例程 应按如下方式来对待IRP-I/O操作中的buffer: 

· 检查buffer是否存在一个MDL. MDL的指针可以在操作的参数MdlAddress或OutputMdlAddress中找到. (Minifilter驱动也可以调用FltDecodeParameters来查询MDL指针.) 

· 若此buffer存在一个MDL,就调用 MmGetSystemAddressForMdlSafe来获得buffer的系统地址,然后用这个地址来访问buffer.

· 若此buffer没有MDL,就用buffer地址来访问buffer.要确保一个用户空间的buffer地址是有效的,minifilter驱动必须使用像ProbeForRead 或ProbeForWrite这样的例程,在try/except块中封装所有的buffer引用. 

Pre-oper callback例程应按如下方式来对待fast I/O操作中的buffer: 

· 使用buffer地址访问这个buffer (因为fast I/O操作没有MDL). 

· 要确保一个用户空间的buffer地址是有效的, minifilter驱动必须使用像ProbeForRead 或ProbeForWrite这样的例程,在try/except块中封装所有的buffer引用.

对可以是fast I/O或基于IRP的操作来说,所有的buffer引用都应被封装到try/except块中. 尽管你不必在使用buffered I/O的IRP-I/O操作中这样封装这些引用,但try/except块是一中安全预防措施. 

2.在post-oper callback例程中访问User Buffers

Minifilter驱动的post-oper callback例程 应按如下方式来对待IRP-I/O操作中的buffer: 

· 检查buffer是否存在一个MDL. MDL的指针可以在操作的参数MdlAddress或OutputMdlAddress中找到. (Minifilter驱动也可以调用FltDecodeParameters来查询MDL指针.)

· 若此buffer存在一个MDL,就调用 MmGetSystemAddressForMdlSafe来获得buffer的系统地址,然后用这个地址来访问buffer. (MmGetSystemAddressForMdlSafe可以在 IRQL <= DISPATCH_LEVEL调用.) 

· 若此buffer没有MDL,就用FLT_IS_SYSTEM_BUFFER宏检查此操作有没有设置系统buffer标记. 

o 如果FLT_IS_SYSTEM_BUFFER宏返回TRUE,则此操作使用了buffered I/O,且在DISPATCH_LEVEL可安全地访问该buffer. 

o 如果FLT_IS_SYSTEM_BUFFER宏返回FALSE,则在IRQL = DISPATCH_LEVEL不可以安全地访问该buffer. 如果post-oper callback 例程可以在DISPATCH_LEVEL调用,它必须调用 FltDoCompletionProcessingWhenSafe来pend这个操作直到它可以在IRQL <= APC_LEVEL被处理.被FltDoCompletionProcessingWhenSafe的SafePostCallback参数指向的callback例程应首先调用FltLockUserBuffer来锁住buffer,然后调用MmGetSystemAddressForMdlSafe获得该buffer的系统地址. 

Post-oper callback例程应按如下方式来对待fast I/O操作中的: 

· 使用buffer地址访问这个buffer (因为fast I/O操作没有MDL). 

· 要确保一个用户空间的buffer地址是有效的, minifilter驱动必须使用像ProbeForRead 或ProbeForWrite这样的例程,在try/except块中封装所有的buffer引用. 

· 一个fast I/O操作的post-oper callback例程被担保会在正确的线程上下文中被调用. 

· 一个fast I/O操作的post-oper callback例程被担保会在IRQL <= APC_LEVEL被调用,因此它可以安全地调用像FltLockUserBuffer这样的例程. 

对可以是fast I/O或基于IRP的操作来说,所有的buffer引用都应被封装到try/except块中. 尽管你不必在使用buffered I/O的IRP-I/O操作中这样封装这些引用,但try/except块是一中安全预防措施. 

Minifilter文件系统过滤框架 原理正常的IRP流程是R3 API调用时,会将请求封装成一个IRP经过IO管理器到达文件系统,然后在发往磁盘存储系统,最后到达硬件。使用MiniFilter后会在IO栈中添加MiniFilter管理器。当IRP到达文件系统之前时,首先会被该管理器拦截。管理器会将IRP封装成CALLBACK_DATA,由管理器中存在的多个minifilter驱动依次处理。这些驱动位置是固定的,位置由altitude属 阅读详情

相关推荐

MiniFilter文件过滤(与用户层通信)

minifilter已经不仅封装好了irp,使我们使用时不用注意其底层实现,还封装好了一系列的用户层与驱动层minifilter通信的代码,所以直接按照使用规范调用相应api即可实现与用户层通信。

qq_45844442的博客 728

Minifilter笔记

Minfilter与legacy filter区别 比sfilter加载顺序更易控制. altitude被绑定到合适的位置。 Minfilter在注册表服务项中有一项Altitude值 此值越高位置越靠前 (待考证 每一个minifilter驱动必须有一个叫做altitude的唯一标识符.一个minifilter驱动的altitude定义了它加载时在I/O栈中相对其他minifilter驱动...

kernweak的博客 3554

Win64 驱动内核编程-17. MINIFILTER(文件保护)

MINIFILTER(文件保护)     使用 HOOK 来监控文件操作的方法有很多,可以在 SSDT 上 HOOK 一堆和 FILE 有关的函数,也可以对 FSD 进行 IRP HOOK,不过这些方法既不方便,也不安全。微软推荐的文件操作过滤方法是使用过滤驱动,在 VISTA 之后,推荐使用 MINIFILTER (字面翻译是迷你过滤器)。MINIFILTER 基于标准的文件过滤驱动,但是微软

天使也掉毛 1万+

【亲测免费】 Minifilter: Windows 文件系统过滤驱动的轻量级解决方案

Minifilter: Windows 文件系统过滤驱动的轻量级解决方案 项目简介 是一个开源项目,它提供了一种简单的方法来创建Windows文件系统的过滤驱动程序。作为一个低级别的系统组件,Minifilter允许开发者监控和控制文件操作,如读取、写入、删除和创建等,为各种安全、备份或数据管理应用提供了强大的基础。 技术分析 Minifilter是基于微软的File System Mini-fi...

gitblog_00074的博客 1692

【windows内核驱动开发】文件系统微过滤驱动Minifilter——获取进程信息

【我的】文件系统微过滤驱动Minifilter——获取进程信息 作者:zcr214 时间:2016/4/22   在编写文件系统微过滤驱动minifilter的时候,除了绑定指定的磁盘分卷,对于指定的文件很可能还会有指定的应用程序,例如txt文件可以有很多编辑器可以使用,如wordpad,notepad,sublime,vim,notepad+等,doc文档可以使用office word或W

zcr214的博客 2576

【windows内核驱动开发】文件系统微过滤驱动Minifilter——绑定指定的卷(磁盘分区)

【我的】文件系统微过滤驱动Minifilter——绑定指定的卷(磁盘分区) 作者:zcr214 时间:2016/4/21   在编写文件系统微过滤驱动minifilter的时候,很有可能我们只对某一个特定的磁盘分区感兴趣,而其他的如系统盘的很多IRP对于我们要编写的驱动可能是不关注的,所以有必要使得我们的驱动只绑定指定的这个卷,从而减少其他的IRP带来的干扰,节省很多处理流程,比如系统盘的很

zcr214的博客 4425

文件系统Minifilter驱动

1.Filter管理器和Minifilter驱动架构   Filter管理器是一个内核模式驱动,它遵照legacy文件系统filter模型并暴露了FSFD中必需的一般功能。利用这些功能,第三方开发者可以写minifilter驱动,这样的驱动比legacyFSFD更易于开发,因

pyq881120的专栏 1万+

Win64 驱动内核编程-34.对抗与枚举MiniFilter

对抗与枚举MiniFilter MiniFilter是目前杀毒软件用来实现“文件系统自我保护”和“文件实时监控”的方法。 由于MiniFilter模型简单,开发快捷,通用性好,以前用FSDHOOK或者标准过滤驱动来实现相关功能的杀软纷纷改用MiniFilter,比如卡巴斯基。不过,枚举MiniFilter就跟之前枚举回调的方法不太相同了,因为MiniFilter的...

天使也掉毛 5142

Windows驱动_文件系统微小过滤驱动之一初识MiniFilter

人的一生,就那么几十年,所有的人都无法知道下一刻会发生什么,我们活在当下,只能努力将自己目前的工作或生活过好。船到桥头自然直,况且,自己这么多年,经历了多多少少的风浪太多了,说到底还是不够自信,我应该慢慢改正这个缺点。不要事事都杞人忧天,一定的危机感是需要的,但是千万不要过了。           由于原始的文件系统过滤驱动有一些缺陷,它使用了一些非常规的方法,有些驱动微软都无法做到全部的控

Z18_28_19的专栏 7292

[内核驱动]Minifilter实现文件拒绝访问

基于Minifilter的小小拓展

C0ldstudy的博客 5440

基于微过滤器Minifilter的MiniSpy源码文件过滤驱动

基于文件过滤驱动中minifilter过滤驱动框架开发,可以记录文件所有的操作,保存创建、重命名等,监控所有的I/O操作,包括驱动程序和用户端应用程序源码,对文件系统过滤有很大参考价值。

Windows驱动_文件系统微小过滤驱动之五MiniFilter例程解析

今天,上了下看雪,好久没上去了,现在的看雪,跟之前不一样了,刚毕业的那个时候,上面的大牛真是多,现在屈指可数了,可能这些大牛们,因为年纪的增长,已经不在一线了,或许因为家庭,每时间在论坛上逛了,也许都已经在创业了,现在这个APP泛滥的年代,意念和想法,已经不靠技术了,也没有多少人在研究着技术,目前的中国还是有些浮躁,其实好好想想,现在所有的系统,芯片还是掌握在别人手上,不要谈Android,Win

Z18_28_19的专栏 7355

精选_Minifilter驱动程序与用户层程序通信_源码打包

Minifilter驱动程序与用户层程序通信

MiniFilter文件系统学习

Minfilter与legacy filter区别 比sfilter加载顺序更易控制. altitude被绑定到合适的位置。  Minfilter在注册表服务项中有一项Altitude值 此值越高位置越靠前 (待考证 每一个minifilter驱动必须有一个叫做altitude的唯一标识符.一个minifilter驱动的altitude定义了它加载时在I/O栈中相对其他minifi

zhuhuibeishadiao 1万+

STC8H开发(十六): GPIO模拟SPI驱动Ci24R1实现低成本无线遥控

本文详细介绍了如何使用STC8H单片机通过GPIO模拟SPI驱动Ci24R1无线模块,实现低成本无线遥控方案。内容涵盖硬件设计要点、软件驱动开发技巧及实战优化经验,特别适合消费电子产品开发者参考。Ci24R1凭借其高性价比和双模协议支持,成为替代传统nRF24L01+的理想选择。

weixin_30378623的博客 349

T265摄像头插着开机后,需要重新插拔才能正常启动

T265摄像头插着开机后,需要重新插拔才能正常启动

qq_35598561的博客 1079

Windows文件系统过滤驱动终极指南:MiniFilter文件监控实战解析

Windows文件系统过滤驱动是操作系统内核的关键组件,而MiniFilter驱动作为现代Windows驱动开发的首选框架,为开发者提供了高效、灵活的文件系统监控与过滤能力。本文将带你从零开始掌握MiniFilter技术,通过实战案例理解其核心原理与应用场景,让你快速上手开发自己的文件监控解决方案。 ## 为什么选择MiniFilter驱动? 传统文件系统过滤驱动开发复杂且兼容性差,而微软推出

gitblog_00701的博客 1077

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据一,Xilinx BRAM介绍二,BRAM对应的IP核调用和使用1,BRAM对应的IP核介绍2,BMG例化IP核的调用 一,Xilinx BRAM介绍 BRAM 就是Block Memory,是Zynq的PL端的存储RAM单元。可以利用BRAM,在PS和PL之间进行数据的交换。Zynq中还有一类存储器,称为分布式随机访问存储器(D...

weixin_43941525的博客 3万+

inf文件安装Minifilter驱动

本系列文章源于WDK,所有权利归原作者所有,翻译的目的只为交流和学习。除了商用你可以随意地使用这篇译文。但请不要删除声明。    ——by jununfly 一个文件系统minifilter驱动的INF文件一般包含以下部分: 1.Version (必需的) 版本部分指定由minifilter驱动的类型决定的一个类和GUID,如下例. [Version] Signature   =

天道酬勤! 4654

Red Hat Enterprise Linux 9.2

安装Red Hat Enterprise Linux 9.2

zhurobert的博客 942

腾讯滑块验证码collect参数逆向与JSVMP对抗实战

本文深入解析腾讯滑块验证码collect参数的逆向过程与JSVMP虚拟机对抗技术。通过详细的环境搭建、抓包分析和JSVMP逆向技巧,揭示collect参数的生成逻辑与加密流程,并提供完整的模拟实现方案和常见问题排查方法,助力开发者突破腾讯天御验证码的防护机制。

weixin_29009501的博客 1576
上一篇: 文件系统Minifilter驱动(八)
下一篇: 文件系统Minifilter驱动(十)
jununfly
博客等级 码龄19年 41粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值