阅读:2243回复:11
在IRP_MJ_WRITE中拦截nocache pageio 以及同步pageIO,不允许写a.txt文件,但最终还是被写入,为什么?
如题,我在记事本中对该文件进行修改,点击保存时,系统提示延迟写失败,系统提醒我把该文件保存到别处,但我在点击退出后,再用写字本打开该文件,发现该文件已经被修改,不知是什么原因.我觉得不是fastIO的问题,我认为最终的写还是PAGEIO方式,我在此拦截就行了.不知哪位大侠做过这个方面,请提醒一下,不胜感激.
|
|
沙发#
发布于:2005-03-17 11:18
应该不会的,看看下面几行代码吧
if(((Irp->Flags & IRP_PAGING_IO) == 0) || ((Irp->Flags & IRP_SYNCHRONOUS_PAGING_IO)==0) ||((Irp->Flags & IRP_NOCACHE)==0) ) { } |
|
|
板凳#
发布于:2005-03-17 21:58
不会的,fastio只是缓存处理的方式,它是把系统缓冲区的内容复制到用户进程。一定是你加密有问题。
|
|
地板#
发布于:2005-03-18 08:53
fslife大侠,我也是按你的方式来拦截,同时从文件对象中得到要写的文件名,与我要控制的文件名做比较,不允许写的,我就完成该IRP包,不再向下层文件驱动转发IRP包.
|
|
地下室#
发布于:2005-03-18 09:29
是不是打开的还是缓存中的文件内容呢,如果你重启机器,然后再打开才能判断是否真的修改了文件。
|
|
5楼#
发布于:2005-05-23 12:18
我遇到的情况和这个差不多,重启机器以后也确实没有写数据到文件中去。不过当修改了某个文件以后并没有立即重启机器的话,然后又新建了一个文件,这时要对新建的文件进行加密并将它传到磁盘上了,最后重启机器出现的情况是修改的那个文件被成功修改了。请问该如何解决,是否要清空缓存
|
|
6楼#
发布于:2008-01-18 11:34
我发现这个问题和我昨天遇到的差不多,为什么没有答案了?都快三年的问题了?
|
|
7楼#
发布于:2008-01-18 13:08
可能性太多了,比如你怎么判断该文件是你要处理的对象?从你的描述中,你是在write的时候从FileObject中获取文件名,这个也许就是你的问题所在,当然,任何一个处理上的细节部队,都可能导致楼主的问题
|
|
8楼#
发布于:2008-01-18 13:09
引用第1楼fslife于2005-03-17 11:18发表的 : 笔误??是&&吧 |
|
9楼#
发布于:2008-01-18 13:53
Re:在IRP_MJ_WRITE中拦截nocache pageio 以及同步pageIO,
如果你是在(IRP_PAGING_IO、IRP_SYNCHRONOUS_PAGING_IO和IRP_NOCACHE)路径上做禁止控制的话,由于系统先前写cache已经成功,所以会产生两种现象: 1.当系统真正向磁盘写数据的时候由于被你失败返回了,所以系统会报告“迟延写失败”的错误提示; 2.由于文件已经被cache,只要你没有清除cache,当你关闭文件,然后再次打开文件 时系统先从cache中读取,发现cache中有数据,它就直接读cache并返回数据 给应用而不再去读磁盘,所以你会发现文件的内容看似保存成功了! |
|
|
10楼#
发布于:2008-01-18 14:00
Re:在IRP_MJ_WRITE中拦截nocache pageio 以及同步pageIO,
所以正确的做法是:1。正确跟踪文件的上下文(比如:文件名), 在Write中不要尝试获取文件名,如果你这样做了,你不能保证100%能得到! 2。禁止所有类型的Write请求,并且要考究返回值 (比如:ACCESS_DENIED和MEDIA_PROTECTED对应用层的行为是不同的) |
|
|
11楼#
发布于:2008-01-23 16:57
禁止记录机写入应该返回什么值?
|
|