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


Завершение операции ввода-вывода в процедуре обратного вызова перед операцией

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

Когда драйвер мини-фильтра завершает операцию ввода-вывода, диспетчер фильтров выполняет следующие действия:

  • Не отправляет операцию в драйверы минифильтра ниже текущего драйвера минифильтра, в устаревшие фильтры или в файловую систему.

  • Вызывает подпрограммы обратного вызова после операции драйверов минифильтра над текущим драйвером минифильтра в стеке экземпляров драйвера минифильтра.

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

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

  1. Установка в поле IoStatus.Status структуры данных обратного вызова окончательного значения NTSTATUS для операции.

  2. Возврат FLT_PREOP_COMPLETE.

Подпрограмма обратного вызова перед операцией, которая завершает операцию ввода-вывода, не может задать контекст завершения, отличный от NULL (в выходном параметре CompletionContext ).

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

  1. Установка в поле IoStatus.Status структуры данных обратного вызова окончательного значения NTSTATUS для операции.

  2. Передача FLT_PREOP_COMPLETE в параметре CallbackStatus , когда рабочая подпрограмма вызывает FltCompletePendedPreOperation.

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

Завершение операции ввода-вывода часто называется успешной или неудачной операцией в зависимости от значения NTSTATUS:

  • Успешное выполнение операции ввода-вывода означает завершение ее с помощью успешного или информационного значения NTSTATUS, например STATUS_SUCCESS.

  • Сбой операции ввода-вывода означает завершение операции с ошибкой или предупреждением NTSTATUS, например STATUS_INVALID_DEVICE_REQUEST или STATUS_BUFFER_OVERFLOW.

Значения NTSTATUS определяются в ntstatus.h. Эти значения делятся на четыре категории: успешное, информационное, предупреждение и ошибка. Дополнительные сведения об этих значениях см. в разделе Использование значений NTSTATUS.