Актуализируя один свой старый драйвер фильтра файловых систем, я стал портировать логику работы с файлами с Zw- и Io- функций на Flt-функции. У меня использовались операция создания файла и, при наступлении определенных условий, операция переименование файла. Описание функции FltCreateFile(...) достаточно однозначно указывает на то, что для переименования нужно использовать FltSetInformationFile(...):
Замена используемого API заняла не так много времени. Но после непродолжительного тестирования выяснилось, что операция переименования стала возвращать ошибку STATUS_ACCESS_DENIED. Обычно этот статус ошибки возвращается там, где идет создание описателя или reference объекта по уже созданному описателю. Именно по этому меня удивил такой статус, возвращенный из функции, работающей с объектом файла. Оказалось, что при переименовании драйвер NTFS сам активно работает с Se-функциями. Для WinXP SP3 захват subject-контекста происходит при следующем стеке вызовов:
Сама проверка, вызов SeAccessCheck(...):
То есть для приведенного выше примера видно, что драйвер NTFS проверяет DesiredAccess == 0x0002 (FILE_WRITE_ACCESS) для AccessMode == 1 (UserMode).
Следовательно при переходе на использование FltSetInformationFile(...) для переименования необходимо обеспечить себе PreviousMode == KernelMode, если операция не должна зависеть от контекста текущей нити.
ΞρεΤΙκ