Reparse Points

Тема в разделе "WASM.WIN32", создана пользователем NCRangeR, 12 дек 2004.

  1. NCRangeR

    NCRangeR New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    6
    Адрес:
    Russia
    При помощи FSCTL_SET_REPARSE_POINT устанавливаю reparse point на файл, после чего пытаюсь его открыть.

    ZwCreateFile возвращает ошибку -

    // The layered file system driver for this IO tag did not handle it when needed.

    //

    #define STATUS_IO_REPARSE_TAG_NOT_HANDLED ((NTSTATUS)0xC0000279L)



    В MSDN я видел, что reparse tag-и каким-то образом ассоциируются с драйверами-фильтрами (либо драйверы-фильтры оповещают i/o manager о том, что file_object текущего запроса содержит нужный reparse tag), но так и не понял как это реализовать, и можно ли это обойти?



    Я пытаюсь написать драйвер-фильтр для осуществления прозрачного шифрования, а reparse tag-ами хотел отмечать зашифрованные файлы. Получается, что в случае, когда моего фильтра не будет в системе, зашифрованные файлы вообще будут недоступны. Это, конечно, не очень страшно, но всё-таки?



    И еще вопрос. Каким образом можно (и можно ли) поставить несколько reparse tag-ов на один файл? Я думаю фильтровать все запросы, так или иначе к ним относящиеся, и возвращать в ответ на них ту информацию, какую возвращал бы в случае, если не ставил бы свой reparse point (т.е., сохраняя старые данные и возвращая их). Не знаю, будет ли это работать или нет, но перед тем, как начинать, хотелось бы узнать, нельзя ли сделать это проще?



    И последнее. Никак не могу понять, зачем нужно поле ReparseGuid, и связано ли оно с предыдущим вопросом?
     
  2. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    Проверьте IRQL должен быть = PASSIVE_LEVEL.
     
  3. NCRangeR

    NCRangeR New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    6
    Адрес:
    Russia
    Проверил, IRQL == PASSIVE_LEVEL.



    Способ заставить "пройти" запрос IRP_MJ_CREATE (соответственно, завершиться STATUS_SUCCESS-ом ZwCreateFile) нашел -
    Код (Text):
    1. Irp->IoStatus.Information = IO_REPARSE;    
    2. Irp->IoStatus.Status = STATUS_REPARSE;




    Однако, теперь на все вызовы ZwRead(Write)File отвечает STATUS_INVALID_DEVICE_REQUEST-ом. Опять непонятно, почему.



    Может, я что-то недопонимаю касательно того, для чего вообще нужны reparse points?..
     
  4. amdf

    amdf New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2011
    Сообщения:
    39
    1) Без фильтра обычным способом reparse-файл не открыть.
    2) Несколько reparse tag'ов на файл поставить нельзя, только один.
    3) Отмечать файлы путём навешивания на них reparse - плохая идея. Лучше маркировать потоком NTFS, или использовать расширенные атрибуты (EA), которые тоже в NTFS поддерживаются.
    4) ReparseGuid зачем-то придумали в Microsoft. При манипуляции с reparse, например, чтоб её удалить, надо знать не только reparse tag, но и GUID. Зачем так - спрашивать надо у MS.