Завершение операции ввода-вывода в процедуре обратного вызова перед операцией
Чтобы завершить операцию ввода-вывода, можно остановить обработку операции, присвойте ей окончательное значение NTSTATUS и верните его в диспетчер фильтров.
Когда драйвер мини-фильтра завершает операцию ввода-вывода, диспетчер фильтров выполняет следующие действия:
Не отправляет операцию в драйверы минифильтра ниже текущего драйвера минифильтра, в устаревшие фильтры или в файловую систему.
Вызывает подпрограммы обратного вызова после операции драйверов минифильтра над текущим драйвером минифильтра в стеке экземпляров драйвера минифильтра.
Не вызывает подпрограмму обратного вызова после операции текущего драйвера минифильтра для операции, если она существует.
Подпрограмма обратного вызова драйвера мини-фильтра завершает операцию ввода-вывода, выполнив следующие действия.
Установка в поле IoStatus.Status структуры данных обратного вызова окончательного значения NTSTATUS для операции.
Возврат FLT_PREOP_COMPLETE.
Подпрограмма обратного вызова перед операцией, которая завершает операцию ввода-вывода, не может задать контекст завершения, отличный от NULL (в выходном параметре CompletionContext ).
Драйвер минифильтра также может завершить операцию в рабочей процедуре для ранее созданной операции ввода-вывода, выполнив следующие действия.
Установка в поле IoStatus.Status структуры данных обратного вызова окончательного значения NTSTATUS для операции.
Передача 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.