阅读:2864回复:2
[求助]为什么在minifilter pre-read中使用FltReadFile
各位大牛好:
小弟在minifilter架构的基础上写过滤驱动,发现在pre-read中使用FltReadFile();总是返回STATUS_VOLUME_DISMOUNTED,文件系统是NTFS,在FAT32文件系统下OK。操作流程为,在pre-read中发现有需要转移读取的文件A:,这时读取缓存在内存盘中的文件B:文件B在DriverEntry();时就打开,而且成功。下面是部分代码: if (FlagOn(IRP_NOCACHE, iopb->IrpFlags)) { KdPrint(("No Cache!\n")); readLen = (ULONG)ROUND_TO_SIZE(readLen, readLen); } if (FltObjects->FileObject->CurrentByteOffset.QuadPart == pFltObj->pMem->dwSize) { return FLT_PREOP_COMPLETE; } if (FltObjects->FileObject->CurrentByteOffset.QuadPart + iopb->Parameters.Read.Length > pFltObj->pMem->dwSize) //pFltObj->pMem->dwSize为A文件大小 { iopb->Parameters.Read.Length = pFltObj->pMem->dwSize - FltObjects->FileObject->CurrentByteOffset.QuadPart; } //g_FileObj是在DriverEntry时打开的文件的文件对象 status = FltReadFile(FltObjects->Instance, g_FileObj, &FltObjects->FileObject->CurrentByteOffset, Data->Iopb->Parameters.Read.Length, iopb->Parameters.Rea d.ReadBuffer, FLTFL_IO_OPERATION_NON_CACHED, NULL, NULL, NULL); if (!NT_SUCCESS(status)) { KdPrint(("ChangeBuffer failed!\n")); return FLT_PREOP_SUCCESS_WITH_CALLBACK; } Data->IoStatus.Status = STATUS_SUCCESS; Data->IoStatus.Information = iopb->Parameters.Read.Length; FltObjects->FileObject->CurrentByteOffset.QuadPart += iopb->Parameters.Read.Length; if (FltObjects->FileObject->CurrentByteOffset.QuadPart > pFltObj->pMem->dwSize) { FltObjects->FileObject->CurrentByteOffset.QuadPart = pFltObj->pMem->dwSize; } return FLT_PREOP_COMPLETE; 谢谢。 |
|
沙发#
发布于:2010-05-26 12:57
帮帮忙啊!
|
|
板凳#
发布于:2010-05-26 18:09
找到问题的原因了,如果a文件所在的分区格式为ntfs,而b文件所在的缓存盘格式为fat32,那么FltFileRead使用FltObject->Instances来读取文件,那就会出题。反之亦然。看来只能自己封装IRP了,希望大牛们能给点建议。谢谢
|
|