阅读:2305回复:0
关于IRP_MJ_READ和IRP_MJ_WRITE的问题,我的思路对吗?
以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的要求取出正确偏移量和长度的数据返回。 不知道我的思路是否正确? |
|