zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
阅读:1372回复:8

sfilter写加解密,遇到一些问题

楼主#
更多 发布于:2005-05-26 14:31
1 如果我在WRITE中,用自己的BUFFER替换系统原来的Irp->MdlAddress。密文只有在重新启动以后才能看到。因为缓存中是明文呀。
2 如果我直接把Irp->MdlAddress中的内容加密,那么密文当下可以看到(因为系统缓冲被加密了嘛)。但是我在完成例程中想把内容变回来,蓝屏出错。
3 解密的时候,如果文件在系统缓冲中不存在,好,正常解密。但是一旦文件被打开一次,或者只是文件点了一下,即文件被读入系统缓冲。这个时候我把这个文件COPY走,不幸的是,COPY走的还是明文。因为他直接读取系统缓冲。
  那么如果我清空缓冲,这样是不是太影响性能了?

谢谢

最新喜欢:

hongsinghongsi...
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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运行就蓝屏。
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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是否发送给自己驱动程序的,否则确实会蓝屏!
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-27 13:28
我在CLOSE中使用你的代码,蓝屏显示:
IRQ_NOT_LESS_OR_EQUAL

奇怪了.说我IRQ不够
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-27 12:46
 能把你CLOSE中的整个给我看看吗?

可能是判断或什么问题,我查不出来.

谢谢

ZHJIE374@YAHOO.COM
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-27 12:32
性能影响肯定是有的,因为操作系统之所以提供缓存机制就是加快磁盘I/O的速度,不必每次访问文件都进行磁盘的I/O操作。

不过为了系统自身的安全性,牺牲一定的性能也在所难免。 :)

蓝屏应该不是清除缓存带来的,因为我的Close例程就是这样做的,用了很长时间从没有出过问题,我是直接拷贝出来的。
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-27 10:56
每次CLOSE的时候都清楚缓存,是不是有性能影响啊?

另外:我在CLOSE中清除缓存,蓝屏了!!!

[编辑 -  5/27/05 by  zhjie374]
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
7楼#
发布于: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]
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-05-26 18:18
还测出一个错误。
加密.txt文件,大于40K。就蓝屏!

但是没有找到是哪里内存的问题。
游客

返回顶部