Minifilter过滤命名管道和邮槽的一些问题

本文探讨了在Windows 8及更高版本操作系统中,通过使用FLTFL_REGISTRATION_SUPPORT_NPFS_MSFS标志,如何利用minifilter驱动的IRP_MJ_CREATE和IRP_MJ_CREATE_NAMED_PIPE操作来有效监控命名管道的创建和连接事件。文中详细展示了代码示例,解释了如何注册回调函数以跟踪特定管道名称的活动。

最近有个需求需要监控管道的链接,IRP_MJ_CREATE过滤不到管道的创建和链接。

注册的IRP_MJ_CREATE_NAMED_PIPE这个irp的回调也一直不被调用。

OSR上老外也提了类似的问题:

  • https://community.osr.com/discussion/239743/can-a-minifilter-filter-a-non-file-devices-irps
  • https://community.osr.com/discussion/171174
  • https://community.osr.com/discussion/247489

最后一个OSR上的问题,老外提到了微软的minispy中的部分代码,这个代码是用在注册Filter的时候填写在 FLT_REGISTRATION结构中的flag,这个flag从Win8才开始支持!

在这里插入图片描述
后来也搜到了两篇文章,介绍了Win8的新特性,其中就提到了开始支持过滤命名管道和邮槽,也证明了上面老外提到的这件事。

  • http://fsfilters.blogspot.com/2011/09/whats-new-in-win8-for-file-system.html
  • http://fsfilters.blogspot.com/2014/01/getting-started-with-windows-file_23.html

下面是我写的minifilter代码,用来过滤创建或打开的管道名是wdy就把管道名和当前进程名字打印出来。

代码中注册了下面两个IRP的回调函数:

  • IRP_MJ_CREATE
  • IRP_MJ_CREATE_NAMED_PIPE

最终结果显示,当使用了FLTFL_REGISTRATION_SUPPORT_NPFS_MSFS 这个flag时,

IRP_MJ_CREATE可以监控到打开管道名为wdy的事件
IRP_MJ_CREATE_NAMED_PIPE可以监控到创建管道名为wdy的事件

这个验证结果和《Windows内核原理与实现》书中8.3节介绍的一样
在这里插入图片描述

当不使用FLTFL_REGISTRATION_SUPPORT_NPFS_MSFS属性时,两个IRP都监控不到管道的创建和打开。

微软官方对这个属性的介绍:

  • https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/fltkernel/ns-fltkernel-_fl
你的观点被被人反驳了:这个观点忽略了一个至关重要的“桥梁”:Windows统一的I/O模型FltMgr的“全局视野”。 1. 统一的入口:CreateFile 在Windows中,无论是打开一个文件(CreateFile("C:\test.txt"))还是打开一个硬件设备(CreateFile("\\?\USB#VID_046D&PID_0825#...")),在用户层都调用同一个API:CreateFile。 在内核层,无论目标是文件还是设备,CreateFile调用最终都会生成一个主要功能码为IRP_MJ_CREATE的I/O请求包(IRP)。 这是关键的第一步:应用程序对摄像头的“打开”操作,对文件的“打开”操作,在内核层面被抽象成了同一种类型的请求。 2. FltMgr的“越界”能力 FltMgr(文件系统过滤管理器)虽然名字里有“文件系统”,但它在I/O路径中的位置非常核心,拥有拦截所有IRP_MJ_CREATE请求的能力,而不仅仅是发往文件系统的请求。 当你注册一个Minifilter并声明你对IRP_MJ_CREATE感兴趣时,FltMgr会为你设置一个全局的钩子。这意味着: 当一个IRP_MJ_CREATE的目标是C:\test.txt时,它会经过你的回调。 当一个IRP_MJ_CREATE的目标是\\?\USB#VID_...摄像头设备时,它同样会经过你的回调。 这是关键的第二步:Minifilter的拦截范围超出了其“名字”所暗示的范围,它实际上能“看到”所有创建操作。 3. 智能的名称解析:FltGetFileNameInformation 在PreCreate回调中,我们如何知道这个IRP_MJ_CREATE是发给文件还是设备呢?FltGetFileNameInformation函数为我们解决了这个问题。 如果IRP是发给文件系统的,它会返回文件名(如\Users\Public\Videos\sample.mp4)。 如果IRP是发给摄像头这样的设备,它会尽力去解析并返回设备的名称或符号链接(如\Device\USBPDO-3)。
最新发布
11-07
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值