欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]让你在日常的Windows驱动开发工作中更好地使用MiniFilter的编程知识。

[原创]让你在日常的Windows驱动开发工作中更好地使用MiniFilter的编程知识。


  在日常的Windows驱动程序开发工作中,有的时候,你可能需要根据人们的一些需求来,隐藏指定目录下的某种格式的文件。很多人会突发奇想,用各种方法来解决问题。
  为了更好、更灵活地使用MiniFilter的知识来开发Windows文件系统过滤驱动程序。我给出了一个代码示例,来帮助大家学习。
  我写这篇文章目的,不是让你特地去绕过某些杀毒软件、安全软件。而是为了让你更好地理解和使用MiniFilter的知识。
  附件带有一个完整的代码工程,可下载,编译,并立刻使用。
  此Window驱动程序的功能是:
使用MiniFilter文件过滤驱动来隐藏文件。设置应用层指定的文件目录下的某一种类型格式的文件隐藏。使Explorer.exe等应用程序都看不见它们。
  比如:某一个文件目录下,有DOC、EXE、TXT、DLL等等类型的文件。
  假设指定隐藏txt文件类型,那么这个目录下的所有txt文件都会被隐藏,而其它类型的文件DOC、EXE、DLL都不隐藏。
本驱动可以编译通过,立刻使用到您的工程项目里面。
这个驱动程序支持:
Windows XP
32位Windows 7
64位Windows 7
32位Windows 8
64位Windows 8
32位Windows 8.1
64位Windows 8.1
开发环境:
(1)Visual Studio 2008、WDK7600    用这个环境主要是为了支持XP和Win7
(2)Visual Studio 2013、WDK8.1     用这个环境主要是为了支持Win7、Win8、Win8.1
如何测试这个驱动程序:
首先鼠标右击passThrough.inf文件,安装上驱动程序passthru.sys。而不是使用驱动加载工具来安装passthru.sys。
在Windows命令行cmd方式下输入:net start passthru  这样就开启了服务。然后你再运行编译好的应用层程序。这样就可以看见效果了。
当停止服务的时候,就输入:    net stop passthru
===========================================================================================================================
代码实现的基本思想:
应用层:
代码实现很简单,就是和驱动层通信。各位看学论坛的童鞋,都能看得懂。代码量很少,不做解释。
驱动层:
因为要用MiniFilter来编写代码实现这样的功能。因此,需要处理 IRP_MJ_DIRECTORY_CONTROL的相关操作。
因此使用了PtPostDirCtrlPassThrough函数来处理IRP_MJ_DIRECTORY_CONTROL的相关操作。
FLT_POSTOP_CALLBACK_STATUS
PtPostDirCtrlPassThrough (  __inout PFLT_CALLBACK_DATA Data,
                            __in PCFLT_RELATED_OBJECTS FltObjects,
                            __in_opt PVOID CompletionContext,
                            __in FLT_POST_OPERATION_FLAGS Flags
                         )
如何过滤呢??
  在WindowsXP及其以下版本,需要过滤 FileBothDirectoryInformation 类型的信息
if(Data->Iopb->Parameters.DirectoryControl.QueryDirectory.FileInformationClass == FileBothDirectoryInformation)
{
  ........//省略代码
}
  在Windows Vista或Windows7或更高版本的Windows的操作系统,它们返回的结构不再是FileBothDirectoryInformation. 而是FileIdBothDirectoryInformation
if(Data->Iopb->Parameters.DirectoryControl.QueryDirectory.FileInformationClass ==FileIdBothDirectoryInformation)
{
       
........//省略代码
}
具体可见PtPostDirCtrlPassThrough 函数的代码实现。
驱动程序使用了内核链表来管理文件目录。
当你添加了要隐藏的指定格式的文件扩展名时,
假设你在应用层调用:MyAddProtectPath(L"C:\\test*", L"*.txt*");
那么,C:\test目录下,所有txt类型的文件被隐藏。
那么在内核中,对应的AddNameToWhiteNameList函数被调用。
驱动程序调用ExAllocatePoolWithTag函数动态分配一个内存空间,做为链表的一个结点。
接着保存字符串C:\test和字符串txt,然后把这个结点插入到链表里面。
若字符串C:\test和字符串txt已经在链表中了,那么就不需要再新申请链表结点。IsNameInWhiteNameList函数就是用来做这个判断的。
反过来,
当你在应用层调用:MyDelProtectPath(L"C:\\test*")的时候,取消隐藏C盘test目录下的扩展名为 .txt的所有文件。
那么在内核中是调用DelNameFromWhiteNameList()来执行相应的动作。

代码
用MiniFilter来隐藏指定类型的文件.rar
祝大家学习快乐!

上传的附件 用MiniFilter来隐藏指定类型的文件.rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功