Драйвер минифильтра. Проблемы с подключением фильтра

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

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

PFLT_VOLUME том; UNICODE_STRING vимя; .... RtlInitUnicodeString(&vname, L"E:\"); FltGetVolumeFromName(gFilterHandle, &vname, &vol); ... FltAttachVolume(gFilterHandle, vol, NULL, NULL); ...

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

Если я вызываю FltAttachVolume с трехмерным параметром «НЕ NULL», например «UniqueInstaceName», он возвращает мне "-2145452013".

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

... driver.driverName = L"swapBuffers"; ... LPCWSTR vname = L"F:\"; ... FilterAttach(driver.driverName, vname, NULL, NULL, NULL);

С трехмерным параметром "NULL" (LPCWSTR lpInstanceName): "ERROR_FLT_INSTANCE_NAME_COLLISION"

С НЕНУЛЕМ: "-2145452013".

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

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

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

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

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

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

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


person Art    schedule 08.05.2011    source источник


Ответы (1)


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
    }
}

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

person E.T    schedule 17.05.2017
comment
Я пробовал это, но получил, что система не может найти указанный файл и сразу синий экран... - person SuperBerry; 21.12.2017
comment
Извините, сообщение связано с тем, что оно не завершило инициализацию (FltStartFiltering не был вызван) и сразу же синий экран... - person SuperBerry; 21.12.2017