Доброго дня форумчанам. Попробовал ограничить права доступа к произвольному файлу только на чтение и столкнулся со странным поведением: если возвращать из Pre-каллбэка FLT_PREOP_COMPLETE, то независимо от прав доступа и статуса доступ к файлу блокируется полностью - нельзя ни удалить, ни прочитать, ни записать. Код: https://hastebin.com/gecokodase.c Как правильно?
Даже если сделать так: Код (C): Data->IoStatus.Status = STATUS_SUCCESS; FltSetCallbackDataDirty(Data); return FLT_PREOP_COMPLETE; Доступ к файлу блокируется намертво.
Хм. Полагаю, из-за того, что запрос не идёт дальше по стеку фильтров. Следовательно, FLT_PREOP_COMPLETE нужно возвращать только в случае отмены операции, и тогда IoStatus.Status будет показывать ошибку, так? Тогда идём дальше - можно ли явно ограничивать хэндл файла в правах? По типу этого: Код (C): Data->Iopb->Parameters.Create.SecurityContext->DesiredAccess = SYNCHRONIZE | FILE_WRITE_DATA;
HoShiMin, Вы задаёте вопросы, бесконечный их поток, решение которых сводится к отладке. Установите наконец виндбг и отлаживайте. Нет времени и людей на анализ каждой вашей ошибки. У каждой ошибки есть причина, эта причина выясняется на основе документации на конкретный механизм, в котором произошла ошибка или же путём отладки, для выяснения в каком месте ядра произошёл фейл. Это нт, сурков мы не имеем, такое только отлаживается. Если вы по какой то причине не можите отладить - опишите почему, но вы должны понимать сам принцип решения проблем. Так например для решения вашей предыдущей проблемы матчасти не достаточно, вы должны были отладить и показать место, где ядро отклоняет нотификацию. Вы это не удосужились" сделать.
В прошлом вопросе всё решилось правкой inf'a: если делаешь не по матчасти - не стоит надеяться, что оно будет работать. Сейчас же вопрос больше по самой концепции: возможно ли урезать в правах открывающийся хэндл, как в ObRegisterCallbacks, или есть только возможность отшить процесс с STATUS_ACCESS_DENIED'ом при попытке открыть файл с "лишними" правами