piodma
驱动牛犊
驱动牛犊
  • 注册日期2008-05-30
  • 最后登录2008-08-14
  • 粉丝1
  • 关注1
  • 积分2分
  • 威望15点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
阅读:2810回复:5

问一个Minifilter的问题

楼主#
更多 发布于:2008-06-04 23:59
在 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-" );
    }

诸位给点提示吧,拜托了
piodma
驱动牛犊
驱动牛犊
  • 注册日期2008-05-30
  • 最后登录2008-08-14
  • 粉丝1
  • 关注1
  • 积分2分
  • 威望15点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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 发出时是不带文件名的?
microbe
驱动小牛
驱动小牛
  • 注册日期2007-12-10
  • 最后登录2011-01-17
  • 粉丝1
  • 关注0
  • 积分914分
  • 威望420点
  • 贡献值1点
  • 好评度88点
  • 原创分0分
  • 专家分1分
板凳#
发布于:2008-06-05 07:57
在你的notepad还没有去create这个文件的时候,这个txt已经被系统预读了,所以notepad只需要从缓存里面去读,因而没有noncache的读,我想应该是这样
microbe
驱动小牛
驱动小牛
  • 注册日期2007-12-10
  • 最后登录2011-01-17
  • 粉丝1
  • 关注0
  • 积分914分
  • 威望420点
  • 贡献值1点
  • 好评度88点
  • 原创分0分
  • 专家分1分
地板#
发布于:2008-06-05 08:00
跟MiniFilter没关系,跟虚拟机也没有关系。。
piodma
驱动牛犊
驱动牛犊
  • 注册日期2008-05-30
  • 最后登录2008-08-14
  • 粉丝1
  • 关注1
  • 积分2分
  • 威望15点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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的时候不能得到文件名
amazingzyx
驱动牛犊
驱动牛犊
  • 注册日期2009-03-06
  • 最后登录2010-01-19
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望181点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2009-10-10 17:57
那要针对记事本,想要过滤IRP_MJ_READ,是不是要清缓存?具体怎样实现呢?
对于word,是不是就不会提前读了?
游客

返回顶部