needhelp
驱动牛犊
驱动牛犊
  • 注册日期2004-11-08
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2243回复:11

在IRP_MJ_WRITE中拦截nocache pageio 以及同步pageIO,不允许写a.txt文件,但最终还是被写入,为什么?

楼主#
更多 发布于:2005-03-17 09:58
如题,我在记事本中对该文件进行修改,点击保存时,系统提示延迟写失败,系统提醒我把该文件保存到别处,但我在点击退出后,再用写字本打开该文件,发现该文件已经被修改,不知是什么原因.我觉得不是fastIO的问题,我认为最终的写还是PAGEIO方式,我在此拦截就行了.不知哪位大侠做过这个方面,请提醒一下,不胜感激.
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-17 11:18
应该不会的,看看下面几行代码吧
if(((Irp->Flags & IRP_PAGING_IO) == 0)
|| ((Irp->Flags & IRP_SYNCHRONOUS_PAGING_IO)==0)
||((Irp->Flags & IRP_NOCACHE)==0)
)
{
}
在交流中学习。。。
gongbin_net
驱动牛犊
驱动牛犊
  • 注册日期2003-06-18
  • 最后登录2005-06-07
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-17 21:58
不会的,fastio只是缓存处理的方式,它是把系统缓冲区的内容复制到用户进程。一定是你加密有问题。
needhelp
驱动牛犊
驱动牛犊
  • 注册日期2004-11-08
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-18 08:53
fslife大侠,我也是按你的方式来拦截,同时从文件对象中得到要写的文件名,与我要控制的文件名做比较,不允许写的,我就完成该IRP包,不再向下层文件驱动转发IRP包.
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-18 09:29
是不是打开的还是缓存中的文件内容呢,如果你重启机器,然后再打开才能判断是否真的修改了文件。
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-23 12:18
我遇到的情况和这个差不多,重启机器以后也确实没有写数据到文件中去。不过当修改了某个文件以后并没有立即重启机器的话,然后又新建了一个文件,这时要对新建的文件进行加密并将它传到磁盘上了,最后重启机器出现的情况是修改的那个文件被成功修改了。请问该如何解决,是否要清空缓存
quicmous
驱动牛犊
驱动牛犊
  • 注册日期2007-02-09
  • 最后登录2009-08-14
  • 粉丝0
  • 关注0
  • 积分115分
  • 威望44点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-01-18 11:34
我发现这个问题和我昨天遇到的差不多,为什么没有答案了?都快三年的问题了?
AlexSho
驱动牛犊
驱动牛犊
  • 注册日期2008-01-10
  • 最后登录2017-12-01
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望164点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2008-01-18 13:08
可能性太多了,比如你怎么判断该文件是你要处理的对象?从你的描述中,你是在write的时候从FileObject中获取文件名,这个也许就是你的问题所在,当然,任何一个处理上的细节部队,都可能导致楼主的问题
AlexSho
驱动牛犊
驱动牛犊
  • 注册日期2008-01-10
  • 最后登录2017-12-01
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望164点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2008-01-18 13:09
引用第1楼fslife于2005-03-17 11:18发表的  :
应该不会的,看看下面几行代码吧
            if(((Irp->Flags & IRP_PAGING_IO) == 0)
                || ((Irp->Flags & IRP_SYNCHRONOUS_PAGING_IO)==0)
                ||((Irp->Flags & IRP_NOCACHE)==0)
                )
.......


笔误??是&&吧
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
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并返回数据
  给应用而不再去读磁盘,所以你会发现文件的内容看似保存成功了!
人总在矛盾中徘徊。。。
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
10楼#
发布于:2008-01-18 14:00
Re:在IRP_MJ_WRITE中拦截nocache pageio 以及同步pageIO,
所以正确的做法是:

1。正确跟踪文件的上下文(比如:文件名),
  在Write中不要尝试获取文件名,如果你这样做了,你不能保证100%能得到!
2。禁止所有类型的Write请求,并且要考究返回值
       (比如:ACCESS_DENIED和MEDIA_PROTECTED对应用层的行为是不同的)
人总在矛盾中徘徊。。。
ronaldo
驱动小牛
驱动小牛
  • 注册日期2004-12-17
  • 最后登录2011-08-02
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望277点
  • 贡献值0点
  • 好评度104点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-01-23 16:57
禁止记录机写入应该返回什么值?
游客

返回顶部