阅读:2536回复:11
IRP_MJ_WRITE的问题!vcmfc再帮忙看看吧!!
在从IRP_MJ_WRITE中取得数据后加密处理。
VCMFC说:要将原来的buffer的内容copy到你的缓冲, 生成该缓冲的MDL,替换Irp->MdlAddress, 下传给file system,恢复原来的MDL,释放缓冲。 可是我是在完成例程里作“加密处理”的,处理之后怎样 “下传给file system,恢复原来的MDL”?? 各位老大帮忙看看! [编辑 - 6/9/03 by song1484] |
|
最新喜欢:![]() |
沙发#
发布于:2003-06-06 00:43
你为什么要在完成例程里加密数据? 写操作都已经完成了, 你还加密它干什么? 我的意思是说, 在这个时候要写的数据已经在磁盘上了.
|
|
板凳#
发布于:2003-06-06 10:04
声明:
此方法有严重的问题,建议不要使用,至少本人已发现了,请用原来缓冲区。 |
|
地板#
发布于:2003-06-06 10:07
流程:
IRP_MJ_Write: if pageio encrypt call file system complete routine decrypt 这种方式可兼容office系统,包括ntfs/fat32分区。 |
|
地下室#
发布于:2003-06-06 10:55
VCFMC:
老大,你终于出现了!太感谢了! 这几天我一直看以前的帖子,各种说法越看越糊涂。 [编辑 - 6/6/03 by song1484] |
|
5楼#
发布于:2003-06-06 22:52
VCMFC, 能说得具体一点吗? 到底那种方法有什么问题? 在我的FILTER中就是使用的这种方法, 好象到现在为止没什么问题。如果说有问题的话,就是会影响系统性能,因为MDL的转换。
如果我的FILTER是一个LOWER FILTER, 在DISK.SYS的下面,应该就不用考虑PAGEIO的问题了吧? Thanks. |
|
6楼#
发布于:2003-06-07 09:28
piggy :
vcmfc看来很少来。 请问:在对IRP_MJ_READ获得的数据加密处理时是否需要判断是目录 还是文件,怎样判断。多谢!! |
|
7楼#
发布于:2003-06-07 15:15
to piggy:我说的是针对ifs filter,disk filter不在此范围内。
to song1484:目录有 pageio吗? |
|
8楼#
发布于:2003-06-07 19:58
vcmfc:
我照你的提示处理irp_mj_write,结果当我重起机器后, 加密的驱动器内的文件都没有了。不知道是什么原因,老大能 否帮忙解释一下,拜托!! 重起机器以后(driver未加载)发现重新写过的文件都没了。 跟踪发现新建或修改.txt文件时一些$LogFile,$Mft文件也被加密处理了,这些是什么文件,是不是和目录结构有关的信息,是不是由于这些信息被加密了,所以当重起后(driver未加载)这些目录信息不能识别了。我该怎么处理呢?谢谢!! [编辑 - 6/9/03 by song1484] [编辑 - 6/9/03 by song1484] |
|
9楼#
发布于:2003-10-15 04:05
To vcmfc:
你说“此方法有严重的问题,建议不要使用,至少本人已发现了,请用原来缓冲区”。能否详细说一下到底是什么严重问题?和CACHE有关吗? 在文件系统FILTER中,做加解密时是不是只需要考虑IRP_NOCACHE, IRP_PAGING_IO, IRP_SYNCHRONOUS_PAGING_IO? Thanks |
|
10楼#
发布于:2003-10-16 22:16
Up 一下.
有没有人知道到底是什么原因呀? |
|
11楼#
发布于:2003-11-01 16:30
if(FlagOn(currentIrpSp->DeviceObject->Flags, IRP_BUFFERED_IO)){
// // IRPÖ¸¶¨°´ÕÕBUFFERED_IO?½Ê½Ð´ // *pBuf = irp->AssociatedIrp.SystemBuffer; } if (FlagOn(currentIrpSp->DeviceObject->Flags,DO_DIRECT_IO)) { // // IRPÖ¸¶¨°´ÕÕDIRECT_IO?½Ê½Ð´ // // Èç¹ûÊÇMDLдÇëÇó,Îļþϵͳ½«¼ì²éÏÂÃæminor function codeÈ»ºó¾ö¶¨ÏÂÃæµÄ // minor codeÄÄÐ?ÊÇÓÐЧµÄfunction code£¬ÕâÖÖÇé¿öÖ»ÓÐÔÚcached I/O²Å³öÏÖ // if(!FlagOn(irp->Flags,IRP_NOCACHE)) { switch(currentIrpSp->MinorFunction) { // // Ö»ÓÐonly for cached file I/Oʱ²Å´¦ÀíÏÂÃæµÄMinor function,Ôݲ»´¦Àí¡£ // case IRP_MN_COMPLETE: case IRP_MN_COMPRESSED: case IRP_MN_DPC: case IRP_MN_MDL: case IRP_MN_NORMAL: default: ; } } //*pBuf = irp->MdlAddress; *pBuf = MmGetSystemAddressForMdl(irp->MdlAddress); } else { // If do not set DO_BUFFERED_IO, IO manager set System buffer as NULL *pBuf = irp->UserBuffer; } 请看上面得代码,是得到write时buffer中得数据,经过测试,是很成功得,不知道你怎么就知道一定数据就存放在mdl中得? |
|
|