При помощи 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, и связано ли оно с предыдущим вопросом?
Проверил, IRQL == PASSIVE_LEVEL. Способ заставить "пройти" запрос IRP_MJ_CREATE (соответственно, завершиться STATUS_SUCCESS-ом ZwCreateFile) нашел - Код (Text): Irp->IoStatus.Information = IO_REPARSE; Irp->IoStatus.Status = STATUS_REPARSE; Однако, теперь на все вызовы ZwRead(Write)File отвечает STATUS_INVALID_DEVICE_REQUEST-ом. Опять непонятно, почему. Может, я что-то недопонимаю касательно того, для чего вообще нужны reparse points?..
1) Без фильтра обычным способом reparse-файл не открыть. 2) Несколько reparse tag'ов на файл поставить нельзя, только один. 3) Отмечать файлы путём навешивания на них reparse - плохая идея. Лучше маркировать потоком NTFS, или использовать расширенные атрибуты (EA), которые тоже в NTFS поддерживаются. 4) ReparseGuid зачем-то придумали в Microsoft. При манипуляции с reparse, например, чтоб её удалить, надо знать не только reparse tag, но и GUID. Зачем так - спрашивать надо у MS.