Поделиться через


Сбой операции ввода-вывода в подпрограмме обратного вызова после операции

Подпрограмма обратного вызова драйвера минифильтра после операции может завершиться успешной операцией ввода-вывода, но просто сбой операции ввода-вывода не отменяет эффект операции. Драйвер минифильтра отвечает за выполнение любой обработки, необходимой для отмены операции.

Например, подпрограмма обратного вызова драйвера минифильтра после создания может завершиться успешной IRP_MJ_CREATE операции, выполнив следующие действия:

  1. Вызов метода FltCancelFileOpen для закрытия файла, который был создан или открыт операцией создания. Обратите внимание, что FltCancelFileOpen не отменяет никаких изменений в файле. Например, FltCancelFileOpen не удаляет только что созданный файл или не восстанавливает усекенный файл до предыдущего размера.

  2. Установка в поле IoStatus.Status структуры данных обратного вызова окончательного значения NTSTATUS для операции. Это значение должно быть допустимым значением NTSTATUS ошибки, например STATUS_ACCESS_DENIED.

  3. Установка для поля IoStatus.Information структуры данных обратного вызова равным нулю.

  4. Возврат FLT_POSTOP_FINISHED_PROCESSING.

Если в поле IoStatus.Status структуры данных обратного вызова задано окончательное значение NTSTATUS для операции, драйвер минифильтра должен указать допустимое значение NTSTATUS ошибки. Обратите внимание, что драйверы минифильтра не могут указывать STATUS_FLT_DISALLOW_FAST_IO; Только диспетчер фильтров может использовать это значение NTSTATUS.

Вызывающие функции FltCancelFileOpen должны выполняться в IRQL <= APC_LEVEL. Однако драйвер минифильтра может безопасно вызывать эту подпрограмму из подпрограммы обратного вызова после создания, так как для IRP_MJ_CREATE операций подпрограмма обратного вызова после операции вызывается по адресу IRQL = PASSIVE_LEVEL в контексте потока, из которого была создана операция создания.