Функция FltCancelFileOpen (fltkernel.h)

Драйвер минифильтра может использовать подпрограмму FltCancelFileOpen , чтобы закрыть только что открытый или созданный файл.

Синтаксис

VOID FLTAPI FltCancelFileOpen(
  [in] PFLT_INSTANCE Instance,
  [in] PFILE_OBJECT  FileObject
);

Параметры

[in] Instance

Указатель непрозрачного экземпляра для вызывающего объекта. Этот параметр является обязательным и не может иметь значение NULL.

[in] FileObject

Указатель файлового объекта для файла. Этот параметр является обязательным и не может иметь значение NULL.

Возвращаемое значение

None

Remarks

Если драйвер минифильтра определяет, что операция открытия файла или создания файла (IRP_MJ_CREATE) должна завершиться сбоем после завершения операции с успешным значением NTSTATUS, например STATUS_SUCCESS, драйвер минифильтра может вызвать FltCancelFileOpen из своей подпрограммы обратного вызова после создания, чтобы закрыть файл.

Примечание Хотя STATUS_REPARSE является значением NTSTATUS успешно, вызывать FltCancelFileOpen для операции создания, которая была завершена с STATUS_REPARSE, не нужно, так как это значение состояния указывает, что файл не был успешно открыт.
 
Успешный вызов FltCancelFileOpen имеет следующий эффект: Для драйверов минифильтра и устаревших фильтров, которые находятся над вызывающим элементом в стеке экземпляров драйвера минифильтра, запрос на создание, как представляется, завершился сбоем. Для тех, которые находятся под вызывающим элементом, файл, как представляется, был открыт (или создан), а затем закрыт.

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

Перед созданием дескрипторов для файла необходимо вызвать FltCancelFileOpen. Вызывающие объекты могут проверка элемент Flagsструктуры FILE_OBJECT, на которую указывает параметр FileObject. Если установлен флаг FO_HANDLE_CREATED, это означает, что для файла был создан один или несколько дескрипторов, поэтому вызывать FltCancelFileOpen небезопасно.

FltCancelFileOpen задает флаг FO_FILE_OPEN_CANCELLED в элементе Flags объекта файла, на который указывает FileObject . Этот флаг указывает, что операция создания была отменена, и для этого объекта файла будет выдан запрос на закрытие (IRP_MJ_CLOSE).

После отмены операции создания ее нельзя будет повторно выпустить. Дополнительные сведения см. в разделе FltReissueSynchronousIo.

Метод FltCancelFileOpen можно вызвать только из процедуры обратного вызова драйвера минифильтра после создания. Вызов Метода FltCancelFileOpen из подпрограммы обратного вызова после операции (PFLT_POST_OPERATION_CALLBACK) для любого другого типа операции ввода-вывода или вызов из подпрограммы обратного вызова перед операцией (PFLT_PRE_OPERATION_CALLBACK) является программной ошибкой.

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

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть fltkernel.h (включая Fltkernel.h)
Библиотека FltMgr.lib
DLL Fltmgr.sys
IRQL PASSIVE_LEVEL (см. раздел "Примечания")

См. также раздел

FILE_OBJECT

FLT_CALLBACK_DATA

FLT_IS_REISSUED_IO

FLT_PARAMETERS для IRP_MJ_CREATE

FltReissueSynchronousIo

FltSetCallbackDataDirty

IRP_MJ_CLOSE

IRP_MJ_CREATE

IoCancelFileOpen

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK