阅读:1370回复:8
sfilter写加解密,遇到一些问题
1 如果我在WRITE中,用自己的BUFFER替换系统原来的Irp->MdlAddress。密文只有在重新启动以后才能看到。因为缓存中是明文呀。
2 如果我直接把Irp->MdlAddress中的内容加密,那么密文当下可以看到(因为系统缓冲被加密了嘛)。但是我在完成例程中想把内容变回来,蓝屏出错。 3 解密的时候,如果文件在系统缓冲中不存在,好,正常解密。但是一旦文件被打开一次,或者只是文件点了一下,即文件被读入系统缓冲。这个时候我把这个文件COPY走,不幸的是,COPY走的还是明文。因为他直接读取系统缓冲。 那么如果我清空缓冲,这样是不是太影响性能了? 谢谢 |
|
最新喜欢:![]() |
沙发#
发布于:2005-05-26 18:18
还测出一个错误。
加密.txt文件,大于40K。就蓝屏! 但是没有找到是哪里内存的问题。 |
|
板凳#
发布于:2005-05-27 08:38
第一个问题可以在close时清除缓存:
if (FileObject && FileObject->SectionObjectPointer) { CcFlushCache(FileObject->SectionObjectPointer, NULL,0, &IoStatus); if (IoStatus.Status == STATUS_SUCCESS) retval = CcPurgeCacheSection( FileObject->SectionObjectPointer, NULL, 0, TRUE ); } 不能在完成例程当中处理用户缓冲,因为完成例程运行在DISPATCH_LEVEL下。 第二个问题我也遇到过,不过不是蓝屏,而是后面的内容加密出现乱码,后来我在write和read当中自己处理分组,不管当前读写的长度多大,我都会将其分割成512字节的数据块进行加密和解密,这样就没有问题了,你可以试试看。 [编辑 - 5/27/05 by joshua_yu] |
|
地板#
发布于:2005-05-27 10:56
每次CLOSE的时候都清楚缓存,是不是有性能影响啊?
另外:我在CLOSE中清除缓存,蓝屏了!!! [编辑 - 5/27/05 by zhjie374] |
|
地下室#
发布于:2005-05-27 12:32
性能影响肯定是有的,因为操作系统之所以提供缓存机制就是加快磁盘I/O的速度,不必每次访问文件都进行磁盘的I/O操作。
不过为了系统自身的安全性,牺牲一定的性能也在所难免。 :) 蓝屏应该不是清除缓存带来的,因为我的Close例程就是这样做的,用了很长时间从没有出过问题,我是直接拷贝出来的。 |
|
5楼#
发布于:2005-05-27 12:46
能把你CLOSE中的整个给我看看吗?
可能是判断或什么问题,我查不出来. 谢谢 ZHJIE374@YAHOO.COM |
|
6楼#
发布于:2005-05-27 13:28
我在CLOSE中使用你的代码,蓝屏显示:
IRQ_NOT_LESS_OR_EQUAL 奇怪了.说我IRQ不够 |
|
7楼#
发布于:2005-05-27 13:59
我的close代码很简单,而且以前close部分只有这些代码,没有其它的。
case IRP_MJ_CLOSE: if (FileObject && FileObject->SectionObjectPointer) { CcFlushCache(FileObject->SectionObjectPointer, NULL,0, &IoStatus); if (IoStatus.Status == STATUS_SUCCESS) retval = CcPurgeCacheSection( FileObject->SectionObjectPointer, NULL, 0, TRUE ); } break; 在Filemon中,IRP_MJ_CLOSE的处理是在FilemonHookRoutine例程当中的,只需要这些代码就足够了,不过如果你的close例程是单独的,那么你在函数开始的时候应该判断当前的DeviceObject是否发送给自己驱动程序的,否则确实会蓝屏! |
|
8楼#
发布于:2005-05-27 14:36
我现在也觉得是判断对象的问题。我的代码:
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp); NTSTATUS status; PFILE_OBJECT file = irpSp->FileObject; IO_STATUS_BLOCK IoStatus; BOOLEAN retval=FALSE; PAGED_CODE(); if(!(DeviceObject->DriverObject==gSFilterDriverObject)) { Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; Irp->IoStatus.Information = 0; status = Irp->IoStatus.Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } if (gSFilterControlDeviceObject==DeviceObject) {DbgPrint(\"[Jason]In //\"); Irp->IoStatus.Status = STATUS_SUCCESS;//INVALID_DEVICE_REQUEST; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_SUCCESS; } ASSERT(!IS_MY_CONTROL_DEVICE_OBJECT( DeviceObject )); ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject )); if (file && file->SectionObjectPointer) { CcFlushCache(file->SectionObjectPointer, NULL,0, &IoStatus); DbgPrint(\"Before Flush\"); if (IoStatus.Status == STATUS_SUCCESS) retval = CcPurgeCacheSection( file->SectionObjectPointer, NULL, 0, FALSE ); } IoSkipCurrentIrpStackLocation( Irp ); return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp ); } 我看我已经把了好几道关来严整DEVICEOBJECT的合法性。 我发现CcFlushCache是没有问题的。关键是CcPurgeCacheSection运行就蓝屏。 |
|