sfilter流程浅析

Sfilter过滤驱动框架 原理Sfilter是设备栈绑定的形式绑定的,驱动自己生成一个设备(过滤设备对象),调用系统提供的绑定API,绑定到目标设备上。并返回一个在未绑定之前目标设备所在设备栈的最顶层设备。这样发往下层的IRP或者发往上层的数据都会被过滤设备截获。实现绑定API: IoAttachDevice() IoAttachDeviceToDeviceStackSafe(2000 SP4以及XP以上) IoAtt 阅读详情

基本思路其实不复杂,sfilter先创建一个control device object,用于接受应用程序的控制,然后创建多个device object,绑定到文件系统驱动的device object上(譬如NTFS,FAT,CDFS,等等),这里要注意不要绑到文件系统识别器(file system recognizer)上,它是用来加载真正的文件系统驱动程序的。
绑定完文件系统驱动的device object后,sfilter就可以收到发给各个文件系统驱动程序的irp了,这样你可以在windows要求文件系统装配各个卷的时候获得消息,然后你就可以得到文件系统为各个卷所创建的device object,然后再创建device object,绑定到这些volumn object上,下面的工作就是用你的FiDO过滤发往各个卷的irp,取得文件名称及其操作,进行判断,如果是对敏感文件的操作,fail掉该irp,这样就可以了。

第一步:创建CDO,这是在DriverEntry里:
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{

    ……

    // Create the Control Device Object(CDO).  This object represents this
    // driver.  Note that it does not have a device extension.
    RtlInitUnicodeString(&wstrName, L"//FileSystem//Filters//SFilter");
    ntStatus = IoCreateDevice(pDriverObject,
                              0,                      //has no device extension
                              &wstrName,
                              FILE_DEVICE_DISK_FILE_SYSTEM,
                              FILE_DEVICE_SECURE_OPEN,
                              FALSE,
                              &gSFilterControlDeviceObject);
    ……
}

第二步,绑定各个文件系统的DO,这是在SfAttachToFileSystemDevice里完成的:
(这里有一个小tips,就是windows提供了一个函数IoRegisterFsRegistrationChange,用来注册文件系统的通知,这样当新的文件系统驱动程序load进来的时候你可以得到通知,有机会去绑定它,俺们不放过任何一个文件系统哈哈)
NTSTATUS SfAttachToFileSystemDevice(IN PDEVICE_OBJECT DeviceObject, IN PUNICODE_STRING DeviceName)
{
    ……

    // We want to attach to this file system.  Create a new device object we can attach with.
    ntStatus = IoCreateDevice(gSFilterDriverObject,
                             sizeof(SFILTER_DEVICE_EXTENSION),
                             NULL,
                             DeviceObject->DeviceType,
                             0,
                             FALSE,
                             &newDeviceObject);
    if(!NT_SUCCESS(ntStatus))
{
        return ntStatus;
    }

    ……

        // Do the attachment
    devExt = newDeviceObject->DeviceExtension;
    ntStatus = SfAttachDeviceToDeviceStack(newDeviceObject,
                                          DeviceObject,
                                          &devExt->AttachedToDeviceObject);
    if(!NT_SUCCESS(ntStatus))
{
        goto ErrorCleanupDevice;
    }

    ……

}


第三步:绑定完了文件系统,下面就是坐等irp上门报道了,因为是文件系统,所以我们只对IRP_MJ_FILE_SYSTEM_CONTROL消息感兴趣,对它的处理在SfFsControl里进行:
NTSTATUS SfFsControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);

    PAGED_CODE();

    // Sfilter doesn't allow handles to its control device object to be created,
    // therefore, no other operation should be able to come through.   
    ASSERT(!IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject));
    ASSERT(IS_MY_DEVICE_OBJECT(DeviceObject));

    // Process the minor function code.
    switch(irpSp->MinorFunction)
{
        case IRP_MN_MOUNT_VOLUME:
            return SfFsControlMountVolume(DeviceObject, Irp);  //收到装配卷的请求

        case IRP_MN_LOAD_FILE_SYSTEM:
            return SfFsControlLoadFileSystem(DeviceObject, Irp);

        case IRP_MN_USER_FS_REQUEST:
        {
            switch(irpSp->Parameters.FileSystemControl.FsControlCode)
{
                case FSCTL_DISMOUNT_VOLUME:
                {
                    PSFILTER_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension;

                    SF_LOG_PRINT(SFDEBUG_DISPLAY_ATTACHMENT_NAMES,
                                 ("SFilter!SfFsControl:                         Dismounting volume         %p /"%wZ/"/n",
                                   devExt->AttachedToDeviceObject,
                                   &devExt->DeviceName));
                    break;
                }
            }
            break;
        }
    }       

    // Pass all other file system control requests through.
    IoSkipCurrentIrpStackLocation(Irp);
    return IoCallDriver(((PSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp);
}

最后一步就是挂接文件系统所装配的所有卷了,这里有两种,一是sfilter挂接到文件系统上去的时候,文件系统已经装配好的卷,还有就是之后装配的卷。后者我们可以在SfFsControlMountVolume里轻松搞定,前者就需要主动去枚举了,这个用SfEnumerateFileSystemVolumes来完成。就不贴代码了,sfilter里有,可以自己找来看。 

废掉Minifilter和Sfilter 支持x64 在学习Minifilter和sfilter后明白了一点,这两个文件过滤都是attach到设备上 那么我们废掉的方法就很明显了,将文件系统上attach的所有设备清零 怎么得到attach的所有设备呢? 我们通过ObReferenceObjectByName或得到文件驱动对象地址 得到的对象中有一个成员DeviceObject就得到了文件设备对象 这里还有一个链表,保存着下一个对象 阅读详情

相关推荐

学习STM32的流体水位传感器

引言: 流体水位传感器是一种常用于测量液体水位的设备,广泛应用于水位监测、液位控制和流量计量等领域。STM32是一款功能强大的单片机,具有丰富的外设和灵活的编程能力,非常适合用于流体水位传感器的开发。本文将介绍如何使用STM32开发板与流体水位传感器进行连接和通信,并通过编写代码实现水位的测量和显示。五、总结: 通过以上的代码示例,我们可以实现使用STM32开发板与流体水位传感器进行连接和通信的功能。三、编写代码: 以下是使用STM32CubeIDE编写的示例代码,实现了读取流体水位传感器的功能。

xiaoalla的博客 740

Excel中系数变异CV实战指南:跨量纲数据稳定性分析

系数变异(CV)是一种关键的相对离散程度度量,用于消除量纲与均值规模差异带来的干扰,使不同单位、不同量级的数据具备可比性。其核心原理是标准差与算术平均值的比值,本质是将绝对波动转化为相对于基准水平的百分比风险。在质量控制、金融风控、制造良率分析等场景中,CV能有效识别工艺异常、评估业务稳定性、支撑GMP合规审计等高价值决策。尤其适用于Excel环境下的业务人员与工程师,结合STDEV.P/STDEV.S选择、零均值防护、偏态数据鲁棒替代等实操要点,真正实现从公式计算到业务解读的闭环。本文聚焦CV在真实工业与

anjichan4261的博客 532

YOLOv8中Anchor-Based、Anchor-Free及样本分配策略

本文主要介绍yolov8中的anchor机制与样本分配策略的静态策略和动态策略

qq_52889317的博客 2211

SFilter框架理解

控制设备(接受我们自己的客服端)----过滤设备(接受别的进程的IRP) IRP栈每层对应的设备不同   绑定后返回的:最顶层的设备 看图 为什么返回最顶层,当我们的设备处理好后要发给下面的 而下面的第一个就是最顶层的设备 看图理解 过滤 分层驱动中再加一层而不影响它的上下层,以过滤它们之间的数据,对数据或行为进行安全控制。过滤是通过设备绑定实现的。 图:

zhuhuibeishadiao 8541

Ansys Lumerical | 薄膜铌酸锂电光调制器的仿真与优化

本文详细介绍了使用Ansys Lumerical进行薄膜铌酸锂电光调制器仿真与优化的全流程。从基础原理到电学仿真、光学模拟技巧,再到设计优化实战经验,帮助工程师掌握这一先进光电器件的仿真方法。重点解析了薄膜铌酸锂的Pockels效应和Mach-Zehnder结构设计,并提供了常见问题排查指南和最新发展动态。

vulkan6gpu的博客 1199

微信小程序 - 接入腾讯地图 SDK 及详细使用教程,结合小程序 mpa 地图组件展示腾讯地图(基础使用 / 授权当前位置 / 配合小程序map组件的使用 / 腾讯地图逆地址解析 / 坐标系的转化)

微信小程序使用腾讯地图完整流程,微信小程序 接入腾讯地图,如何在微信小程序中接入腾讯地图,微信小程序引入腾讯地图API方法,腾讯地图小程序SDK,微信小程序实现使用腾讯地图SDK步骤详细介绍,微信小程序接入腾讯地图(线路规划、逆解析)、高德地图,微信小程序之使用腾讯地图,微信小程序 接入第三方地图,小程序服务器配置地图,微信小程序接入腾讯地图,微信小程序插入腾讯地图教程,微信小程序如何调用腾讯地图,如何在微信小程序中接入腾讯地图,微信小程序腾讯地图SDK使用方法,在微信小程序上创建一个简单的腾讯地图,微信小

✅ 精选推荐文章 1万+

文件,注册表过滤--Sfilter、Minifilter

本公众号分享的所有技术仅用于学习交流,请勿用于其他非法活动,如有错漏,欢迎留言交流指正 文件,注册表过滤 分层驱动框架 NT驱动框架:单层驱动,只能接受自己进程的IRP Sifileter驱动框架:多层驱动,接受所有进程的IRP 过滤:分层驱动中再加一层而不影响它的上下层,以过滤它们之间的数据,对数据或行为进行安全控制。过滤是通过设备绑定实现的(有多少个文件卷设备就生成多少个文件过滤驱动设备对象一一绑定,这样,发给各个卷设备对象的IRP都会被监控到)。 磁盘过滤驱动:用于文件还原 绑定与..

2570

【DaVinci Configurator专题】-2-将CAN 2.0或CANFD Matrix的Arxml/DBC文件导入到CFG

共9页 目录 1 打开DaVinci Configurator,导入Arxml文件 2 解决导入Arxml文件后可能会出现的一些错误 3 验证CFG的配置 4 根据CFG的配置生成代码 5 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键词: Open the Input Files Assistant Complete update process Update ECU configurati

「汽车电子助手」的博客 6127

sfilter

整理自:http://topic.youkuaiyun.com/t/20060629/11/4849948.html 好资料如下:     书:Windows   NT   File   System   Internals,IFS   DDK文档。     零碎资料:驱动开发网,OSR(它的新闻组很赞),sysintels.com,以及DDK的源代码。         最后

sunhf_my的专栏 2322

YOLOv8+BiFPN双向特征金字塔:多尺度目标检测精度提升28%的实战教程

双向特征金字塔网络(BiFPN)是一种强化多尺度特征融合支持“自顶向下+自底向上”的双向特征流动,同时保留不同尺度的细节信息;引入加权融合机制,自动学习不同特征的重要性权重;裁剪冗余节点,在轻量化的同时提升融合效率。

m0_64661770的博客 492

036、算子映射:如何将ONNX算子映射到NPU硬件指令?

《算子映射:ONNX到NPU的转换艺术》 本文深入探讨了将ONNX算子映射到NPU硬件指令的技术挑战与实践经验。作者通过真实案例揭示了映射过程中的常见陷阱,如Reshape算子被错误映射导致分类错误。文章详细分析了三种映射策略(直接映射、拆分映射和融合映射),并强调映射表在编译器中的核心作用。特别针对动态形状、精度对齐等难题提供了解决方案,分享了编写映射表时的实用铁律,包括先优化后映射、严格单元测试等。最后指出,成功的算子映射需要在数学语义、硬件约束和性能优化之间找到精确平衡,这种看似枯燥的工作实则决定着N

m0_50546716的博客 191

Sfilter过滤

文件监控技术分为hook,过滤,回调。 文件监控系统就是绑定和过滤,进程的各种操作被封装成一个IRP,再发给驱动的设备对象,驱动的设备对象通过各种分发函数处理操作,过滤就是在设备对象上面再绑定一个新的设备对象,先经过我们的设备对象。在去原来的设备对象。 分层驱动框架与过滤 irp从上往下经过不同设备栈,先经过文件过滤驱动设备(由文件过滤驱动创建),文件卷设备(盘符C盘D盘这些),磁盘设备...

kernweak的博客 1073

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

内核驱动文件重定向(SFILTER)

最近学习了下内核驱动中的文件重定向。现在总结一下,希望对大家有用 最近几天将附加上MINIFILTER重定位代码(已加) 以及附上完整的将指定文件重定位到内存中的实验代码 额 其实不是想吸引眼光 所以强调下只是实验代码 重定向,字面即为对某A文件的操作直接转移到B文件。比如读、写 、设置长度或文件结尾指针等属性、甚至是删除操作。 内核驱动中文件重定向主要用于...

angzhang6187的博客 852

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

sfilter动态加解密吐血总结

晕了好几天,总算把Ifs的动态加解密给闹明白了。为了后来者不再晕,总结如下:1.加密在SfWrite(IRP_MJ_WRITE)中,而不是完成例程,解密在SfRead(IRP_MJ_READ)中,而不是完成例程,3.只要处理IRP_NOCACHE|IRP_PAGING_IO|IRP_SYNCHRONOUS_PAGING_IO2.加密简单过程:a.得到Windows传下来的Buffer Addres

不论你在什么时候开始,重要的是开始之后就不要停止。 854

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

文件系统过滤驱动sfilter

标 题: 【分享】整理一份我对Windows文件系统过滤驱动的sFilter工程代码的详细说明 作 者: tianhz 时 间: 2012-06-19,18:32:07 链 接: http://bbs.pediy.com/showthread.php?t=152338 我平时很忙,很少发表主题。我在工作的时候,我身边的很多同事都不停地问我有关Windows文件系统过滤驱动的问题。他...

sunr. 1349

sfilter.inf 修改

基于sfilter改的过滤驱动,想把它改个名称。结果就BSOD了。 做了如下修改: 1、把sfilter的地方都修改为processmon.(注意LoadOrderGroup   = "FSFilter  Activity Monitor"  ,这里的FSFilter不是sfilter)。 2、修改了provider和时间等信息。 结果发现直接蓝屏了,挨个试了一下。发现只要

trents的专栏 1438

sfilter和应用层通讯处理

基于sfilter修改的磁盘过滤驱动,在应用层和驱动进行通讯时,在调用CreateFile时会返回Errorcode 1,原因是对sfilter本身对sfCreate做了处理,不允许对自身对象进行操作。 sfilter的sfCreate代码如下: ... if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) {         //

trents的专栏 1565

Sfilter之Windows2000动态加载经验分享

前提 安装Windows 2000 Service Pack 4 安装Update Rollup for Windows 2000 Service Pack 4 即这个补丁Windows2000-KB891861-v2-x86-CHS.EXE这个前提要求应该不过分1.将原来只会在XP以上因为动态加载才会使用的gSfDynamicFunctions从条件编译中提取出来   _SF_DYNAMIC_F

1393

sfilter 中如何判断当前的IRP是否来自网络?

再仍一块砖头,sfilter 中如何判断当前的IRP是否来自网络?:如何从IrpStackLocation中判断来自网络的文件访问?//---------------------------------------------------NTSTATUS status;PACCESS_TOKEN pToken = NULL;PTOKEN_SOURCE pTokenSrc = NULL ;PSECU

乱弹斋 1365

编译 sfilter 出现的问题与解决

一般情况下,对于MS 提供的的文件系统的框架,它对于一些东西已经进行了封装,做成了一个静态库的形式,方便我们的调用,但是,今天想在这个框架下加入我们自己的功能代码,实现一些其他的功能的时候,发现了编译老是出错。。。网上查了好久也没有具体的解决方案,所以只有自己去看WDK 的开发文档了,根据文档的介绍,在对sfilter进行编译前,应该首先对lib 文件进行编译,不如在编译sfilter的时

xum2008的专栏 1327

Sfilter在Win2000下动态加载的实现

        Sfilter是MS提供的一个例子文件系统过滤驱动程序。在IFS Kit中可以找到源代码。在系统安全等相关方面等用得很多了,例如 文件的透明加密解密,只允许特定的进程访问特定的文件。Sfilter可以在XP,20003中动态加载,在2000下确不可以。通过如下的代码可以实现在2000下的动态加载。 有两种方法可以实现。第一种是首先获得文件系统驱动DRIVER_OBJECT的指针

不论你在什么时候开始,重要的是开始之后就不要停止。 1047

sfilter文件驱动(二)--文件的关联

前面说了关于sFilter的设备的挂载,主要是针对DeviceObject, 通过将驱动创建多个过滤设备,挂载到系统的卷设备上, 系统就会将所有到该卷的IRP操作都重定向到我们的驱动派遣函数中         接着,我们这里要分析关于针对文件的操作了,经过几天的研究,发现了几个有趣的地方,首先了解下大致的流程。 IRP_MJ_CREATE: 创建文件例程 首先,我们操作文件的时候,都要先打开

jimk1983的专栏 565

整理一份我对Windows文件系统过滤驱动的sFilter工程代码的详细说明(精华侨)

标 题: 【分享】整理一份我对Windows文件系统过滤驱动的sFilter工程代码的详细说明 作 者: tianhz 时 间: 2012-06-19,18:32:07 链 接: http://bbs.pediy.com/showthread.php?t=152338 我平时很忙,很少发表主题。我在工作的时候,我身边的很多同事都不停地问我有关Windows文件系统过滤驱动的问题。他们中

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 6384
上一篇: MFC控制条窗口布局原理(上)
下一篇: 2007学习计划
会思考的草
博客等级 码龄25年 208粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值