“未调用 FltStartFiltering”尝试在 DriverEntry 中附加卷的错误

Posted

技术标签:

【中文标题】“未调用 FltStartFiltering”尝试在 DriverEntry 中附加卷的错误【英文标题】:"FltStartFiltering has not been called" Error of trying to attach a volume in DriverEntry 【发布时间】:2018-06-03 16:22:03 【问题描述】:

我尝试在驱动程序服务启动时附加卷,但我得到“过滤器尚未准备好附加到卷,因为它尚未完成初始化(尚未调用 FltStartFiltering)。 “然后我立即蓝屏。我已经调用了 FltStartFiltering 但我不知道为什么它不起作用。

下面是我的代码:

status = FltRegisterFilter(DriverObject,
        &FilterRegistration,
        &MiniSpyData.Filter);

    if (!NT_SUCCESS(status)) 

        leave;
    




    status = FltBuildDefaultSecurityDescriptor(&sd,
        FLT_PORT_ALL_ACCESS);

    if (!NT_SUCCESS(status)) 
        leave;
    

    RtlInitUnicodeString(&uniString, WOODY_PORT_NAME);

    InitializeObjectAttributes(&oa,
        &uniString,
        OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
        NULL,
        sd);

    status = FltCreateCommunicationPort(MiniSpyData.Filter,
        &MiniSpyData.ServerPort,
        &oa,
        NULL,
        SpyConnect,
        SpyDisconnect,
        SpyMessage,
        1);

    FltFreeSecurityDescriptor(sd);



    if (!NT_SUCCESS(status)) 
        leave;
    

    //
    //  We are now ready to start filtering
    //

    status = FltStartFiltering(MiniSpyData.Filter);

    if (!NT_SUCCESS(status)) 

        FltUnregisterFilter(MiniSpyData.Filter);
    
    else 
     //Here is what I want to attach
        RtlInitUnicodeString(&uniString, L"\\Device\\HarddiskVolume1");
        PFLT_VOLUME vol;
        FltGetVolumeFromName(&MiniSpyData.Filter, &uniString, &vol);
        status = FltAttachVolume(&MiniSpyData.Filter, vol, NULL, NULL);
    

【问题讨论】:

调用中的FltGetVolumeFromNameFltAttachVolume 不能是&MiniSpyData.Filter,而是MiniSpyData.Filter - 如果出现致命错误。也作为一般说明 - 你称之为FltAttachVolume? fltmgr 自动将过滤器附加到现有卷 非常感谢!这是我的错。现在它可以工作了...如果我重新启动 PC,过滤器驱动程序将不会附加。我检查了服务,它确实在运行...... 除非我调用 FltAttachVolume() ...但是如果我在 DriverEntry 中调用 FltAttachVolume(),它可以附加一次服务加载,但几秒钟后又蓝屏了。我需要检查再次编码...感谢您的帮助 过滤器驱动程序不会附加必须自动附加,除非它不是 xp/2000。 The filter manager automatically notifies a minifilter driver about an available volume by calling its InstanceSetupCallback routine on the first create operation after the volume is mounted. 【参考方案1】:
RtlInitUnicodeString(&uniString, L"\\Device\\HarddiskVolume1");
PFLT_VOLUME vol;
FltGetVolumeFromName(&MiniSpyData.Filter, &uniString, &vol);
status = FltAttachVolume(&MiniSpyData.Filter, vol, NULL, NULL);

上面的部分根本不需要并且也是错误的。 让我解释一下:

    FltGetVolumeFromName 例程将 PFLT_FILTER 作为第一个参数,根据我在您的代码中看到的内容,您给它一个 PFLT_FILTER* 您不需要手动附加到卷,因为您将自动附加并在您的实例上下文中被调用,除非您在实例上下文注册标志中设置 FLTFL_INSTANCE_SETUP_MANUAL_ATTACHMENT。详情请参阅this。 您不希望在启动期间执行此操作,因为卷可能还不存在,因此您可能会出现 BSOD。

祝你好运。

【讨论】:

以上是关于“未调用 FltStartFiltering”尝试在 DriverEntry 中附加卷的错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 尝试排队作业,触发新尝试的正确方法?

尝试在java中的socket客户端程序中捕获多次尝试

如何在 PHP 中限制用户登录尝试

如何处理 Swift 的“尝试”?导致“尝试的结果?未使用”? [复制]

我正在尝试从 pyspark 访问 mysql 表。我正在尝试使用:

尝试从 python 数据帧创建多级标头-尝试 Multiindex.from_product() [重复]