100分求教 minifilter文件驱动开发 关于irp_mj_create 获取信息疑问?

时间:2023-01-25 18:25:54
各位大虾:
小弟最近在研究 minifilter 文件过滤驱动开发 有个疑问 望各位给予解惑 谢谢!!
如果可以能加QQ便于交流 更加感谢 谢谢!
问题如下:
``````````````````````````````````````````````````````````````````````````````````````````````
我在驱动中过滤所有涉及到IRP_MJ_CREATE 的文件操作 但出现这样状况:
我的期望预见的是:
例  我打开一个 任意文件(比如 test.txt)我只要截取test.txt 这个有IRP_MJ_CREATE 的操作文件
```````````````````````````````````````````````````````````````````````````````````````````````
但是我获取的是 包含了很多的 库文件 exe 等等文件 (100+ 多个有IRP_MJ_CREATE 操作的文件)
这个我到明白 是在进行打开 test.txt 文件时 系统内部进行的加载活动 (我想杀毒 就是如此吧)
``````````````````````````````````````````````````````````````````````````````````````````````
各位大虾 ,有没有什么解决办法或建议 
我只想获得我 想获取的最终目标文件 test.txt 其他的放过 不进行任何处理(就是在100+ 或更多文件中获取我的目标文件 test.txt )!!!

44 个解决方案

#1


根据文件对象FileObject拿到文件的路径,然后比较,搜下 ObQueryNameString 

#2


引用 1 楼 liuyu60305002 的回复:
根据文件对象FileObject拿到文件的路径,然后比较,搜下 ObQueryNameString


en 我是想实现: 
就是我在计算机上做文件操作 我并不知道我操作了什么文件
在驱动中 获取我在计算机直接操作的文件名

恩 这个 ObQueryNameString 查了下 一头雾水 

liuyu60305002 能再详细些么  谢谢...

#3


PFLT_FILE_NAME_INFORMATION pfNameInfo;
status = FltGetFileNameInformation(Data, 
                 FLT_FILE_NAME_OPENED|FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP, 
                 &pfNameInfo) ;
if (!NT_SUCCESS(status))
                    处理代码 ;

              FltParseFileNameInformation(pfNameInfo);
              if (0 == pfNameInfo->Name.Length)
                    处理代码;
然后看看PFLT_FILE_NAME_INFORMATION定义

另外说一句,你这个想法
我只想获得我 想获取的最终目标文件 test.txt 其他的放过 不进行任何处理
不太现实

#4


Delelebug
你好.

你这个事获取文件名吧 
这个我已经做到了 就是我只打开一个文件 但在debugview 中看到有N多文件

我这个目标 可能有点....

但是没办法 还得想办法解决啊 
还是谢谢你..

#5


是有n多文件,比如你打开个txt,用记事本,首先要加载记事本的程序,记事本的程序可能又要加载一堆东西,记事本还简单些,碰到office,pdf之类的,麻烦死
只要打开文件都需要从磁盘上读取,要读取首先要创建文件对象,(这里认为第一次读取,忽略内存缓冲)
所以你那个想法不太好,需要研究每种进程的特性

#6


引用 5 楼 delelebug 的回复:
是有n多文件,比如你打开个txt,用记事本,首先要加载记事本的程序,记事本的程序可能又要加载一堆东西,记事本还简单些,碰到office,pdf之类的,麻烦死
只要打开文件都需要从磁盘上读取,要读取首先要创建文件对象,(这里认为第一次读取,忽略内存缓冲)
所以你那个想法不太好,需要研究每种进程的特性


我也考虑到进程 但一觉得一定很麻烦 二觉得稳定性我没法把握

其实我就是想做个 :
你在电脑上操作文件 然后在驱动中获取信息写成日志
但现在是  获取一大堆 加载库 exe 啊 什么的完全没达到目标... 

#7


放弃你的想法吧,不太可能
我也考虑到进程 但一觉得一定很麻烦 二觉得稳定性我没法把握
我随便写个类似记事本的程序,用来打开文本文件,你能处理吗?其他工具更新你怎么处理?跟着更新?岂不是要累死?

#8


记得以前看到过个推荐的帖子
http://topic.csdn.net/u/20110228/21/ef5d250c-4532-456e-9656-c71fc21a3e5a.html
我也跟风回复过,呵呵,
希望对你有帮助,也许看完了,你就会放弃现在的想法了

#9


你到底要做什么,判断文件名有没有test.txt不就行了

#10


列宁大哥,楼主的意思是获取任意一个打开的文件,名字不固定,
比如打开个test1.txt, test2.doc,然后把这些文件名显示出来
要把应用程序加载的dll之类的,和配置文件,字体文件等等的都剔除掉

#11


加载的dll之类的,能区分出来,但是配置文件,字体文件,模板文件怎么办呢?
我个人觉得这个想法不太现实,
因为打开一个文件的时候,有很多有关的文件也同时打开了,又区分不出来。。。

#12


仅限于资源管理器的?

#13


资源管理器的?
什么意思

#14


怎样打开一个文件才属于它要记录的

#15


引用 10 楼 delelebug 的回复:
列宁大哥,楼主的意思是获取任意一个打开的文件,名字不固定,
比如打开个test1.txt, test2.doc,然后把这些文件名显示出来
要把 应用程序加载的dll之类的,和配置文件,字体文件等等的都剔除掉


这不好判断吧,如果手动打开“ 应用程序加载配置文件”那咋办???

#16


某个目录下有个test.pdf文件,然后打开这个文件,则记录这个文件,提示用户test.pdf文件被打开,呵呵,
这个就是楼主的意思了

这不好判断吧,如果手动打开“应用程序加载配置文件”那咋办???
这个就得问楼主了,看楼主怎么处理了,呵呵

#17


我晕,怎么搞的我像楼主似的。。。

#18


实际上楼主是你的马甲

#19


引用 14 楼 lactoferrin 的回复:
怎样打开一个文件才属于它要记录的


这才是重点啊,lz想好没???

#20


引用 18 楼 lactoferrin 的回复:
实际上楼主是你的马甲

。。。
你就这点能耐?
瞎猜可不行

#21


当然我也有问题,不过我很难相信你能解决,不过你可以试试
获取system.exe创建文件的irp,这时候往下层发送irp 来create该文件的时候,会无限卡死,原因不明
首先说一下,不要去网上搜了,我搜遍了
网络os文件操作好像都是由system完成的,可以用这点来模拟

#22


你是如何获取的,单单是system?

#23


恩,只有system,诺顿和国内杀软不兼容也类似。
获取就是create的irp下发前getcurrentpid

#24


当然,杀软不兼容不仅仅这一点

#25


你是附加设备还是修改函数表
如果是这样你加载过滤的驱动程序后很快就卡死

#26


谢谢 各位大侠的 建议和讨论...
虽然没解决(也许真的很难)但还是很有收获的...
这个贴在 放一放 没准那位大侠一下有思路了呢 \(^o^)/~

我也在查资料 但收获不大啊...

尤其感谢 Lactoferrin  Delelebug  两位  O(∩_∩)O哈哈~ ...
你们交流 我学习 

#27


路过,围观。。。。。。。。。。。。

#28


引用 26 楼 soul850224 的回复:
谢谢 各位大侠的 建议和讨论...
虽然没解决(也许真的很难)但还是很有收获的...
这个贴在 放一放 没准那位大侠一下有思路了呢 \(^o^)/~

我也在查资料 但收获不大啊...

尤其感谢 Lactoferrin  Delelebug  两位  O(∩_∩)O哈哈~ ...
你们交流 我学习

用资源管理器打开文件时会查注册表找打开方式,你可以从这里下手,不过还是会漏掉一些

#29


引用 25 楼 lactoferrin 的回复:
你是附加设备还是修改函数表
如果是这样你加载过滤的驱动程序后很快就卡死

不要拿别人当3岁小孩子,
你是如何获取的,单单是system? 这一句我本就不想回复,
我前面已经描述的很清楚的,包括重现方式

#30


你这言语态度不友好,不像讨论问题的,我并无恶意

#31


引用 18 楼 lactoferrin 的回复:
实际上楼主是你的马甲

这句友好?你可以问问楼主我是否认识他

#32


仅是一句玩笑话,不必当真

#33


原来是这个导致不和谐,就当我放屁

#34


引用 33 楼 lactoferrin 的回复:
原来是这个导致不和谐,就当我放屁

你这么说,我倒蛮不好意思的,当我上面也是放屁好了

#35


.....
晕了 两位 
和谐 和谐 社会 
O(∩_∩)O哈哈~  咱这是学术研究 争执难免 
其实 大家都是无恶意的 无心之举

这事怪我没早现身  昨天太忙了  sorry
 

#36


引用 35 楼 soul850224 的回复:
.....
晕了 两位 
和谐 和谐 社会 
O(∩_∩)O哈哈~ 咱这是学术研究 争执难免 
其实 大家都是无恶意的 无心之举

这事怪我没早现身 昨天太忙了 sorry


这贴结了重开吧,要不他俩不好意思在讨论了~~~

#37


最后的思路了 通过资源管理器了 
╮(╯▽╰)╭  只能试试看了...

#38


底层这里 看来时没办法了

╮(╯▽╰)╭...

#39


引用 4 楼 soul850224 的回复:
Delelebug
你好.

你这个事获取文件名吧 
这个我已经做到了 就是我只打开一个文件 但在debugview 中看到有N多文件

我这个目标 可能有点....

但是没办法 还得想办法解决啊 
还是谢谢你..

你的需求不就是获取文件名进行比较?
很奇怪啊 ?
在MINIFILTER下 进行路径名比较
是你需要监控的进行处理  
不进行监控的返回COMPLETE 或者SUCCESS_NO_CALLBACK .
而比较的路径名并是由驱动固定死  由用户层通讯端传入
这样你想监控1.txt就监控1.txt  想监控2.doc就监控2.doc


引用 11 楼 delelebug 的回复:
加载的dll之类的,能区分出来,但是配置文件,字体文件,模板文件怎么办呢?
我个人觉得这个想法不太现实,
因为打开一个文件的时候,有很多有关的文件也同时打开了,又区分不出来。。。

区分不出来在想象别的办法 
有名字比较为什么不能判断出来?

而且在别的回复轻易断定别人的想法不可行 
这个是否太过武断了 
因为我们本身的知识储备不足
一句话扼杀的可能是一个正确的方向

另外说一句,你这个想法
我只想获得我 想获取的最终目标文件 test.txt 其他的放过 不进行任何处理
不太现实”
这个完全可行 去别处自己想要的最终文件 其余全部放行 完全可以 毕竟你写的是过滤驱动 
不是文件驱动FAT32 NTFS,放行让不关心的文件按原来的流程走 这个是很正常的

引用 6 楼 soul850224 的回复:
其实我就是想做个 :
你在电脑上操作文件 然后在驱动中获取信息写成日志
但现在是 获取一大堆 加载库 exe 啊 什么的完全没达到目标... 

日志不是你打印的么  比较文件名 你感兴趣的才打印 感兴趣的放行即可


引用 16 楼 delelebug 的回复:
某个目录下有个test.pdf文件,然后打开这个文件,则记录这个文件,提示用户test.pdf文件被打开,呵呵,
这个就是楼主的意思了

这不好判断吧,如果手动打开“应用程序加载配置文件”那咋办???
这个就得问楼主了,看楼主怎么处理了,呵呵

所有文件进行操作 无论是写入读取还是删除 重命名
都要经过CREATE 只要在MINIFILTER CREATE中进行路径比对 判断出来 完全可以。
手动打开  这个一样是经过文件系统的



#40


引用 1 楼 liuyu60305002 的回复:
根据文件对象FileObject拿到文件的路径,然后比较,搜下 ObQueryNameString

这位说的是SFILTER做法 一样是比较路径名 方法
很简单也很靠谱 
之后的回复  都有点不知所云。。。。

#41


在create里判断文件是否是操作的那个文件,在底层不应该有这种想法。据我所知,在底层只能通过通信,才能知道应用层操作的文件名。
在create里可以通过比较文件名,判断一些标志位来滤掉大部分文件,但是具体哪个文件,无法判断。
其实你可以换个角度去考虑,比如处理内存,只要能实现你的功能就行。

#42


该回复于2011-11-07 09:16:22被版主删除

#43


加个文件名过滤

#44


直接获取打开文件的文件名就可以了啊     有个file->filename可以得到文件打开的文件名  


遍历这个文件名   用一个指针指向L"."就可以了啊  取得这个指针就行了啊 

#1


根据文件对象FileObject拿到文件的路径,然后比较,搜下 ObQueryNameString 

#2


引用 1 楼 liuyu60305002 的回复:
根据文件对象FileObject拿到文件的路径,然后比较,搜下 ObQueryNameString


en 我是想实现: 
就是我在计算机上做文件操作 我并不知道我操作了什么文件
在驱动中 获取我在计算机直接操作的文件名

恩 这个 ObQueryNameString 查了下 一头雾水 

liuyu60305002 能再详细些么  谢谢...

#3


PFLT_FILE_NAME_INFORMATION pfNameInfo;
status = FltGetFileNameInformation(Data, 
                 FLT_FILE_NAME_OPENED|FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP, 
                 &pfNameInfo) ;
if (!NT_SUCCESS(status))
                    处理代码 ;

              FltParseFileNameInformation(pfNameInfo);
              if (0 == pfNameInfo->Name.Length)
                    处理代码;
然后看看PFLT_FILE_NAME_INFORMATION定义

另外说一句,你这个想法
我只想获得我 想获取的最终目标文件 test.txt 其他的放过 不进行任何处理
不太现实

#4


Delelebug
你好.

你这个事获取文件名吧 
这个我已经做到了 就是我只打开一个文件 但在debugview 中看到有N多文件

我这个目标 可能有点....

但是没办法 还得想办法解决啊 
还是谢谢你..

#5


是有n多文件,比如你打开个txt,用记事本,首先要加载记事本的程序,记事本的程序可能又要加载一堆东西,记事本还简单些,碰到office,pdf之类的,麻烦死
只要打开文件都需要从磁盘上读取,要读取首先要创建文件对象,(这里认为第一次读取,忽略内存缓冲)
所以你那个想法不太好,需要研究每种进程的特性

#6


引用 5 楼 delelebug 的回复:
是有n多文件,比如你打开个txt,用记事本,首先要加载记事本的程序,记事本的程序可能又要加载一堆东西,记事本还简单些,碰到office,pdf之类的,麻烦死
只要打开文件都需要从磁盘上读取,要读取首先要创建文件对象,(这里认为第一次读取,忽略内存缓冲)
所以你那个想法不太好,需要研究每种进程的特性


我也考虑到进程 但一觉得一定很麻烦 二觉得稳定性我没法把握

其实我就是想做个 :
你在电脑上操作文件 然后在驱动中获取信息写成日志
但现在是  获取一大堆 加载库 exe 啊 什么的完全没达到目标... 

#7


放弃你的想法吧,不太可能
我也考虑到进程 但一觉得一定很麻烦 二觉得稳定性我没法把握
我随便写个类似记事本的程序,用来打开文本文件,你能处理吗?其他工具更新你怎么处理?跟着更新?岂不是要累死?

#8


记得以前看到过个推荐的帖子
http://topic.csdn.net/u/20110228/21/ef5d250c-4532-456e-9656-c71fc21a3e5a.html
我也跟风回复过,呵呵,
希望对你有帮助,也许看完了,你就会放弃现在的想法了

#9


你到底要做什么,判断文件名有没有test.txt不就行了

#10


列宁大哥,楼主的意思是获取任意一个打开的文件,名字不固定,
比如打开个test1.txt, test2.doc,然后把这些文件名显示出来
要把应用程序加载的dll之类的,和配置文件,字体文件等等的都剔除掉

#11


加载的dll之类的,能区分出来,但是配置文件,字体文件,模板文件怎么办呢?
我个人觉得这个想法不太现实,
因为打开一个文件的时候,有很多有关的文件也同时打开了,又区分不出来。。。

#12


仅限于资源管理器的?

#13


资源管理器的?
什么意思

#14


怎样打开一个文件才属于它要记录的

#15


引用 10 楼 delelebug 的回复:
列宁大哥,楼主的意思是获取任意一个打开的文件,名字不固定,
比如打开个test1.txt, test2.doc,然后把这些文件名显示出来
要把 应用程序加载的dll之类的,和配置文件,字体文件等等的都剔除掉


这不好判断吧,如果手动打开“ 应用程序加载配置文件”那咋办???

#16


某个目录下有个test.pdf文件,然后打开这个文件,则记录这个文件,提示用户test.pdf文件被打开,呵呵,
这个就是楼主的意思了

这不好判断吧,如果手动打开“应用程序加载配置文件”那咋办???
这个就得问楼主了,看楼主怎么处理了,呵呵

#17


我晕,怎么搞的我像楼主似的。。。

#18


实际上楼主是你的马甲

#19


引用 14 楼 lactoferrin 的回复:
怎样打开一个文件才属于它要记录的


这才是重点啊,lz想好没???

#20


引用 18 楼 lactoferrin 的回复:
实际上楼主是你的马甲

。。。
你就这点能耐?
瞎猜可不行

#21


当然我也有问题,不过我很难相信你能解决,不过你可以试试
获取system.exe创建文件的irp,这时候往下层发送irp 来create该文件的时候,会无限卡死,原因不明
首先说一下,不要去网上搜了,我搜遍了
网络os文件操作好像都是由system完成的,可以用这点来模拟

#22


你是如何获取的,单单是system?

#23


恩,只有system,诺顿和国内杀软不兼容也类似。
获取就是create的irp下发前getcurrentpid

#24


当然,杀软不兼容不仅仅这一点

#25


你是附加设备还是修改函数表
如果是这样你加载过滤的驱动程序后很快就卡死

#26


谢谢 各位大侠的 建议和讨论...
虽然没解决(也许真的很难)但还是很有收获的...
这个贴在 放一放 没准那位大侠一下有思路了呢 \(^o^)/~

我也在查资料 但收获不大啊...

尤其感谢 Lactoferrin  Delelebug  两位  O(∩_∩)O哈哈~ ...
你们交流 我学习 

#27


路过,围观。。。。。。。。。。。。

#28


引用 26 楼 soul850224 的回复:
谢谢 各位大侠的 建议和讨论...
虽然没解决(也许真的很难)但还是很有收获的...
这个贴在 放一放 没准那位大侠一下有思路了呢 \(^o^)/~

我也在查资料 但收获不大啊...

尤其感谢 Lactoferrin  Delelebug  两位  O(∩_∩)O哈哈~ ...
你们交流 我学习

用资源管理器打开文件时会查注册表找打开方式,你可以从这里下手,不过还是会漏掉一些

#29


引用 25 楼 lactoferrin 的回复:
你是附加设备还是修改函数表
如果是这样你加载过滤的驱动程序后很快就卡死

不要拿别人当3岁小孩子,
你是如何获取的,单单是system? 这一句我本就不想回复,
我前面已经描述的很清楚的,包括重现方式

#30


你这言语态度不友好,不像讨论问题的,我并无恶意

#31


引用 18 楼 lactoferrin 的回复:
实际上楼主是你的马甲

这句友好?你可以问问楼主我是否认识他

#32


仅是一句玩笑话,不必当真

#33


原来是这个导致不和谐,就当我放屁

#34


引用 33 楼 lactoferrin 的回复:
原来是这个导致不和谐,就当我放屁

你这么说,我倒蛮不好意思的,当我上面也是放屁好了

#35


.....
晕了 两位 
和谐 和谐 社会 
O(∩_∩)O哈哈~  咱这是学术研究 争执难免 
其实 大家都是无恶意的 无心之举

这事怪我没早现身  昨天太忙了  sorry
 

#36


引用 35 楼 soul850224 的回复:
.....
晕了 两位 
和谐 和谐 社会 
O(∩_∩)O哈哈~ 咱这是学术研究 争执难免 
其实 大家都是无恶意的 无心之举

这事怪我没早现身 昨天太忙了 sorry


这贴结了重开吧,要不他俩不好意思在讨论了~~~

#37


最后的思路了 通过资源管理器了 
╮(╯▽╰)╭  只能试试看了...

#38


底层这里 看来时没办法了

╮(╯▽╰)╭...

#39


引用 4 楼 soul850224 的回复:
Delelebug
你好.

你这个事获取文件名吧 
这个我已经做到了 就是我只打开一个文件 但在debugview 中看到有N多文件

我这个目标 可能有点....

但是没办法 还得想办法解决啊 
还是谢谢你..

你的需求不就是获取文件名进行比较?
很奇怪啊 ?
在MINIFILTER下 进行路径名比较
是你需要监控的进行处理  
不进行监控的返回COMPLETE 或者SUCCESS_NO_CALLBACK .
而比较的路径名并是由驱动固定死  由用户层通讯端传入
这样你想监控1.txt就监控1.txt  想监控2.doc就监控2.doc


引用 11 楼 delelebug 的回复:
加载的dll之类的,能区分出来,但是配置文件,字体文件,模板文件怎么办呢?
我个人觉得这个想法不太现实,
因为打开一个文件的时候,有很多有关的文件也同时打开了,又区分不出来。。。

区分不出来在想象别的办法 
有名字比较为什么不能判断出来?

而且在别的回复轻易断定别人的想法不可行 
这个是否太过武断了 
因为我们本身的知识储备不足
一句话扼杀的可能是一个正确的方向

另外说一句,你这个想法
我只想获得我 想获取的最终目标文件 test.txt 其他的放过 不进行任何处理
不太现实”
这个完全可行 去别处自己想要的最终文件 其余全部放行 完全可以 毕竟你写的是过滤驱动 
不是文件驱动FAT32 NTFS,放行让不关心的文件按原来的流程走 这个是很正常的

引用 6 楼 soul850224 的回复:
其实我就是想做个 :
你在电脑上操作文件 然后在驱动中获取信息写成日志
但现在是 获取一大堆 加载库 exe 啊 什么的完全没达到目标... 

日志不是你打印的么  比较文件名 你感兴趣的才打印 感兴趣的放行即可


引用 16 楼 delelebug 的回复:
某个目录下有个test.pdf文件,然后打开这个文件,则记录这个文件,提示用户test.pdf文件被打开,呵呵,
这个就是楼主的意思了

这不好判断吧,如果手动打开“应用程序加载配置文件”那咋办???
这个就得问楼主了,看楼主怎么处理了,呵呵

所有文件进行操作 无论是写入读取还是删除 重命名
都要经过CREATE 只要在MINIFILTER CREATE中进行路径比对 判断出来 完全可以。
手动打开  这个一样是经过文件系统的



#40


引用 1 楼 liuyu60305002 的回复:
根据文件对象FileObject拿到文件的路径,然后比较,搜下 ObQueryNameString

这位说的是SFILTER做法 一样是比较路径名 方法
很简单也很靠谱 
之后的回复  都有点不知所云。。。。

#41


在create里判断文件是否是操作的那个文件,在底层不应该有这种想法。据我所知,在底层只能通过通信,才能知道应用层操作的文件名。
在create里可以通过比较文件名,判断一些标志位来滤掉大部分文件,但是具体哪个文件,无法判断。
其实你可以换个角度去考虑,比如处理内存,只要能实现你的功能就行。

#42


该回复于2011-11-07 09:16:22被版主删除

#43


加个文件名过滤

#44


直接获取打开文件的文件名就可以了啊     有个file->filename可以得到文件打开的文件名  


遍历这个文件名   用一个指针指向L"."就可以了啊  取得这个指针就行了啊