当前位置: 首页 > news >正文

MiniFilter文件过滤

文章目录

  • 概述
  • 注意事项
  • 代码
  • 参考资料

概述

MiniFilter文件过滤驱动整体代码都比较死板,没有太多的流程内容,它的建立本质也是为了方便处理IRP请求,通过注册相应的前回调和后回调以对相应的文件做过滤操作处理,以下代码示例为阻止一个名为name.txt文件的写入操作

注意事项

使用inf配置文件,需要将Class、ClassGuid、Altitude等属性设置一下,随后将其与sys放在一起安装后,使用命令net start ServiceName 和 net stop ServiceName 进行启用和关闭服务,其中ServiceName 为创建的服务名

代码

#include <fltKernel.h>
#include <dontuse.h>FLT_POSTOP_CALLBACK_STATUS MiniPostCreate(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FlstObjects, PVOID* CompletionContext, FLT_POST_OPERATION_FLAGS flags);
FLT_PREOP_CALLBACK_STATUS MiniPreCreate(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FlstObjects, PVOID* CompletionContext);
FLT_PREOP_CALLBACK_STATUS MiniPreWrite(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FlstObjects, PVOID* CompletionContext);
NTSTATUS MiniUnload(FLT_FILTER_UNLOAD_FLAGS Flags);const FLT_OPERATION_REGISTRATION Callbacks[] = {{IRP_MJ_CREATE,0,MiniPreCreate,MiniPostCreate},{IRP_MJ_WRITE,0,MiniPreWrite,NULL},{IRP_MJ_OPERATION_END}
};FLT_REGISTRATION registration = { sizeof(FLT_REGISTRATION),FLT_REGISTRATION_VERSION,0,NULL,Callbacks,MiniUnload,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL };
PFLT_FILTER retfilter = NULL;NTSTATUS MiniUnload(FLT_FILTER_UNLOAD_FLAGS Flags)
{KdPrint(("过滤驱动已卸载!\n"));FltUnregisterFilter(retfilter);return STATUS_SUCCESS;
}FLT_POSTOP_CALLBACK_STATUS MiniPostCreate(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FlstObjects, PVOID* CompletionContext,FLT_POST_OPERATION_FLAGS flags)
{KdPrint(("Create File Post\r\n"));return FLT_POSTOP_FINISHED_PROCESSING;
}FLT_PREOP_CALLBACK_STATUS MiniPreCreate(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FlstObjects, PVOID* CompletionContext)
{PFLT_FILE_NAME_INFORMATION filenameinfo = { 0 };WCHAR Name[260] = { 0 };NTSTATUS status = FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_DEFAULT, &filenameinfo);if (NT_SUCCESS(status)){status = FltParseFileNameInformation(filenameinfo);if (NT_SUCCESS(status)){if (filenameinfo->Name.MaximumLength < 260){RtlCopyMemory(Name, filenameinfo->Name.Buffer,filenameinfo->Name.MaximumLength);KdPrint(("Create File :%ws \r\n", Name));}}FltReleaseFileNameInformation(filenameinfo);}return FLT_PREOP_SUCCESS_WITH_CALLBACK;
}FLT_PREOP_CALLBACK_STATUS MiniPreWrite(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FlstObjects, PVOID* CompletionContext)
{PFLT_FILE_NAME_INFORMATION filenameinfo = { 0 };WCHAR Name[260] = { 0 };NTSTATUS status = FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_DEFAULT, &filenameinfo);if (NT_SUCCESS(status)){status = FltParseFileNameInformation(filenameinfo);if (NT_SUCCESS(status)){if (filenameinfo->Name.MaximumLength < 260){RtlCopyMemory(Name, filenameinfo->Name.Buffer, filenameinfo->Name.MaximumLength);_wcsupr(Name);if (wcsstr(Name, L"NAME.TXT") != NULL){//锁定目标文件写入操作KdPrint(("Block File Name:%ws\r\n",Name));Data->IoStatus.Status = STATUS_INVALID_PARAMETER;Data->IoStatus.Information = 0;FltReleaseFileNameInformation(filenameinfo);return FLT_PREOP_COMPLETE;}KdPrint(("Write File :%ws \r\n", Name));}}FltReleaseFileNameInformation(filenameinfo);}return FLT_PREOP_SUCCESS_NO_CALLBACK;
}NTSTATUS DriverEntry(PDRIVER_OBJECT Driverobject, PUNICODE_STRING RegistryPath)
{NTSTATUS status = STATUS_SUCCESS;status = FltRegisterFilter(Driverobject, &registration, &retfilter);if (NT_SUCCESS(status)){status = FltStartFiltering(retfilter);if (!NT_SUCCESS(status)){FltUnregisterFilter(retfilter);}}return status;
}

参考资料

File System Filter - Minifilter


http://www.mrgr.cn/news/83262.html

相关文章:

  • 实战篇: BiLSTM+CRF实现中文分词
  • Kotlin语言的循环实现
  • (2023|NIPS,LLaVA-Med,生物医学 VLM,GPT-4 生成自指导指令跟随数据集,数据对齐,指令调优)
  • JS BOM详解
  • Nginx入门笔记
  • laravel 批量更新:‌INSERT ... ON DUPLICATE KEY UPDATE
  • 静态路由配置与调试——计算机网络实训day1
  • [QCustomPlot] 交互示例 Interaction Example
  • SAP-FICO 标准价格与移动平均价格
  • NLP中常见的分词算法(BPE、WordPiece、Unigram、SentencePiece)
  • 音频数据增强:提升音频信号质量的多种技术
  • Open WebUI 与 AnythingLLM 安装部署
  • Docker compose 使用 --force-recreate --no-recreate 控制重启容器时的行为
  • Python 的网页自动化工具 DrissionPage 介绍
  • 互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅
  • 【没能解决】虚拟机不能进入图形界面问题
  • 安卓硬件加速hwui
  • js实现一个可以自动重链的websocket客户端
  • 【ASP.NET学习】ASP.NET MVC基本编程
  • LSKNet 训练测试 (在容器实例中)
  • 数值分析速成复习笔记
  • 【STM32】无源蜂鸣器播放音乐《千与千寻》,HAL库
  • QThread多线程详解
  • Android原生开发同一局域网内利用socket通信进行数据传输
  • 金山WPS Android面试题及参考答案
  • G1垃圾回收器的FullGC