前一段时间在做一个文件过滤系统, 为了配合公司的产品使用,希望对指定目录禁止访问。一开始使用的是sfilter的框架,很多事情需要自己做,创建过滤驱动的控制设备,创建符号链接,设置IRP例程,设置FAST I/O例程,用这个框架做了一半,与应用层通讯比较麻烦,就又去学习了Minifilter框架,这个框架就非常简单了,就是自由度没有sfilter那么大,不过跟老大沟通之后,发现本次需求对边界问题要求比较模糊,就决定使用Minifilter了。
使用Minifilter开发真的方便太多了,我用的是vs2015+WDK10,用VS2015生成项目之后,就会发现所有的例程编译器都帮你绑定好了,你只需要在目的位置添加一些代码就可以搞定,关于与应用层的通讯更是简单,不需要应用层发IRP了,直接建立一个端口通讯,应用层和驱动层保持端口名一致即可。两天就全部搞定了。
这次的拦截操作我在 IRP_MJ_CREATE 请求之前做的。看下微软对这个IRP请求的解释。
I/O管理器会在一个新的文件或目录被创建,或者已存在的文件、设备、目录、卷,被打开的时候发生这个请求。
The I/O Manager sends the IRP_MJ_CREATE request when a new file or directory is being created, or when an existing file, device, directory, or volume is being opened.
也就是说,不管是新建还是打开文件或目录,都会被我的过滤器捕捉到,可以说对操作的捕捉是很完善了。之前我在IRP_MJ_DIRECTORY_CONTROL这个IRP请求发生的时候做的拦截,后来发现使用cmd不能进入目录,但是可以在禁止访问目录的父目录打开目标目录中的文件,比如禁止了FileDriver目录后,直接在父目录使用FileDriver/123.txt 就会打开123.txt,但是现在不会出现这种情况了
这里分享一下相关代码,我是应用层发送路径给驱动层,然后驱动层用链表保存下来,每次I/O操作之前,都去遍历链表里的路径,只要匹配成功就返回没有权限访问,否则IRP继续下发。
————————————————
版权声明:本文为CSDN博主「poison___」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33504040/article/details/78458958