zzbwang
驱动牛犊
驱动牛犊
  • 注册日期2009-03-18
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分62分
  • 威望611点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分1分
阅读:2209回复:0

关于IRP_MJ_READ和IRP_MJ_WRITE的问题,我的思路对吗?

楼主#
更多 发布于:2009-03-23 21:31
以sfWrite()函数对数据的处理为例,以下程序实现对数据的加密、解密:

for (Offset = 0; Offset < CompletionCtx->Length; Offset+=1024)
{
        i=(int)memcpy(buffer,((PCHAR)CompletionCtx->MyBuffer)+Offset,1024);
        rc4_crypt( s, buffer, i);
        i=(int)memcpy( ((PCHAR)CompletionCtx->OldBuffer)+Offset,buffer, i);    
}

这里的问题是,我们无法肯定应用程序从一个文件的哪个位置开始读、写文件内容,更不能肯定读、写的数据总是从文件头偏移量为1024的整数倍的位置开始。所以我觉得这段程序会有问题。正确的做法应该是,假如加密数据块大小为BLOCKSIZE(为8或者16的整数倍)根据IrpSp->FileObject->CurrentByteOffset 和irpsp->Parameters.Read.Length计算出应当从哪里开始读(offset & (BLOCKSIZE-1)),读多长( (offset + length + BLOCKSIZE) / BLOCKSIZE *  BLOCKSIZE ),然后构造IRP_MJ_READ完成读操作。数据解密后,再根据原始IRP的要求取出正确偏移量和长度的数据返回。

不知道我的思路是否正确?
游客

返回顶部