MiniFilter драйвер.Фильтр прикрепления проблем - PullRequest
2 голосов
/ 09 мая 2011

Я разрабатываю драйвер miniFilter и взял в качестве примера мини-фильтр Microsoft SwapBuffers.Процедура InstaceSetup по умолчанию подключается ко всем томам.Но я не хочу присоединяться ко всем из них, только к некоторым выбранным ...

Я попытался установить «NULL» вместо «InstanceSetup» в «FLT_REGISTRATION FilterRegistration», а затем вызвать «FltAttachVolume»в подпрограмме "DriverEntry".Я сделал следующее:

PFLT_VOLUME vol;UNICODE_STRING vname;.... RtlInitUnicodeString (& vname, L "E: \");FltGetVolumeFromName (gFilterHandle, & vname, & vol);... FltAttachVolume (gFilterHandle, vol, NULL, NULL);...

Когда я пытался вызвать FltAttachVolume с параметром "NULL", 3-й (PCUNICODE_STRING InstanceName), я получил "STATUS_FLT_INSTANCE_NAME_COLLISION" ошибка.

Если явызовите FltAttachVolume с 3-м параметром «НЕ НУЛЬ», таким как «UniqueInstaceName», он возвращает меня "- 2145452013" .

Я получаю те же ошибки, когда я,я пытаюсь подключить том, используя процедуру FilterAttach из моего пользовательского приложения, например:

... driver.driverName = L "swapBuffers";... LPCWSTR vname = L "F: \";... FilterAttach (имя_драйвера_драйвера, vname, NULL, NULL, NULL);

с 3-м параметром "NULL" (LPCWSTR lpInstanceName): "ERROR_FLT_INSTANCE_NAME_COLLISION"

1022 * С "NOT-NULL": "- 2145452013" .

В MiniSpy miniFilter есть приложение User, и используется подпрограмма FilterAttach.Я попытался вызвать эту процедуру в моем приложении таким же образом - безрезультатно.

Наконец, я изменил инф-файл swapBuffers:

  • там не было параметра DefaultInstance, я установил его: "SwapBuffers - Top Instance".
  • также я скопировал это из инф-файла MiniSpy:

    [MiniFilter.AddRegistry] HKR, "Instances", "DefaultInstance", 0x00000000,% DefaultInstance% HKR, "Instances \"% Instance1.Name%,«Высота», 0x00000000,% Instance1.Altitude% HKR, «Instances \»% Instance1.Name%, «Флаги», 0x00010001,% Instance1.Flags% HKR, «Экземпляры \»% ​​Instance2.Name%, «Высота»,0x00000000,% Instance2.Altitude% HKR, "Instances \"% Instance2.Name%, "Flags", 0x00010001,% Instance2.Flags% HKR, "Instances \"% Instance3.Name%, "Altitude", 0x00000000,% Instance3.Altitude% HKR, "Instances \"% Instance3.Name%, "Flags", 0x00010001,% Instance3.Flags%

    ............. Instance1.Name = "SwapBuffers - Средний экземпляр "Instance1.Altitude =" 370000 "Instance1.Flags = 0x1;Подавить автоматическое вложение Instance2.Name = "SwapBuffers - Bottom Instance" Instance2.Altitude = "361000" Instance2.Flags = 0x1;Подавить автоматическое вложение Instance3.Name = "SwapBuffers - Top Instance" Instance3.Altitude = "385100" Instance3.Flags = 0x1;Подавить автоматические вложения

, изменив флаги на 0x1 для подавления автоматических вложений.И только устанавливая мой SwapBuffers miniFilter через этот файл Inf, я получил "STATUS_SUCCESS" из процедуры FltAttachVolume в моем драйвере.Но на самом деле он не подключается к диску ...

Что я делаю не так?Спасибо.

1 Ответ

0 голосов
/ 18 мая 2017
Instance1.Flags = 0x1 

Хорошо.У меня несколько похожий код, и он отлично работает.

status = FltRegisterFilter( DriverObject,
                            &FilterRegistration,
                            &gFilterHandle );

FLT_ASSERT( NT_SUCCESS( status ) );

if (NT_SUCCESS( status )) {
    PSECURITY_DESCRIPTOR sd;
    OBJECT_ATTRIBUTES oa;
    UNICODE_STRING uniString;

    status = FltBuildDefaultSecurityDescriptor(&sd,
        FLT_PORT_ALL_ACCESS);

    if (!NT_SUCCESS(status)) {
        return status;
    }

    RtlInitUnicodeString(&uniString, PORT_NAME);

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

    status = FltCreateCommunicationPort(gFilterHandle,
        &gServerPort,
        &oa,
        NULL,
        Connect,
        Disconnect,
        Message,
        1);

    FltFreeSecurityDescriptor(sd);

    BREAK_HERE(); // DbgBreak() macro

    //
    //  Start filtering i/o
    //

    status = FltStartFiltering(gFilterHandle);

    if (!NT_SUCCESS(status)) {

        FltUnregisterFilter(gFilterHandle);
    }
    else {
        RtlInitUnicodeString(&uniString, L"\\Device\\HarddiskVolume1");
        PFLT_VOLUME vol;
        FltGetVolumeFromName(gFilterHandle, &uniString, &vol);
        status = FltAttachVolume(gFilterHandle, vol, NULL, NULL);
        // status == 0x0 at that point and the mini filter is attached to the Volume
    }
}

Я обычно присоединяюсь ко всем томам, но я хотел попробовать подключиться к одному тому, и он отлично работает.

...