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 值,但对于使用 STATUS_REPARSE 完成的创建操作,不需要调用 FltCancelFileOpen ,因为此状态值指示文件未成功打开。
 
成功调用 FltCancelFileOpen 将产生以下效果:如果微筛选器驱动程序和微筛选器驱动程序实例堆栈中调用方上方的旧筛选器,创建请求似乎已失败。 对调用方下方的用户,该文件似乎已打开 (或创建) ,然后关闭。

请注意, FltCancelFileOpen 不会撤消对文件的任何修改。 例如, FltCancelFileOpen 不会删除新创建的文件,也不会还原被覆盖或取代到其先前状态的文件。

必须先调用 FltCancelFileOpen,然后才能为文件创建任何句柄。 调用方可以检查 FileObject 参数指向的 FILE_OBJECT 结构的 Flags 成员。 如果设置了FO_HANDLE_CREATED标志,这意味着已为文件创建了一个或多个句柄,因此调用 FltCancelFileOpen 是不安全的。

FltCancelFileOpenFileObject 指向的文件对象的 Flags 成员中设置FO_FILE_OPEN_CANCELLED标志。 此标志指示已取消创建操作,并将为此文件对象发出关闭 ( IRP_MJ_CLOSE) 请求。

取消创建操作后,无法重新发出。 有关详细信息,请参阅 FltReissueSynchronousIo

FltCancelFileOpen 只能从微筛选器驱动程序的创建后回调例程调用。 从任何其他类型的 I/O 操作的后操作回调 (PFLT_POST_OPERATION_CALLBACK) 例程调用 FltCancelFileOpen,或者从预操作回调 (PFLT_PRE_OPERATION_CALLBACK) 例程调用,都是编程错误。

FltCancelFileOpen 的调用方必须在 IRQL PASSIVE_LEVEL运行。 但是,微筛选器驱动程序从创建后回调例程调用此例程是安全的,因为保证在发起IRP_MJ_CREATE请求的线程上下文中,在 IRQL PASSIVE_LEVEL调用创建后回调例程。

要求

要求
目标平台 通用
标头 fltkernel.h (包括 Fltkernel.h)
Library FltMgr.lib
DLL Fltmgr.sys
IRQL PASSIVE_LEVEL (请参阅“备注”部分)

另请参阅

FILE_OBJECT

FLT_CALLBACK_DATA

FLT_IS_REISSUED_IO

IRP_MJ_CREATE 的 FLT_PARAMETERS

FltReissueSynchronousIo

FltSetCallbackDataDirty

IRP_MJ_CLOSE

IRP_MJ_CREATE

IoCancelFileOpen

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK