阅读:1720回复:14
请高手帮忙看一下文件不能加密的原因
我在filemon里面修改了 我修改了Filemon里面FilemonHookRoutine里面的IRP_MJ_WRITE,但是不能加密文件,请问是什么原因啊?
[编辑 - 5/16/05 by Hell_Fire_1981] |
|
沙发#
发布于:2005-05-16 11:39
<但是不能加密文件
具体碰到了什么问题? 因为系统可能会调用FastIoWrite,你仅仅hook IRP_MJ_WRITE可能不全 |
|
板凳#
发布于:2005-05-16 13:19
但是我监视驱动,没有发现有fastio啊?
我只是实现对文本文件的加密解密! 下面是我在IRP_MJ_WRITE修改的程序 if(!(Irp->Flags & (IRP_NOCACHE| IRP_PAGING_IO |IRP_SYNCHRONOUS_PAGING_IO))) { break; } if(Irp->MdlAddress) { sysDataOld = MmGetSystemAddressForMdl(Irp->MdlAddress); } else { sysDataOld = Irp->UserBuffer; } if(!sysDataOld) { break; } length = currentIrpStack->Parameters.Write.Length; sysDataBuffer = (PCHAR)ExAllocatePool(NonPagedPool, length); RtlCopyMemory(sysDataBuffer, sysDataOld, length); for(i = 0; i < length ; i++) { sysDataBuffer = sysDataBuffer + 1; } pMDL = IoAllocateMdl(sysDataBuffer, length, FALSE, FALSE, Irp ); MmBuildMdlForNonPagedPool(pMDL); Irp->UserBuffer=MmGetMdlVirtualAddress(pMDL); |
|
地板#
发布于:2005-05-16 14:12
zhaock 大侠能留个联系方式吗?
我觉得现在驱动网上的高手都不怎么愿意回答我这种新手(菜鸟)的问题,就您老大还帮助我们了。 [编辑 - 5/17/05 by Hell_Fire_1981] |
|
地下室#
发布于:2005-05-16 14:29
<if(!(Irp->Flags & (IRP_NOCACHE| IRP_PAGING_IO <|IRP_SYNCHRONOUS_PAGING_IO)))
<{ <break; <} 这几句有问题吧?对于大部分buffered io,就被pass掉了吧 我不用qq. 这个月比较闲,对于我以前熟悉的驱动,试着回答回答,有很多还是 三四年前做的,只能回答一些入门级的问题,呵呵,细节已经记不清了 |
|
5楼#
发布于:2005-05-16 14:33
我在试试看,这句话是我在论坛里别人的帖子看来的。
谢谢你,不管是不是这个原因先给分。 |
|
6楼#
发布于:2005-05-16 14:50
你已经把分给了,不帮你搞定,也说不过去了。
你先把问题说说,我懒得去调试了 你在那if(memcmp(fullPathName,\"E:\\\\1.txt\",8)==0)设断点, 进去了吗? 这句if(Irp->MdlAddress)走到了吗? |
|
7楼#
发布于:2005-05-16 15:02
进去了,我在后来的那个加密部分也测试了,都进去了啊!!
|
|
8楼#
发布于:2005-05-16 15:17
你直接call IoCompleteRequest肯定不对,去掉后,再试试
|
|
9楼#
发布于:2005-05-16 15:22
这一点我也想到了,我后来去掉了,现在的问题是我可以测试到sysDataBuffer已经 +1 了,可是我关闭驱动后打开还是明文?
|
|
10楼#
发布于:2005-05-16 15:28
而且你代码还有很多问题,你必须安装一个completion函数,
必须释放掉你分配内存,mdl,而且恢复被你替换的Irp->UserBuffer, 和Irp->MdlAddress(你代码中没有替换,需要替换成你分配的pMDL) 看来你windows驱动确实不太熟悉,而文件系统又是非常复杂的, 够你做的,呵呵 |
|
11楼#
发布于:2005-05-16 15:31
<这一点我也想到了,我后来去掉了,现在的问题是我可以测试到<sysDataBuffer已经 +1 了,可是我关闭驱动后打开还是明文?
可能就是你没有替换Irp->MdlAddress,下层驱动用的还是上层的 数据,而不是你修改后的密文 |
|
12楼#
发布于:2005-05-16 15:36
《可能就是你没有替换Irp->MdlAddress,你必须安装一个completion函数,
必须释放掉你分配内存,mdl,而且恢复被你替换的Irp->UserBuffer, 和Irp->MdlAddress(你代码中没有替换,需要替换成你分配的pMDL) 》 能给我讲讲怎么替换吗? 我现在基本上是一边看书一边看论坛里的文章,在学习的。 |
|
13楼#
发布于:2005-05-16 15:46
<<能给我讲讲怎么替换吗?
completion->OldMdl = Irp->MdlAddress; MyMdl是你分配的,Irp->MdlAddress = MyMdl, 在回调函数里,再恢复Irp->MdlAddress= completion->OldMdl |
|
14楼#
发布于:2005-05-16 15:53
谢谢你,我自己试试吧,多谢你今天和我说了这么多!!
作出来了以后,我把它公布出来,大家一起看看。到时候在给你分。 呵呵 :D :D :D |
|