阅读:2142回复:3
请教高手 minifilter 为什么写不进去
代码如下:明明已经执行拉,为什么打开后什么也没有呢,麻烦高手看看,
加密标志放在文件头部. FLT_PREOP_CALLBACK_STATUS NPPreWrite( __inout PFLT_CALLBACK_DATA Data, __in PCFLT_RELATED_OBJECTS FltObjects, __deref_out_opt PVOID *CompletionContext ) { ULONG i; PFile_node node; PFILE_OBJECT file; PFLT_IO_PARAMETER_BLOCK iopb = Data->Iopb; FLT_PREOP_CALLBACK_STATUS retValue = FLT_PREOP_SUCCESS_NO_CALLBACK; PUCHAR newBuf = NULL; PLARGE_INTEGER offset=NULL; PMDL newMdl = NULL; PFile_Context p2pCtx; PVOID origBuf; NTSTATUS status; ULONG writeLen = iopb->Parameters.Write.Length; file=iopb->TargetFileObject ; offset = &Data->Iopb->Parameters.Write.ByteOffset; if(gloadfileobject!=file) return FLT_PREOP_SUCCESS_NO_CALLBACK; DbgPrint("写 gloadfileobject 匹配成功"); if (!FlagOn((IRP_PAGING_IO |IRP_SYNCHRONOUS_PAGING_IO|IRP_NOCACHE),iopb->IrpFlags)) { return retValue; } try { if (writeLen == 0) { leave; } newBuf = ExAllocatePoolWithTag( NonPagedPool,writeLen,BUFFER_SWAP_TAG ); if (newBuf == NULL) { leave; } if (FlagOn(Data->Flags,FLTFL_CALLBACK_DATA_IRP_OPERATION)) { newMdl = IoAllocateMdl( newBuf, writeLen, FALSE, FALSE, NULL ); if (newMdl == NULL) { leave; } MmBuildMdlForNonPagedPool( newMdl ); } if (iopb->Parameters.Write.MdlAddress != NULL) { origBuf = MmGetSystemAddressForMdlSafe( iopb->Parameters.Write.MdlAddress, NormalPagePriority ); if (origBuf == NULL) { Data->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; Data->IoStatus.Information = 0; retValue = FLT_PREOP_COMPLETE; leave; } } else { origBuf = iopb->Parameters.Write.WriteBuffer; } try { RtlCopyMemory( newBuf, origBuf, writeLen ); } except (EXCEPTION_EXECUTE_HANDLER) { Data->IoStatus.Status = GetExceptionCode(); Data->IoStatus.Information = 0; retValue = FLT_PREOP_COMPLETE; leave; } p2pCtx = ExAllocateFromNPagedLookasideList( &Pre2PostContextList ); if (p2pCtx == NULL) { leave; } for(i=0;i<writeLen;i++) { newBuf^= 0x77; } offset->QuadPart += CF_FILE_HEADER_SIZE; DbgPrint("交换缓冲测试成功"); iopb->Parameters.Write.WriteBuffer = newBuf; iopb->Parameters.Write.MdlAddress = newMdl; FltSetCallbackDataDirty( Data ); p2pCtx->newbuffer= newBuf; *CompletionContext = p2pCtx; retValue = FLT_PREOP_SUCCESS_WITH_CALLBACK; } finally { if (retValue != FLT_PREOP_SUCCESS_WITH_CALLBACK) { if (newBuf != NULL) { ExFreePool( newBuf ); } if (newMdl != NULL) { IoFreeMdl( newMdl ); } } } return retValue; } FLT_POSTOP_CALLBACK_STATUS NPPostWrite( __inout PFLT_CALLBACK_DATA Data, __in PCFLT_RELATED_OBJECTS FltObjects, __in PVOID CompletionContext, __in FLT_POST_OPERATION_FLAGS Flags ) { PFile_Context p2pCtx = CompletionContext; UNREFERENCED_PARAMETER( FltObjects ); UNREFERENCED_PARAMETER( Flags ); // Free allocate POOL and volume context DbgPrint("释放缓冲成功"); ExFreePool( p2pCtx->newbuffer ); ExFreeToNPagedLookasideList( &Pre2PostContextList, p2pCtx ); DbgPrint("释放通用连表节点成功"); return FLT_POSTOP_FINISHED_PROCESSING; } |
|
沙发#
发布于:2010-04-23 11:41
是在NTFS分区下测试吧,你换到FAT32下就没问题。我也是无奈,碰到这种情况,后来是在
PostWrite返回值是多少,如果返回值没有问题,我就是在 if (!FlagOn((IRP_PAGING_IO |IRP_SYNCHRONOUS_PAGING_IO|IRP_NOCACHE),iopb->IrpFlags)) { 这里判断下文件大小正确不正确,如果小于偏移+写入长度就需要增加文件大小 并且加入Flush的方法才写入到硬盘 return retValue; } 具体的可以参考我的代码http://bbs.driverdevelop.com/read.php?tid-119736-page-2.html的35楼 但是我还有一个很棘手的问题没解决,这几天正在纠结。 |
|
板凳#
发布于:2010-04-23 16:04
ander5115:
是在NTFS分区下测试吧,你换到FAT32下就没问题。我也是无奈,碰到这种情况,后来是在 PostWrite返回值是多少,如果返回值没有问题,我就是在 if (!FlagOn((IRP_PAGING_IO |IRP_SYNCHRONOUS_PAGING_IO|IRP_NOCACHE),iopb->IrpFlags)) { 这里判断下文件大小正确不正确,如果小于偏移+写入长度就需要增加文件大小 并且加入Flush的方法才写入到硬盘 return retValue; } 具体的可以参考我的代码http://bbs.driverdevelop.com/read.php?tid-119736-page-2.html的35楼但是我还有一个很棘手的问题没解决,这几天正在纠结。 本人是新手,麻烦你说明白一点,谢谢. if (!FlagOn((IRP_PAGING_IO |IRP_SYNCHRONOUS_PAGING_IO|IRP_NOCACHE),iopb->IrpFlags)) { 这里判断下文件大小正确不正确,如果小于偏移+写入长度就需要增加文件大小 并且加入Flush的方法才写入到硬盘 return retValue; } 是在 PostWrite还是在 PretWrite 中判断? 能够给你的一份我参考么 shuwen119922777@163.com ,非常感谢 |
|
地板#
发布于:2010-04-23 22:07
Paging WRITE cannot write beyond EOF.
|
|