阅读:2916回复:5
问一个Minifilter的问题
在 minifilter 中,在 create、read、write 的前后例程中怎么都拦截不到 PAGING I/O:
首次打开文件和最终保存文件的时候,我用 FlagOn( Data->Iopb->IrpFlags, IRP_PAGING_IO ) 和 FlagOn( Data->Iopb->IrpFlags, IRP_SYNCHRONOUS_PAGING_IO ) 都拦截不到 PAGING I/O 嘛,比如: if( FlagOn( Data->Flags, FLTFL_CALLBACK_DATA_FAST_IO_OPERATION )) { DbgPrint( "-FAST IO preread-" ); } if( !FlagOn( Data->Iopb->IrpFlags, IRP_NOCACHE )) { DbgPrint( "-CACHE IO preread-" ); } if( FlagOn( Data->Flags, FLTFL_CALLBACK_DATA_IRP_OPERATION )) { DbgPrint( "-IRP preread-" ); } if( FlagOn( Data->Iopb->IrpFlags, IRP_PAGING_IO )) { DbgPrint( "-PAGING IO preread-" ); } if( FlagOn( Data->Iopb->IrpFlags, IRP_SYNCHRONOUS_PAGING_IO )) { DbgPrint( "-PAGING IO preread-" ); } 诸位给点提示吧,拜托了 |
|
沙发#
发布于:2008-06-05 01:18
难道是虚拟机里没有 PAGING I/O ?????怎么可能嘛。
请诸位提示一个能在minifilter里抓住PAGING I/O的方法吧 T_T 首次 NOTEPAD 打开 txt 的时候,怎么会没抓到 PAGING I/O : FLT_POSTOP_CALLBACK_STATUS ScannerPostRead ( __inout PFLT_CALLBACK_DATA Data, __in PCFLT_RELATED_OBJECTS FltObjects, __in_opt PVOID CompletionContext, __in FLT_POST_OPERATION_FLAGS Flags ) { NTSTATUS status; BOOLEAN scanFile; FLT_POSTOP_CALLBACK_STATUS returnStatus = FLT_POSTOP_FINISHED_PROCESSING; PFLT_FILE_NAME_INFORMATION nameInfo; if (!NT_SUCCESS( Data->IoStatus.Status )) { return FLT_POSTOP_FINISHED_PROCESSING; } ...... // 检查文件名,如果不是 txt 就 return (略) if( FlagOn( Data->Flags, FLTFL_CALLBACK_DATA_FAST_IO_OPERATION )) { DbgPrint( "-FAST IO postread-" ); } if( !FlagOn( Data->Iopb->IrpFlags, IRP_NOCACHE )) { DbgPrint( "-CACHE IO postread-" ); } if( FlagOn( Data->Flags, FLTFL_CALLBACK_DATA_IRP_OPERATION )) { DbgPrint( "-IRP postread-" ); } if( FlagOn( Data->Iopb->IrpFlags, IRP_PAGING_IO )) { DbgPrint( "-PAGING IO postread-" ); } if( FlagOn( Data->Iopb->IrpFlags, IRP_SYNCHRONOUS_PAGING_IO )) { DbgPrint( "-PAGING IO postread-" ); } DbgPrint(" %ld\n", Data->IoStatus.Information ); return FLT_POSTOP_FINISHED_PROCESSING; } 我在postCreate也做了同样的代码,也没有抓到 PAGING I/O。怎么会有如此诡异?? 还是说 PAGING I/O 发出时是不带文件名的? |
|
板凳#
发布于:2008-06-05 07:57
在你的notepad还没有去create这个文件的时候,这个txt已经被系统预读了,所以notepad只需要从缓存里面去读,因而没有noncache的读,我想应该是这样
|
|
地板#
发布于:2008-06-05 08:00
跟MiniFilter没关系,跟虚拟机也没有关系。。
|
|
地下室#
发布于:2008-06-05 09:39
每次新打开一个文件夹的时候,系统都会把该文件夹里面的某些文件create、query、read、close一遍。如果里面有 txt 文件,我每次都看到所有的 txt 文件都被系统这样读了一遍。即便是这样,用上面的代码我也没有抓到 PAGING I/O。我抓到的是 cache IRP。怎样才能抓到PAGING I/O呢?
———————————— 我现在把检测 TXT 的部分去掉了,果然打出PAING I/O了。我现在再看看PAGING I/O的时候读取的都是什么文件。 ----------------------------------- 啊。。。没仔细看DDK。原来FltGet。name 在PAGING I/O path的时候不能得到文件名 |
|
5楼#
发布于:2009-10-10 17:57
那要针对记事本,想要过滤IRP_MJ_READ,是不是要清缓存?具体怎样实现呢?
对于word,是不是就不会提前读了? |
|