阅读:3027回复:12
移植tooflat的加解密,关于cache的问题
我的要求比较简单,对特定的文件目录中的所有文件进行透明加解密,主要移植了tooflat的read,write,create几个函数,现在碰到些问题请教一下了解的大牛们。
1、关于if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))这个语句,我理解是不是排除掉对cache的一些操作?只有不是cache操作才进行加解密,不知道对不对? 2、在write中,如果我加上if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))),那么我对打开的文件进行修改后,再点保存,好像就被这一句给过滤掉了,不能进行加密存储了,为什么呢?去掉这一句,每次write的时候都进行加密,好像看着效果也正常? 3、在read中,如果原来文件就在目录中,那么打开可以执行解密操作,但是如果我从其它目录拷贝或者新建一个文件后,write的时候都加密了,但是再打开的时候都不进行解密,好像就是被if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))给过滤掉了,怎么解决呢? 不知道tooflat的代码是怎么解决这个问题的?请大牛指点一下,我因为要求不多,所以tooflat的一些其它函数并没有移植过来 |
|
最新喜欢:mr6698 |
沙发#
发布于:2007-10-10 09:45
|
|
板凳#
发布于:2007-10-10 10:25
if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))
表示只对实际数据读写操作感兴趣 |
|
地板#
发布于:2007-10-10 10:25
1、关于if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))这个语句,我理解是不是排除掉对cache的一些操作?只有不是cache操作才进行加解密,不知道对不对?
对! 2、在write中,如果我加上if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))),那么我对打开的文件进行修改后,再点保存,好像就被这一句给过滤掉了,不能进行加密存储了,为什么呢?去掉这一句,每次write的时候都进行加密,好像看着效果也正常? 不会的,修改文件保存是会有这三个标志位(或其中之一二)的文件写下去的。 3、在read中,如果原来文件就在目录中,那么打开可以执行解密操作,但是如果我从其它目录拷贝或者新建一个文件后,write的时候都加密了,但是再打开的时候都不进行解密,好像就是被if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))给过滤掉了,怎么解决呢? copy过来的很大机会上会在cache中,所以打开文件就看见明文了,不会走0x43这几个标志位了。可以你这样试一下,copy完文件然后重启,或是代码里清cache,然后再去打开文件,这样IRP_READ中就会看见0x43的读了。新创建文件基本类似。 |
|
地下室#
发布于:2007-10-10 11:10
非常感谢clarence 大牛的指点,先去试验下!
|
|
5楼#
发布于:2007-10-10 11:27
关于write还是不行,请教为什么?
IRP_MJ_WRITE: nFlag = GetPathFlag(fullPathName, DirStatus); if(nFlag != 0xFFFF) { 。。。。 if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))) { DbgPrint((" write file skip pathname: %s \n", fullPathName)); IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(hookExt->FileSystem, Irp); } 主要意思就是判断如果是我要求的目录文件路径,就进行加密,第一步就是判断 if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))),在debug中,我打开一个txt文件,更改后,点击保存,在dbgview中可以看到write file skip pathname。。。这一句调试信息,表示被这个if语句过滤掉了,没有进入加密代码,为什么呢?和记事本没关系吧? |
|
6楼#
发布于:2007-10-10 11:46
跟踪到此时的irp->flags是0xa00,怎么办?
|
|
7楼#
发布于:2007-10-10 12:59
1、Read Write里面的文件路径是不一定有效的。
2、用Filespy工具你会看到有0x43的IRP下来的,当然前面也会有你看到到其他FLAG的IRP。 现在我们做的driver对于不是0x43的都一律不处理 |
|
8楼#
发布于:2007-10-10 16:33
再次感谢clarence 的指点,write的问题找到了,是我程序前面的问题。
希望这里象clarence 热心的朋友能多一些,有问题大家多讨论才能有进步! |
|
9楼#
发布于:2008-01-18 13:53
引用第8楼gzy_nj于2007-10-10 16:33发表的 : 具体什么原因呀?俺也遇到类似的问题,您不妨多给俺罗索几句呀? |
|
10楼#
发布于:2008-06-16 22:38
引用第8楼gzy_nj于2007-10-10 16:33发表的 : 同仁,你是怎么处理的阿?请点解点解? |
|
11楼#
发布于:2010-05-08 22:20
这种人啊。遇到了问题没有人回答就说人家不热心。一有人回答把问题给解决了,自己就消失了。哎。
|
|
12楼#
发布于:2010-05-09 17:16
|
|
|