FltCheckOplockEx 函数 (fltkernel.h)
微筛选器驱动程序调用 FltCheckOplockEx 例程,以同步基于 IRP 的文件 I/O 操作的回调数据结构,该操作具有当前机会锁 (oplock) 文件的状态。
语法
FLT_PREOP_CALLBACK_STATUS FLTAPI FltCheckOplockEx(
[in] POPLOCK Oplock,
[in] PFLT_CALLBACK_DATA CallbackData,
[in] ULONG Flags,
[in, optional] PVOID Context,
[in, optional] PFLTOPLOCK_WAIT_COMPLETE_ROUTINE WaitCompletionRoutine,
[in, optional] PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE PrePostCallbackDataRoutine
);
参数
[in] Oplock
文件的不透明不锁定指针。 此指针必须已由之前对 FltInitializeOplock 的调用初始化。
[in] CallbackData
指向 I/O 操作 FLT_CALLBACK_DATA结构的回调数据的指针。
[in] Flags
关联文件 I/O 操作的位掩码。 微筛选器驱动程序设置位以指定 FltCheckOplockEx 的行为。 Flags 参数具有以下选项:
OPLOCK_FLAG_COMPLETE_IF_OPLOCKED (0x00000001)
允许机会性锁中断继续进行,而不会阻止或挂起导致 oplock 中断的操作。
OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY (0x00000002)
指定 FltCheckOplockEx 应仅检查与 I/O 操作关联的FILE_OBJECT上的机会锁键。 此 I/O 操作由 CallbackData 参数指向的回调数据表示。 然后,如果 I/O 操作中提供了密钥,则 FltCheckOplockEx 必须添加密钥。 不会发生其他 oplock 处理;也就是说,不会发生机会性锁中断。
OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK (0x00000004)
指定 FsRtlCheckOplockEx 应还原之前通过调用 FltOplockFsctrl 例程设置的任何状态。 处理IRP_MJ_CREATE请求时调用 FltOplockFsctrl。 此IRP_MJ_CREATE请求指定 create options 参数中的FILE_OPEN_REQUIRING_OPLOCK标志。 OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK标志通常在以前失败时用于此类创建请求的最终处理。
OPLOCK_FLAG_IGNORE_OPLOCK_KEYS (0x00000008)
允许所有机会性锁中断继续进行,而不考虑机会性锁键。
[in, optional] Context
指向要传递给 WaitCompletionRoutine 和 PrePostCallbackDataRoutine 指向的回调例程的调用方定义的上下文信息的指针。 筛选器管理器将此信息视为不透明信息。
[in, optional] WaitCompletionRoutine
指向调用方提供的回调例程的指针。 如果 oplock 中断正在进行中,筛选器管理器会在 oplock 中断完成时调用此例程。 此参数是可选的,可以为 NULL。 如果为 NULL,则调用方将进入等待状态,直到完成 oplock 中断。
此例程声明如下:
typedef VOID
(*PFLTOPLOCK_WAIT_COMPLETE_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
此例程具有以下参数:
CallbackData
指向 I/O 操作的回调数据结构的指针。
上下文
在 Context 参数中传递到 FltCheckOplockEx 的上下文信息指针。
[in, optional] PrePostCallbackDataRoutine
指向调用方提供的回调例程的指针,该例程在 I/O 操作发布到工作队列时调用。 此参数是可选的,可以为 NULL。
此例程声明如下:
typedef VOID
(*PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
CallbackData
指向 I/O 操作的回调数据结构的指针。
上下文
在 Context 参数中传递到 FltCheckOplockEx 的上下文信息指针。
返回值
FltCheckOplockEx 返回以下FLT_PREOP_CALLBACK_STATUS代码之一:
返回代码 | 说明 |
---|---|
|
FltCheckOplockEx 遇到池分配失败,或者对 FsRtlCheckOplockEx 函数的调用返回错误。 FltCheckOplockEx 在 FLT_CALLBACK_DATA 回调数据结构的 IoStatus 成员的 IO_STATUS_BLOCK 结构的 Status 成员中设置错误代码。 CallbackData 参数指向此FLT_CALLBACK_DATA结构。 |
|
启动 oplock 中断,导致筛选器管理器将 I/O 操作发布到工作队列。 I/O 操作由 CallbackData 参数指向的回调数据表示。 |
|
CallbackData 参数指向的回调数据未插入,并且会立即执行 I/O 操作。 请注意,如果在 Flags 参数中OPLOCK_FLAG_COMPLETE_IF_OPLOCKED指定的调用方,则即使 I/O 操作未插入,oplock 中断实际上也可能正在进行中。 若要确定情况是否如此,调用方应在FLT_CALLBACK_DATA回调数据结构的 IoStatus 成员的 IO_STATUS_BLOCK 结构的 Status 成员中STATUS_OPLOCK_BREAK_IN_PROGRESS检查。 |
注解
微筛选器驱动程序调用 FltCheckOplockEx ,以根据以下条件将基于 IRP 的 I/O 操作与文件的当前 oplock 状态同步:
如果 I/O 操作会导致 oplock 中断,则会启动 oplock 中断。
如果 I/O 操作在 oplock 中断完成之前无法继续, 则 FltCheckOplockEx 将返回FLT_PREOP_PENDING并调用 PrePostCallbackDataRoutine 参数指向的回调例程。
如果微筛选器驱动程序使用 oplock,则必须从任何预操作回调 (调用 FltCheckOplockEx,PFLT_PRE_OPERATION_CALLBACK) 例程进行可能导致 oplock 中断的 I/O 操作。 此规则适用于以下类型的 I/O 操作,因为这些操作可能会导致 oplock 中断:
IRP_MJ_CLEANUP
IRP_MJ_CREATE
IRP_MJ_FILE_SYSTEM_CONTROL
IRP_MJ_FLUSH_BUFFERS
IRP_MJ_LOCK_CONTROL
IRP_MJ_READ
IRP_MJ_SET_INFORMATION
IRP_MJ_WRITE
I/O 操作必须是基于 IRP 的 I/O 操作。 若要确定给定的回调数据结构是否表示基于 IRP 的 I/O 操作,请使用 FLT_IS_IRP_OPERATION 宏。
微筛选器不得在 WaitCompletionRoutine 中指定的回调中再次调用 FltCheckOplockEx。 如果 oplock 包在 FltCheckOplockEx 返回之前调用完成回调,则这样做可能会导致死锁情况。
有关机会锁的详细信息,请参阅Microsoft Windows SDK文档。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | FltCheckOplockEx 例程从 Windows 7 开始可用。 |
目标平台 | 通用 |
标头 | fltkernel.h (包括 Fltkernel.h) |
Library | FltMgr.lib |
IRQL | <= APC_LEVEL |