【问题标题】:Minifilter - not getting IRP_MJ_CREATE requestsMinifilter - 没有收到 IRP_MJ_CREATE 请求
【发布时间】:2014-07-23 08:18:43
【问题描述】:

我正在基于 minispy 示例开发一个微过滤器驱动程序,但我无法理解为什么我的过滤器每秒被调用几百次,而它应该只捕获 IRP_MJ_CREATE 并且当时没有创建任何内容。

我在网络上没有找到太多帮助,或者我搜索了错误的东西,或者在不同的部分犯了错误...

这就是我如何注册我的前后操作:

CONST FLT_OPERATION_REGISTRATION Callbacks[] = {
    { IRP_MJ_CREATE,
      0,
      logfilterPreOperation,
      logfilterPostOperation },
    { IRP_MJ_OPERATION_END }
};

这里是过滤器本身...

CONST FLT_REGISTRATION FilterRegistration = {

    sizeof( FLT_REGISTRATION ),         //  Size
    FLT_REGISTRATION_VERSION,           //  Version
    0,                                  //  Flags
    Contexts,                           //  Context
    Callbacks,                          //  Operation callbacks
    logfilterUnload,                    //  MiniFilterUnload
    NULL,                               //  InstanceSetup
    logfilterInstanceQueryTeardown,     //  InstanceQueryTeardown
    NULL,                               //  InstanceTeardownStart
    NULL,                               //  InstanceTeardownComplete
    NULL,                               //  GenerateFileName
    NULL,                               //  GenerateDestinationFileName
    NULL                                //  NormalizeNameComponent
};

注册并开始... Context.DriverObject = DriverObject;

// register filter
DEB_PRINT("DriverEntry: register filter... \n");
status = FltRegisterFilter(DriverObject,&FilterRegistration,&Context.FltFilter);
if (!NT_SUCCESS(status)) {
    DEB_PRINT("DriverEntry: registration failed. status=%#08x \n",status);
    return status;
}

// start data server
InitServer();

// start filtering
DEB_PRINT("DriverEntry: start filtering... \n");
status = FltStartFiltering(Context.FltFilter);
if (!NT_SUCCESS( status )) {
    DEB_PRINT("DriverEntry: start filtering failed. status=%#08x \n",status);
    FltUnregisterFilter(Context.FltFilter);
    return status;
}

这一切都与 minispy 示例非常相似。

那么为什么我会接到所有这些“毫无意义”的电话,或者我理解错了什么?

任何帮助都会很棒。

提前谢谢你

【问题讨论】:

    标签: registration minifilter


    【解决方案1】:

    欢迎来到令人困惑的 Windows 设备驱动程序世界,特别是文件系统过滤器。 您不仅是访问资源的人,而且在操作系统中还有其他一些人 进程,他们可以给你发送很多创建的。例如:Explorer.exe 等。 所以不用担心它。如果你拒绝自动附加到卷然后 你赢了一半的战斗。希望这可能会有所帮助。

    【讨论】:

    • 嗨,我已经在禁止自动附件 ..Instance1.Flags = 0x1 ; Supress automatic attachments 并且我不应该得到文件名吗?例如,资源管理器必须写信到某个地方。即使它是一些神秘的名字,我认为至少应该有一些东西..但我会继续尝试。 :)
    【解决方案2】:

    您可以使用此方法克服 InstanceSetUp 回调中的自动附加问题

    if ( FlagOn( Flags, FLTFL_INSTANCE_SETUP_AUTOMATIC_ATTACHMENT ) ) 
    {
    
        return STATUS_FLT_DO_NOT_ATTACH;
    }
    

    然后您可以尝试使用FltAttachVolume()FltAttachAtAltitude() 等msdn 按需附加 搜索。它肯定会解决你的问题。

    【讨论】:

      【解决方案3】:

      Richmont,只是补充一些信息,

      IRP_MJ_CREATE 不仅用于创建新文件/文件夹,还用于打开任何文件/文件夹进行读取或执行,“IRP_MJ_CREATE”也被调用。

      根据http://msdn.microsoft.com/en-gb/library/windows/hardware/ff548630(v=vs.85).aspx

      “I/O 管理器在创建新文件或目录时发送 IRP_MJ_CREATE 请求,或者在打开现有文件、设备、目录或卷时”

      【讨论】:

      • 嗨,我的问题完全没有问题。它以我实现它的方式正确工作。此时我没有使用调试器,但我使用客户端连接到 Minifilter 向我显示所有捕获的数据。我的错误是复制的数据与指向数据的指针一样长,而不是实际数据。
      • 谢谢,我想知道为什么同一个文件会被多次调用
      【解决方案4】:

      还要确保您设置了实例设置回调参数。见here。 注意 FLTFL_INSTANCE_SETUP_MANUAL_ATTACHMENT 标志。如果要自动附加到所有卷,请不要设置。 事实上,注意所有的标志,阅读每一个标志,然后决定你想要什么。

      您的过滤器被称为数百次甚至更多次,因为操作系统在幕后工作,以及其他所有必须完成工作的进程和驱动程序,而这项工作通常涉及处理文件。要了解这个世界的情况,请查看 procmon 表单 SysInternals。

      祝你好运。

      【讨论】:

        猜你喜欢
        • 2019-01-07
        • 1970-01-01
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多