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_OBJECT 结构的成员,FileObject 参数指向。 如果设置了FO_HANDLE_CREATED标志,这意味着已为文件创建了一个或多个句柄,因此调用 FltCancelFileOpen不安全。

FltCancelFileOpen 设置 标志FileObject 指向的文件对象的FO_FILE_OPEN_CANCELLED标志。 此标志指示已取消创建作,并且将为此文件对象发出 close (IRP_MJ_CLOSE) 请求。

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

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

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

要求

要求 价值
目标平台 普遍
标头 fltkernel.h (包括 Fltkernel.h)
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