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

xuAmigo,来问个加密

楼主#
更多 发布于:2005-05-25 15:46
最近看到很多人做加密解密,我也很感兴趣。来问一问。
我今天想实现在WRITE中得到内容,然后加密并把密文保存到DISK,然后恢复内存中的明文。我参照以前的文章写,但是怎么就总蓝屏呢?代码如下:请多指教
NTSTATUS
SfWrite(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{PIO_STACK_LOCATION     irpSp = IoGetCurrentIrpStackLocation(Irp);
PREAD_WRITE_COMPLETION_CONTEXT CompletionCtx = NULL;
NTSTATUS               status;
PFILE_OBJECT           file  = irpSp->FileObject;
UNICODE_STRING         name;
UNICODE_STRING         dosname={0};
WCHAR nameBuf[512];
PVOID OldBuffer = NULL;//Original content
PVOID MyBuffer = NULL;
ULONG Length = 0;
ULONG Offset = 0;
PAGED_CODE();

if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))
{
return SfPassThrough(DeviceObject,Irp);
}
do{
DbgPrint(\"SfWrite:Begin\");
if (Irp->MdlAddress)
OldBuffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
else
OldBuffer = Irp->UserBuffer;
if(!OldBuffer)
{
DbgPrint(\"SfWriet:OldBuffer==NULL\");
status = STATUS_INVALID_PARAMETER;
break;
}
Length = irpSp->Parameters.Write.Length
DbgPrint(\"%d,%s\",Length,OldBuffer);
MyBuffer = ExAllocatePool(NonPagedPool,Length);
if (!MyBuffer)
{
DbgPrint(\"sfilter!SfWrite: STATUS_INSUFFICIENT_RESOURCES\\n\");
status = STATUS_INSUFFICIENT_RESOURCES;
break;
}
RtlCopyMemory(MyBuffer,OldBuffer,Length);
CompletionCtx=ExAllocatePool(NonPagedPool,sizeof(READ_WRITE_COMPLETION_CONTEXT));
if(!CompletionCtx)
{
DbgPrint(\"sfilter!SfWrite: STATUS_INSUFFICIENT_RESOURCES\\n\");
status = STATUS_INSUFFICIENT_RESOURCES;
break;
}
DbgPrint(\"Allocate OK!\");
CompletionCtx->OldMdl = Irp->MdlAddress;
CompletionCtx->OldUserBuffer = Irp->UserBuffer;
CompletionCtx->OldSystemBuffer = Irp->AssociatedIrp.SystemBuffer;
CompletionCtx->OldBuffer = OldBuffer;
CompletionCtx->MyBuffer = MyBuffer;
CompletionCtx->Length = Length;
for(Offset=0;Offset<Length;++Offset)
((PUCHAR) OldBuffer)[Offset] = ~((PUCHAR) MyBuffer)[Offset];
DbgPrint(\"OldBuffer after encrypt:%s\",OldBuffer);
IoCopyCurrentIrpStackLocationToNext(Irp);
IoSetCompletionRoutine(Irp, SfWriteCompletion, CompletionCtx, TRUE, TRUE,TRUE);
return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp );
}while(FALSE);
Irp->IoStatus.Status = status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;

}

NTSTATUS
SfWriteCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
)
{
PREAD_WRITE_COMPLETION_CONTEXT CompletionCtx = (PREAD_WRITE_COMPLETION_CONTEXT) Context;
ULONG Offset = 0;
UNREFERENCED_PARAMETER(DeviceObject);
if (Irp->PendingReturned)
IoMarkIrpPending(Irp);
IoFreeMdl(Irp->MdlAddress);
Irp->MdlAddress = CompletionCtx->OldMdl;
Irp->UserBuffer = CompletionCtx->OldUserBuffer;
Irp->AssociatedIrp.SystemBuffer = CompletionCtx->OldSystemBuffer;
ExFreePoolWithTag(CompletionCtx->MyBuffer, SFLT_POOL_TAG);
return STATUS_SUCCESS;
}

最新喜欢:

LeopardLeopar...
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-26 10:28
我的就是重新启动以后才能看到密文,确实是缓存的问题,你按你的要求改就行
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-26 10:18
我还是直接COPY到OLDBUFFER的。
我想按照你们的思路修改一下,但是,加密以后只有重新启动才能看到密文。而我直接替换OLDBUFFER的话就可以,怎么回事?

难道是CACHE??
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-26 09:43
我下了几个断点,终于可以了。主要是几个内存用的不小心。
还有就是IoFreeMdl(Irp->MdlAddress);不能要。

但是我的加密完了以后密文的长度会变的,比如以前length=4096,我加密以后变成了5000,怎么办?

能不能自己把这个5000的密文分两次写下去?

谢谢?
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-25 19:42
RtlCopyMemory(MyBuffer,OldBuffer,Length);
这句不要,
for(Offset=0;Offset<Length;++Offset)
((PUCHAR) OldBuffer)[Offset] = ~((PUCHAR) MyBuffer)[Offset];
这句改为
Irp->MdlAddress = IoAllocateMdl(MyBuffer,Length,FALSE,TRUE,NULL);
for(Offset=0;Offset<Length;++Offset)
((PUCHAR) MyBuffer)[Offset] = ~((PUCHAR) OldBuffer)[Offset];
MmBuildMdlForNonPagedPool(Irp->MdlAddress);
Irp->UserBuffer = MmGetMdlVirtualAddress(Irp->MdlAddress);
你试试看,OldBuffer是系统缓冲区
gongbin_net
驱动牛犊
驱动牛犊
  • 注册日期2003-06-18
  • 最后登录2005-06-07
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-25 19:27
IoFreeMdl(Irp->MdlAddress);
Irp->MdlAddress = CompletionCtx->OldMdl;
Irp->UserBuffer = CompletionCtx->OldUserBuffer;
Irp->AssociatedIrp.SystemBuffer = CompletionCtx->OldSystemBuffer
不要这个IoFreeMdl(Irp->MdlAddress);,因为两个都是同一个mdl
释放掉了,而完成例程返回时,会自动释放掉irp的mdl的

感觉你的代码问题很多,你重新改写下
游客

返回顶部