Фильтр файловой системы

Тема в разделе "WASM.NT.KERNEL", создана пользователем AntiB, 4 июн 2009.

  1. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Доброе время суток!
    У меня вопрос - почему может функция: FltRegisterFilter возвращать ошибку C0000034h ?
    вызов:
    CONST FLT_REGISTRATION FilterRegistration = {

    sizeof( FLT_REGISTRATION ), // Size
    FLT_REGISTRATION_VERSION, // Version
    0, // Flags

    NULL, // Context
    Callbacks, // Operation callbacks

    DriverUnload, // FilterUnload

    fInstanceSetup, // InstanceSetup
    fInstanceQueryTeardown, // InstanceQueryTeardown
    fInstanceTeardownStart, // InstanceTeardownStart
    fInstanceTeardownComplete, // InstanceTeardownComplete

    NULL, // GenerateFileName
    NULL, // GenerateDestinationFileName
    NULL // NormalizeNameComponent

    };

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


    Заранее спасибо!
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Скорее всего, некорректная установка, в частности, не хватает соответствующих записей в реестре. Ссылка по теме здесь.
     
  3. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    x64
    Спасибо, уже нашел где был баг )

    Вопрос второй - регистрируется фильтр, даже запускается, но callback-и не запускаются, почему? (callback-и - это простые заглушки которые выводят сообщения в дебагере)
    Код (Text):
    1. CONST FLT_REGISTRATION FilterRegistration = {
    2.  
    3.     sizeof( FLT_REGISTRATION ),         //  Size
    4.     FLT_REGISTRATION_VERSION,           //  Version
    5.     0,                                  //  Flags
    6.  
    7.     NULL,                               //  Context
    8.     Callbacks,                          //  Operation callbacks
    9.  
    10.     DriverUnload,                       //  FilterUnload
    11.  
    12.     NULL,                               //  InstanceSetup
    13.     SpyQueryTeardown,                   //  InstanceQueryTeardown
    14.     NULL,                               //  InstanceTeardownStart
    15.     NULL,                               //  InstanceTeardownComplete
    16.  
    17.     NULL,                               //  GenerateFileName
    18.     NULL,                               //  GenerateDestinationFileName
    19.     NULL                                //  NormalizeNameComponent
    20.  
    21. };
    Код (Text):
    1.     __try {
    2.         //
    3.         // Make driver unloadable
    4.         //
    5.  
    6.         DriverObject->DriverUnload = DriverUnload;
    7.  
    8.         //
    9.         // Create device
    10.         //
    11.  
    12.         status = IoCreateDevice( DriverObject,
    13.                                  0,
    14.                                  &DriverName,
    15.                                  FILE_DEVICE_UNKNOWN,
    16.                                  0,
    17.                                  TRUE,
    18.                                  &FilterData.DeviceObject );
    19.  
    20.         if (!NT_SUCCESS( status )) {
    21.             __leave;
    22.         }
    23.  
    24.         //
    25.         // Create symbolic link
    26.         //
    27.  
    28.         status = IoCreateSymbolicLink( &SymbolicLinkName,
    29.                                        &DriverName );
    30.  
    31.         if (!NT_SUCCESS( status )) {
    32.             IoDeleteDevice( FilterData.DeviceObject );
    33.             return status;
    34.         }
    35.  
    36.         //
    37.         //  Register with FltMgr
    38.         //
    39.  
    40.         status = FltRegisterFilter( DriverObject,
    41.                                     &FilterRegistration,
    42.                                     &FilterData.FilterHandle );
    43.  
    44.         DbgBp();
    45.  
    46.         if (!NT_SUCCESS( status )) {
    47.             __leave;
    48.         }
    49.  
    50.         status  = FltBuildDefaultSecurityDescriptor( &sd,
    51.                                                      FLT_PORT_ALL_ACCESS );
    52.  
    53.         if (!NT_SUCCESS( status )) {
    54.             __leave;
    55.         }
    56.  
    57.         RtlInitUnicodeString( &uniString, FILTER_PORT_NAME );
    58.  
    59.         InitializeObjectAttributes( &oa,
    60.                                     &uniString,
    61.                                     OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
    62.                                     NULL,
    63.                                     sd );
    64.  
    65.         status = FltCreateCommunicationPort( FilterData.FilterHandle,
    66.                                              &FilterData.ServerPort,
    67.                                              &oa,
    68.                                              NULL,
    69.                                              SpyConnect,
    70.                                              SpyDisconnect,
    71.                                              SpyMessage,
    72.                                              1 );
    73.  
    74.         FltFreeSecurityDescriptor( sd );
    75.  
    76.         if (!NT_SUCCESS( status )) {
    77.             __leave;
    78.         }
    79.  
    80.         //
    81.         //  Start filtering i/o
    82.         //
    83.  
    84.         status = FltStartFiltering( FilterData.FilterHandle );
    85.  
    86.         if (!NT_SUCCESS( status )) {
    87.             FltUnregisterFilter( FilterData.FilterHandle );
    88.         }
    89.  
    90.         DbgPrint("Helow from kernel!\n");
    91.     } __finally {
    92.  
    93.         if (!NT_SUCCESS( status )) {
    94.  
    95.             if (FilterData.ServerPort != NULL) {
    96.                 FltCloseCommunicationPort( FilterData.ServerPort );
    97.             }
    98.  
    99.             if (FilterData.FilterHandle != NULL) {
    100.                 FltUnregisterFilter( FilterData.FilterHandle );
    101.             }
    102.  
    103.         }
    104.  
    105.     }
    Заранее Спасибо!
     
  4. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Всем спасибо - разобрался!
     
  5. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Как можно узнать путь к файлу или папке которую затребовала пользовательская программа для открытия ? (IRP_MJ_CREATE) Хоть подскажите в какую строну рыть.

    Всем заранее спасибо
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    О, эта задачка мягко говоря непростая. Если по-простому для и тестов нужно, тогда IoVolumeDeviceToDosName() + pIoStackLocation->FileObject->FileName. Если нужно грамотное коммерческое решение, тогда см. соответствующие посты у меня в блоге, плюс кое-какие трюки. Работа с именами файлов в ядре - штука геморройная, надо чётко понимать, что там с ними происходит.
     
  7. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Спасибо, поищу!
     
  8. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Как можно запретить загрузку файла? например я уже нашел что данный запрос должен быть отклонен, как мне это сделать? как я понимаю нужно вернуть FLT_PREOP_COMPLETE статус, но после этого - идет exception все время

    Где подводные камни? что делаю не так?

    Заранее спасибо!
     
  9. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Что есть "загрузка"? Открытие файла или что-то ещё?

    Да, но перед этим следует установить, например, STATUS_ACCESS_DENIED в поле Data->IoStatus.Status.

    Какой exception? Где? Код покажи. Слишком мало информации для анализа.
     
  10. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    я имел виду открытие (IRP_MJ_CREATE)
    ну етого я не учел
    exception 0xC0000005, пока что не определил где (не успел), но это происходит только после того как я сделал return FLT_PREOP_COMPLETE;
     
  11. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    сделал STATUS_ACCESS_DENIED в поле Data->IoStatus.Status - exception больше нету!

    Большое Спасибо!
     
  12. movdqu

    movdqu New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    33
    А как была решена проблема как-нибудь знает ?

    Я всегда писал legacy и тут решил попробывать mini filter.

    FltRegisterFilter проходит успешно, FltStartFiltering аналогично, но калбеки не вызываются.

    Ключи
    Instances
    Altitude
    Flags
    DefaultInstance
    добавляю в DriverEntry
     
  13. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Во-первых, какие именно колбеки тебе нужны? Ты уверен, что правильно заполнил структуру FLT_REGISTRATION и, в частности, поле-массив OperationRegistration? Во-вторых, ты пробовал сделать всё в точности так, как в сэмплах WDK из папки \src\filesys\miniFilter?