xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:2882回复:23

如何在文件过滤驱动中实现压缩?

楼主#
更多 发布于:2005-07-20 11:04
  如题
idaxsy
驱动大牛
驱动大牛
  • 注册日期2004-12-09
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望54点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-07-20 14:28
好像很少有人做过这个的。关注!
[b]万水千山总是情,回个帖子行不行?[/b]
hbnhbnhbn
驱动牛犊
驱动牛犊
  • 注册日期2004-04-03
  • 最后登录2007-01-25
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-20 19:34
关注ing~~~~~~~~~
quicker
驱动牛犊
驱动牛犊
  • 注册日期2004-07-18
  • 最后登录2005-08-08
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-07-20 19:40
学习中。。。。。。。。。
生命不能承受之轻!
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-07-21 09:24
我认为可以,但是没有做过.

方法1: 得到BUFFER,直接压缩.
方法2: 当文件写磁盘结束后,在完成例程中,用ZWCREATEFILE ZWREADFILE ZWWRITEFILE等,重新写这个文件

GOOD LUCK
idaxsy
驱动大牛
驱动大牛
  • 注册日期2004-12-09
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望54点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-07-21 11:37
是不是应该创建一个新文件,压缩后把老文件删除掉
[b]万水千山总是情,回个帖子行不行?[/b]
yuanyuan
驱动大牛
驱动大牛
  • 注册日期2003-01-15
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分1025分
  • 威望300点
  • 贡献值0点
  • 好评度232点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-07-21 13:37
ifs专门有一个压缩层的group
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
7楼#
发布于:2005-07-21 14:14
应该可以压缩,因为win2k支持压缩功能
走走看看开源好 Solaris vs Linux
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-07-21 17:09
压缩是一定可以压的,但是看你想压成什么.
如果你想压成RAR ZIP等标准格式,只能再建立一个文件了.然后操作完以后改名改回来.

如果只是随便压缩,那就和加密一样.得到BUFFER操作字符串就行了.
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
9楼#
发布于:2005-07-22 10:11
It's not that easy. Some problems I can see are:

Read/Write buffer offset and length should be changed in MJ_READ/MJ_WRITE
File size, EOF, Allocation Size are changed on the fly
Some algorithms require either header or trailer appended
Some algorithms may require re-compressing whole file even there's only one-byte change.

But of couse it's doable.
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-07-22 11:01
不是所有的需求用驱动作都是很好的解决方案。

类似加密一样,很多的需求用驱动来做并不是什么好的注意,利用驱动来实现在功能和实用性方面都很难获得满意的效果。
在交流中学习。。。
idaxsy
驱动大牛
驱动大牛
  • 注册日期2004-12-09
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望54点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-07-28 10:24
我觉得用驱动来做,主要优点是可以完全透明地处理。另外有时候也
不得不使用驱动,有时候则不一定。
[b]万水千山总是情,回个帖子行不行?[/b]
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2005-07-29 09:09
我也认为在驱动中做会有一些好处。但现在遇到一个问题,就是解压的时候buffer的长度变化问题。当一个buffer是一个满页传进来的时候,解压后肯定长度发生变化。但多出来的那一块buffer怎么处理?我认为肯定要在下一个buffer来之前将他传上去,但没有好的思路。请各位大佬不吝赐教!
idaxsy
驱动大牛
驱动大牛
  • 注册日期2004-12-09
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望54点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-07-29 10:41
一定要创建临时文件,微软就是这么做的。不信你去调试一下。
[b]万水千山总是情,回个帖子行不行?[/b]
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-07-29 16:02
下面是引用idaxsy于2005-07-29 10:41发表的:
一定要创建临时文件,微软就是这么做的。不信你去调试一下。

微软创建临时文件,主要用于备份恢复之用,是怕压缩过程中出意外(比如断电)导致原文件损坏,是否跟压缩有关,还不甚清楚
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
idaxsy
驱动大牛
驱动大牛
  • 注册日期2004-12-09
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望54点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-08-03 16:38
主要是微软的临时文件打不开,搞不清里头是些什么东西。
我想办法禁止了微软删除临时文件,可是打不开这个文件,在ring0和ring3都试验了一下。
[b]万水千山总是情,回个帖子行不行?[/b]
idaxsy
驱动大牛
驱动大牛
  • 注册日期2004-12-09
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望54点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-08-03 16:41
不过我在write例程里看到向临时文件写入的确是明文。
看来这个文件的确如bmyyyud所说,是备份恢复用的。

而且没有发现有改名的动作,可以证明确实如此。
[b]万水千山总是情,回个帖子行不行?[/b]
yaolixing
驱动小牛
驱动小牛
  • 注册日期2006-06-27
  • 最后登录2010-07-15
  • 粉丝1
  • 关注0
  • 积分991分
  • 威望135点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-10-20 02:38
我这里只考虑压缩写:
我只处理cache写,因为直接写硬盘时,是以簇为单位的,已经没有了文件指针的概念。
在写例程中,我不改变IrpSp-> Parameters. ByteOffset,也不改变FileObject-> CurrentByteOffset,
也不改变IrpSp-> Parameters. Write. Length,在写例程中我将数据压缩到一个临时Buf中,并获得了压缩后的长度len,仅仅在拷贝数据的时候,我只返回len个字节的Buf给用户区。为了使下一个IRP包的写指针偏移落在压缩数据的末尾,我们必须记住len值,并传到完成例程中做进一步处理。

在写完成例程中,Irp->IoStatus.Information维护了写成功的长度,也就是说Irp-> IoStatus.Information=="写例程中IrpSp-> Parameters. Write. Length的值",在写完成例程中,文件系统已经将Irp-> IoStatus.Information累加到了FileObject->  CurrentByteOffset上了,下一个写IRP包的写偏移就是依赖于这个累加后的值。所以为了使下一个写IRP指针的偏移能紧挨着上次压缩的数据尾部,我这样来做:
        IrpSp-> FileObject-> CurrentByteOffset. QuadPart -= Irp->IoStatus. Information;
        IrpSp-> FileObject-> CurrentByteOffset. QuadPart += len;

事实证明效果不是很好。
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
18楼#
发布于:2007-10-20 22:11
如果用压缩算法问题还比较艰巨,哎~
没有战争就没有进步 X3工作组 为您提供最好的军火
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
19楼#
发布于:2007-10-21 02:16
我只处理cache写

So you have compressed data in cache. I don't think this is good for MM file nor performance.
上一页
游客

返回顶部