"FltStartFiltering has not been called" 尝试在 DriverEntry 中附加卷时出错

"FltStartFiltering has not been called" Error of trying to attach a volume in DriverEntry

我试图在驱动程序服务启动时附加卷,但我得到“过滤器尚未准备好附加到卷,因为它尚未完成初始化(尚未调用 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);
    }
RtlInitUnicodeString(&uniString, L"\Device\HarddiskVolume1");
PFLT_VOLUME vol;
FltGetVolumeFromName(&MiniSpyData.Filter, &uniString, &vol);
status = FltAttachVolume(&MiniSpyData.Filter, vol, NULL, NULL);

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

  1. FltGetVolumeFromName 例程将 PFLT_FILTER 作为第一个参数,从我在您的代码中看到的情况来看,您给它的参数是 PFLT_FILTER*
  2. 您不需要手动附加到卷,因为您将在实例上下文中自动附加和调用,除非您在实例上下文中设置 FLTFL_INSTANCE_SETUP_MANUAL_ATTACHMENT注册标志。有关详细信息,请参阅 this
  3. 您不想在启动期间执行此操作,因为该卷可能还不存在,因此您可能会出现 BSOD。

祝你好运。