Драйвер для перенаправления файлов

Тема в разделе "WASM.NT.KERNEL", создана пользователем vasalvit, 8 апр 2008.

  1. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Здравствуйте.

    Есть такая задача. Написать драйвер мини-фильтр, который бы при просмотре каталога 'c:\my' отдавал содержимое каталога 'd:\my'.

    При обработке 'pre-create' я:
    1. сохраняю переданный PFILE_OBJECT
    2. открываю каталог 'd:\my'
    3. устанавливаю PFILE_OBJECT открытого каталога.
    4. устанавливаю статус STATUS_SUCCESS и результат FLT_PREOP_COMPLETE
    5. обработка завершена

    Тем не менее, мои функции IRP_MJ_CLOSE и IRP_MJ_QUERY_DIRECTORY для перехваченного объекта не вызываются.

    Что я делаю не так?

    Есть ещё один вариант. Во время обработки 'pre-create' подменять имя каталога, а во время 'post-create' возвращать его назад. Работоспособен ли такой способ?
     
  2. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    vasalvit

    Да
    А зачем его возвращать назад? В чем смысл?
    в IRP_MJ_QUERY_INFORMATION будешь букву инкрементить и все дела
    Никто не узнает что это D: на самом деле :)
     
  3. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Не. Вариант с подменой имени почему-то не прокатывает. Система возвращает 'STATUS_INVALID_PARAMETER'.

    Я делаю так:
    1. в pre-create создаю объект каталога
    2. возвращаю его в pData->Iopb->TargetFileObject
    3. вызываю 'FltSetCallbackDataDirty'
    4. создаю контекст для этого объекта
    5. возвращаю 'FLT_PREOP_COMPLETE'

    Но в pre-close мне приходит прежний объект файла без моего контекста. 'FltGetStreamHandleContext' возвращает 'STATUS_NOT_SUPPORTED'.

    В чём может быть проблема?
     
  4. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    проблема в том что ты юзаешь FltManager
    пиши проще :)
     
  5. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Немного не понял.
    Везде советуют переходить на мини-фильтры. А тут - обратный совет :)
    К тому же есть требование - написать драйвер мини-фильтр, вот и мучаюсь :)
     
  6. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    А как ты заменяешь строку? надо Сделать

    wcscpy
    RtlInitUnicodeString
     
  7. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Использовал 'RtlCreateUnicodeString' и 'RtlFreeUnicodeString'.

    Но там другая проблема. Если используется язык C, то чтобы добраться до имени файла необходима два раза снять 'CONST'. Уверен, что не зря M$ так хорошо спрятали имя файла :)

    Но просто подменить имя файла не получится. Мне нужно, чтобы ни одна прога и не догадывалась о том, что работает с другим файлом :)
     
  8. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    посмотри исходники HE4 либо пиши в юзермоде
     
  9. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Можно поподробнее, что за 'HE4'.
    А по поводу user-mode ... Есть требование - нужен драйвер мини-фильтр.
     
  10. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    HE4 это руткит)
     
  11. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Возможно что проблема в том, что фильтр-менеджер не знает о проделанных тобою изменениях. В случае изменения параметров переданных в твою callback, в большинстве случаев необходимо вызвать функцию FLT_SET_CALLBACK_DATA_DIRTY(), правда не во всех. Но в случае изменения TargetFileObject Microsoft требует вызова данной функции. Она информирует фильтр-менеджер, что данные изменились.
     
  12. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Здравствуйте.

    Я попробовал использовать reparse — всё работает !!!

    Но есть одна проблема. Если натравить verifier на мой драйвер, то при его выгрузке получаю крэш:

    Код (Text):
    1. DRIVER_VERIFIER_DETECTED_VIOLATION (c4)
    2. A device driver attempting to corrupt the system has been caught.  This is
    3. because the driver was specified in the registry as being suspect (by the
    4. administrator) and the kernel has enabled substantial checking of this driver.
    5. If the driver attempts to corrupt the system, bugchecks 0xC4, 0xC1 and 0xA will
    6. be among the most commonly seen crashes.
    7.         Parameter 1 = 0x1000 .. 0x1020 - deadlock verifier error codes.
    8.                Typically the code is 0x1001 (deadlock detected) and you can
    9.                issue a '!deadlock' KD command to get more information.
    10. Arguments:
    11. Arg1: 00000060, A driver has forgotten to free its pool allocations prior to unloading.
    12. Arg2: 00000000, paged bytes
    13. Arg3: 0000084c, nonpaged bytes,
    14. Arg4: 00000011, total # of (paged+nonpaged) allocations that weren't freed.
    15.     To get the name of the driver at fault, type
    16.     dp ViBadDriver l1; dS @$p
    17.     Then type !verifier 3 drivername.sys for info on the allocations
    18.     that were leaked that caused the bugcheck.
    Если verifier выключен — то драйвер выгружается нормально.

    После экспериментов я выяснил, что verifier ругается на выделение памяти под новое имя файла, прежде чем вернуть STATUS_REPARSE. Естественно, я эту память не освобождаю — подразумевается, что это сделает система.

    Это серьёзная проблема, или можно проигнорировать verifier?
     
  13. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    vasalvit
    Если выделил ты - то система и пальцем не двинет. "Нагадил - подотри" (С) Four-F
     
  14. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Да, эту цитату я знаю :)

    http://support.microsoft.com/kb/319447

    Вот отсюда взята идея. Там освобождается системный буфер и выделяется свой. Свой буфер не освобождается.

    Я делаю точно также. А verifier ловит меня :dntknw:
     
  15. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    vasalvit

    ты наверное таг свой ставишь
     
  16. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Извините за беспокойство :) Это я лажанулся :)
     
  17. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    vasalvit
    У нас существует правило на форуме - если сам нашел ответ - поделиться с ним. Чтоб не плодились похожие топики. Это ж всеже база знаний, а не вопросов )
     
  18. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Это чисто моя проблема :)

    Я написал простенький драйвер. Он перенаправлял файлы на самих себя. Реального перенаправления не было.
    Тестировал этот драйвер и на реальной и на виртуальной машине. По работе проблем не было, но при завершении ....

    Я решил не обращать на это внимание. Продолжил написание. Теперь драйвер перенаправлял не все файлы, а только введённые пользователем. Проблема с некорректным завершением исчезла.

    Почему так - не знаю :) Но проблема исчезла :)