Minifilter - 没有获得IRP_MJ_CREATE请求

时间:2014-07-23 08:18:43

标签: registration minifilter

我正在开发一个基于minispy示例的minifilter驱动程序,我很难理解为什么我的过滤器每秒被调用几百次,因为它只能捕获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示例非常相似。

那么为什么我得到所有这些"毫无意义"电话或我说错了什么?

任何帮助都会很棒。

提前谢谢

4 个答案:

答案 0 :(得分:1)

欢迎来到windows设备驱动程序特别是文件系统过滤器的混乱世界。 您不仅是访问资源的人,而且还有其他人 流程,他们可以发送给你很多创造。例如:Explorer.exe等 所以不用担心它。如果你拒绝自动附加卷那么 你赢了一半的战斗。希望这可能有所帮助。

答案 1 :(得分:1)

您可以使用此

克服InstanceSetUp回调中的自动附件
if ( FlagOn( Flags, FLTFL_INSTANCE_SETUP_AUTOMATIC_ATTACHMENT ) ) 
{

    return STATUS_FLT_DO_NOT_ATTACH;
}

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

答案 2 :(得分:1)

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请求"

答案 3 :(得分:0)

还要确保设置实例设置回调参数。见here。 注意 FLTFL_INSTANCE_SETUP_MANUAL_ATTACHMENT 标志。如果要自动附加到所有卷,请不要设置。 事实上,请注意所有标志并阅读每个标志并确定您想要的内容。

您的过滤器被称为时代的追求者,因为操作系统正在幕后工作,以及其他所有必须完成工作的流程和驱动程序,而这项工作通常涉及处理文件。要了解该世界如何从SysInternals签出procmon

祝你好运。