zhangkunshb
驱动牛犊
驱动牛犊
  • 注册日期2011-12-08
  • 最后登录2012-05-07
  • 粉丝1
  • 关注0
  • 积分12分
  • 威望101点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1920回复:2

改变 IrpSp->Parameters.Write.Length 为什么没有作用, 附代码.高人帮忙看看

楼主#
更多 发布于:2011-12-13 16:10
 


if(irp->MdlAddress!=NULL)
        {
                buffer=(PUCHAR)MmGetSystemAddressForMdlSafe(irp->MdlAddress,NormalPagePriority);
                DbgPrint("buffer = 0x%x",buffer);
                new_mdl=cfMdlMemoryAlloc(real);
                DbgPrint("new_mdl = 0x%x",new_mdl);
                if(new_mdl==NULL)
                {
                        new_buffer=NULL;
                }
                else
                {
                        new_buffer=(PUCHAR)MmGetSystemAddressForMdlSafe(new_mdl,NormalPagePriority);
                        DbgPrint("new_buffer = 0x%x",new_buffer);
                }
        }
        else
        {
                buffer=(PUCHAR)irp->UserBuffer;
                new_buffer=(PUCHAR)ExAllocatePoolWithTag(NonPagedPool,real,CF_MEM_TAG);
        }
 
 
        //如果缓冲区分配失败了,直接退出即可
        if(new_buffer==NULL)
        {
                irp->IoStatus.Status=STATUS_INSUFFICIENT_RESOURCES;
                irp->IoStatus.Information=0;
                ExFreePoolWithTag(my_context,CF_MEM_TAG);
                return FALSE;
        }
        RtlCopyMemory(new_buffer,buffer,length);
 
 
        //到了这里一定成功,可以设置上下文了
        my_context->mdl_address=irp->MdlAddress;
        my_context->user_buffer=irp->UserBuffer;
 
 
        //******在指定给IRP之前,进行加密*****//
        //******文件加密部分
        PUCHAR encbuf;
        ULONG i;
 
 
        encbuf=(PUCHAR)ExAllocatePool(NonPagedPool,real);
 
 
        RtlZeroMemory(encbuf,real);
 
 
        //***填充空余的buffer***//
        for(i=length;i<real;i++)
        {
                new_buffer='a';
       }


       DbgPrint("Origin::::");//输出原信息
       for(i=0;i<real;i++)
               DbgPrint("%c",new_buffer);


       DbgPrint("buffer = 0x%x",buffer);


       //调用DES算法加密
       DESTEST(new_buffer,encbuf,real,DES_MODE_ENCRYPT);




       DbgPrint("Encrypt::::");//输出加密后信息
       for(i=0;i<real;i++)
               DbgPrint("%c",encbuf);


       RtlCopyMemory(new_buffer,encbuf,real);


       DbgPrint("encbuf = 0x%x",encbuf);


       ExFreePool(encbuf);


       //*********************************//


       //****重新指定IRP即将写的长度****//
      irpsp->Parameters.Write.Length=real;
       irp->IoStatus.Information=real;


       //给IRP指定新的mdl,到完成之后再恢复过来
       if(new_mdl==NULL)
       {
               irp->UserBuffer=new_buffer;
       }
       else
       {
               irp->MdlAddress=new_mdl;
       }




…………………………………………





KeInitializeEvent(&waitEvent,NotificationEvent,FALSE);
    IoCopyCurrentIrpStackLocationToNext(irp);


    IoSetCompletionRoutine(irp,FsFilterDispatchReadCompletion,&waitEvent,TRUE,TRUE,TRUE);


    status=IoCallDriver(devExt->AttachedToDeviceObject,irp);






意图是,应用程序传进来字节不是8个整数倍,进行不气,然后调用DES加密,红色代码设置写的字节数为8个整数倍,
然后写入文件,但是发现最后写入文件的虽然是密文,但是字节数还是从应用程序传来那个数目。


难道红色代码设置的没有用???
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2011-12-14 14:25
呵呵,我也在学习这个。
 
检查一下写完后的Information,看是否是写入的长度


有机会多交流
走走看看开源好 Solaris vs Linux
zhangkunshb
驱动牛犊
驱动牛犊
  • 注册日期2011-12-08
  • 最后登录2012-05-07
  • 粉丝1
  • 关注0
  • 积分12分
  • 威望101点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2011-12-14 19:29
回 1楼(cyliu) 的帖子
呵呵,解决了

还有修改文件大小……
游客

返回顶部