FltStartFiltering не вызывался Ошибка попытки присоединения тома в 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);
    }

person SuperBerry    schedule 21.12.2017    source источник
comment
в вызове FltGetVolumeFromName и FltAttachVolume должны быть не &MiniSpyData.Filter, а MiniSpyData.Filter - это фатальная ошибка. также как общее примечание - для чего вы называете FltAttachVolume? fltmgr автоматически прикрепляет ваш фильтр к существующим томам   -  person RbMm    schedule 21.12.2017
comment
Большое спасибо! Это моя ошибка. Теперь он работает ... Драйвер фильтра не подключается, если я перезагружу компьютер. Я проверил сервис, он наверняка работает ...   -  person SuperBerry    schedule 21.12.2017
comment
Если я не вызываю FltAttachVolume () ... Но если я вызываю FltAttachVolume () в DriverEntry, он может подключиться после загрузки службы, но через несколько секунд снова появится синий экран ... Мне нужно снова проверить код ... Спасибо за ваш помощь   -  person SuperBerry    schedule 21.12.2017
comment
Драйвер фильтра не подключается должен подключаться автоматически, только если это не xp / 2000. Диспетчер фильтров автоматически уведомляет мини-фильтр о доступном томе, вызвав его подпрограмму InstanceSetupCallback при первой операции создания после монтирования тома.   -  person RbMm    schedule 21.12.2017


Ответы (1)


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 во флагах регистрации контекста вашего экземпляра. См. это Больше подробностей.
  3. Вы не хотите делать это во время загрузки, потому что том может еще не быть и, следовательно, ваш потенциальный BSOD.

Удачи.

person Gabriel Bercea    schedule 26.01.2018