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


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

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

Синтаксис

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

Параметры

[in] Instance

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

[in] FileObject

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

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

Никакой

Замечания

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

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

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

fltCancelFileOpen необходимо вызвать перед созданием всех дескрипторов для файла. Вызывающие элементы могут проверить элемент флагов структуры FILE_OBJECTFileObject. Если установлен флаг 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 должны работать в IRQL PASSIVE_LEVEL. Тем не менее, это безопасно для драйверов минифильтра вызывать эту подпрограмму из подпрограммы обратного вызова после создания, так как подпрограммы обратного вызова после создания гарантированно вызываются в IRQL PASSIVE_LEVEL в контексте потока, который вызвал запрос IRP_MJ_CREATE.

Требования

Требование Ценность
целевая платформа Всеобщий
заголовка fltkernel.h (include 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