gzy_nj
驱动牛犊
驱动牛犊
  • 注册日期2006-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分416分
  • 威望60点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
阅读:2156回复:19

虽然希望渺茫,还是来求救各位大牛,没其它办法了!

楼主#
更多 发布于:2008-11-17 12:27
我需要实现一个在尾部加标记的最简单的功能模型,只是想说明这种方式是可行的。
但是在记录文件打开引用次数的问题上,困扰了好几个星期了。看了以前toolfat的sfilter的代码,是通过自己记录相关数据,在create的时候把refcount加1,在close的时候减1。但是我用他的代码,在打开关闭后,计数总是保持在1,不会减少到0,那么我就不知道在什么条件下才来加这个尾部标记了?
还有就是我打开一个指定文件,针对这个文件的create和close的irp总是成对的出现大概几十次,这是正常吗?文件很小,几十个字节。另外我用txt文件作测试会不会有影响?

实在是搞得很累了,各位大牛给个指点吧,不一定要泄露你们什么商业秘密,就随便说说,或者给我个更简单的思路也行,我不要求实现商业功能、稳定等,只要说明这个是可行的,一个原型。
谢谢了!
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-11-17 21:13
引用楼主gzy_nj于2008-11-17 12:27发表的 虽然希望渺茫,还是来求救各位大牛,没其它办法了! :
我需要实现一个在尾部加标记的最简单的功能模型,只是想说明这种方式是可行的。
但是在记录文件打开引用次数的问题上,困扰了好几个星期了。看了以前toolfat的sfilter的代码,是通过自己记录相关数据,在create的时候把refcount加1,在close的时候减1。但是我用他的代码,在打开关闭后,计数总是保持在1,不会减少到0,那么我就不知道在什么条件下才来加这个尾部标记了?
还有就是我打开一个指定文件,针对这个文件的create和close的irp总是成对的出现大概几十次,这是正常吗?文件很小,几十个字节。另外我用txt文件作测试会不会有影响?

实在是搞得很累了,各位大牛给个指点吧,不一定要泄露你们什么商业秘密,就随便说说,或者给我个更简单的思路也行,我不要求实现商业功能、稳定等,只要说明这个是可行的,一个原型。
.......


在create的时候把refcount加1,在close的时候减1。但是我用他的代码,在打开关闭后,计数总是保持在1,不会减少到0

答:
至于这个问题 如果是map方式打开的情况 是很正常的!如果是普通的打开文件,那么就是不正常!    

针对这个文件的create和close的irp总是成对的出现大概几十次,这是正常吗?
答:这个很正常!没有什么大不了的! 只有你的这个简单的filter 里面来实现文件头加密标识或者文件尾加密标识,确实是有难度!但是关键是要处理读写的offset, 和query set filesize的加减法,还另外就是如果文件是使用cache的方式打开的时候一定要注意 cache的size和文件的实际大小要一致。另外要注意同步,因为多个程序同时写你的一个文件的时候,在你的函数里面没有同步机制的话,那么你送给下面的数据就会发生破坏,比如你改了文件头的大小,但是同时另外一个进程写了一部分数据,然后你的这个进程才开始写数据,那么上次人家的数据就被破坏了。切记切记!  现在市场的文件数据被破坏基本上都是在自己的filter里面没有什么同步处理!你可以自己做同步处理,也可以同步下层文件系统fileobject的scb里的resouce来同步。
gzy_nj
驱动牛犊
驱动牛犊
  • 注册日期2006-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分416分
  • 威望60点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-11-17 23:34
谢谢qianjunhua 的回复。关于打开方式,我测试的两个文件一个是用记事本打开的txt,一个用写字板打开doc文件,好像结果都一样,没区别啊,这个是不是不正常啊?

关于同步的问题,我目前还不考虑多个进程的同步,但是关于cache 和文件大小一致,可能要考虑下,我现在测试在close 里面自己直接发irp改文件大小,然后写数据,好像写不进去,而且大小也没增加,不知道是不是因为没有通知cache?
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
地板#
发布于:2008-11-18 05:19
"你可以自己做同步处理,也可以同步下层文件系统fileobject的scb里的resouce来同步"

Very dangerous, potential deadlock. Generally a FSFD should not acquire a FCB resource if it isn't the owner of the FCB. This is one of the reason that it's hard to manipulate file size gracefully in FSFD.
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-11-18 11:30
引用第2楼gzy_nj于2008-11-17 23:34发表的  :
谢谢qianjunhua 的回复。关于打开方式,我测试的两个文件一个是用记事本打开的txt,一个用写字板打开doc文件,好像结果都一样,没区别啊,这个是不是不正常啊?

关于同步的问题,我目前还不考虑多个进程的同步,但是关于cache 和文件大小一致,可能要考虑下,我现在测试在close 里面自己直接发irp改文件大小,然后写数据,好像写不进去,而且大小也没增加,不知道是不是因为没有通知cache?



 在close里面来处理 不行!因为这个fileobject 已经经过了cleanup , 那么fileobject的flag里面就会有cleanup complete的标记,一旦有这个标记 所有的非pageio的 动作都会失败!你在close里面没有得到失败的值,是因为系统不管 cleanup和close的irp的 任何返回值!
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-11-18 11:37
引用第3楼michaelgz于2008-11-18 05:19发表的  :
"你可以自己做同步处理,也可以同步下层文件系统fileobject的scb里的resouce来同步"

Very dangerous, potential deadlock. Generally a FSFD should not acquire a FCB resource if it isn't the owner of the FCB. This is one of the reason that it's hard to manipulate file size gracefully in FSFD.



You are very correct!so only have one way, just using own resouce to do Synchronous  work.
gzy_nj
驱动牛犊
驱动牛犊
  • 注册日期2006-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分416分
  • 威望60点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-11-18 11:38
引用第4楼qianjunhua于2008-11-18 11:30发表的  :



 在close里面来处理 不行!因为这个fileobject 已经经过了cleanup , 那么fileobject的flag里面就会有cleanup complete的标记,一旦有这个标记 所有的非pageio的 动作都会失败!你在close里面没有得到失败的值,是因为系统不管 cleanup和close的irp的 任何返回值!


那是不是说在cleanup里面做这个加尾巴的动作就可以?
再次感谢!
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-11-18 12:28
cleanup 是可以写!但是你要确保是最后一个cleanup ,否则的话,这个文件同时被别的进程打开,那么后面的写又会覆盖你这些写的内容!
gzy_nj
驱动牛犊
驱动牛犊
  • 注册日期2006-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分416分
  • 威望60点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-11-18 20:04
谢谢,但是我有一点想不明白,我做一个简单的打开关闭操作,会出现几十个成对的create和cleanup的,怎么算是最后一个cleanup呢?如果像我说的create加1,cleanup减1,那我记录的引用计数基本是1、0不停的变换,那么就要不住地加尾、去尾,感觉好像不应该这样实现的,呵呵。问题可能比较菜,帮忙再说说,谢谢了!
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
9楼#
发布于:2008-11-18 22:42
just using own resouce to do Synchronous  work.


This is even worse. You add additional synchronization mechanism into FS stack. Deadlock is for sure.
looksail
荣誉会员
荣誉会员
  • 注册日期2005-05-22
  • 最后登录2014-03-15
  • 粉丝2
  • 关注0
  • 积分1016分
  • 威望991点
  • 贡献值0点
  • 好评度239点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-11-19 01:08
michaelgz ,非常感谢你以前的指导,虽然只是只言片语

楼主的问题一下子问的太远了些,加头还是加尾都是可行的,且都有产品出现的,只是要面对不同的问题。

toolfat的代码主要是看加密和解密的部分,文件的记录要自己做,应看那篇文章,叫如何追踪文件状态的,并不是简单的Create和Close时的+-1的问题,要复杂的多,你还要能够高效的维护这些文件状态记录

做这个东西确实很累,要付出超乎常人的耐心和每天不断摧残自己的颈椎,而且不一定努力就能找到解决问题的方法,还需要一些运气
提问归提问,还是只能靠自己
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-11-19 11:32
引用第9楼michaelgz于2008-11-18 22:42发表的  :


This is even worse. You add additional synchronization mechanism into FS stack. Deadlock is for sure.



no,  my layerfsd encryption system is a good prove for this mothed which runs correctly on vista.
hyjtlyra2009
驱动牛犊
驱动牛犊
  • 注册日期2008-09-10
  • 最后登录2010-07-22
  • 粉丝6
  • 关注0
  • 积分2分
  • 威望323点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分10分
12楼#
发布于:2008-11-19 13:50
正确的方向和加倍的努力总是有收获的,人不能靠运气活着……所以只要大牛们给了正确的方向,牛犊总是可以靠努力不断成长的……
洗鉴宏宇 兼济豢龙
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
13楼#
发布于:2008-11-19 23:54
no,  my layerfsd encryption system is a good prove for this mothed which runs correctly on vista.


Layered FSD is complete different than FSFD. I'm talking about FSFD here and the original question was for SFilter which is a FSFD.

If your layered FSD is actually a FSFD which does not have its own FCBs, resources, cache management, etc, I would suggest you do more tests in different environment.

If your layered FSD is actually a FSD, then I don't understand why you need additional resources besides main and paging resources.
gzy_nj
驱动牛犊
驱动牛犊
  • 注册日期2006-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分416分
  • 威望60点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2008-11-20 00:22
引用第10楼looksail于2008-11-19 01:08发表的  :
michaelgz ,非常感谢你以前的指导,虽然只是只言片语

楼主的问题一下子问的太远了些,加头还是加尾都是可行的,且都有产品出现的,只是要面对不同的问题。

toolfat的代码主要是看加密和解密的部分,文件的记录要自己做,应看那篇文章,叫如何追踪文件状态的,并不是简单的Create和Close时的+-1的问题,要复杂的多,你还要能够高效的维护这些文件状态记录
.......


那篇文章是不是好几年前osr上的那个?我简单看了下感觉好像tooflat的代码就是按照那个文章写得?

另外为什么我的问题太远了些?呵呵,我并没有说这样的是不可行的,实际上我是坚信可行的,所以才想要实现一个简单模型证明一下,不过无奈水平有限,看来很难如愿了。
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2008-11-20 10:33
ohRe:虽然希望渺茫,还是来求救各位大牛,没其它办法了!
引用第13楼michaelgz于2008-11-19 23:54发表的  :


Layered FSD is complete different than FSFD. I'm talking about FSFD here and the original question was for SFilter which is a FSFD.

If your layered FSD is actually a FSFD which does not have its own FCBs, resources, cache management, etc, I would suggest you do more tests in different environment.
.......


oh acctually ,my fsd is in a FSFD, so i call layered FSD, and by the way, beside two resources in advcaned head of Context of FCB, ntfs still need another resource to do syn work,that is VCB's resource, i believe that you have read ntfs source code or fat32's source code , when we need create a new file , any file system should syn this creatation ,because this work will cause adding or modifiing disk struct. Same result is for layerfsd.
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
16楼#
发布于:2008-11-21 01:35
Main and Paging resources are for per-file based synchronization. VCB is volume based for disk access serialization. An upper filter FSFD like SFilter should only care about per-file based synchronization.
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2008-11-21 10:49
引用第16楼michaelgz于2008-11-21 01:35发表的  :
Main and Paging resources are for per-file based synchronization. VCB is volume based for disk access serialization. An upper filter FSFD like SFilter should only care about per-file based synchronization.


This conclusion is right, so filter like SFilter should use resouce in advanced heard to syn operntion on file, and as you said this is a dangerous work.
So do you have good ways to syn filesize changing or reading and writing  between two or above processe's operating on same file?
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
18楼#
发布于:2008-11-22 07:08
I would say no universal solution, though many people here don't agree with me. If a FSFD is for specific applications or environments, it may work.
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2008-11-22 11:44
ok, i think this is not a good news to many peoples who deal with buessness about on fly enrypting product using some kind of SFilter.  So how about layeredFSd product?
游客

返回顶部