微型筛选器驱动程序调用 FltCheckOplock,以将基于 IRP 的文件 I/O作的回调数据结构与文件的当前机会锁(oplock)状态同步。
语法
FLT_PREOP_CALLBACK_STATUS FLTAPI FltCheckOplock(
[in] POPLOCK Oplock,
[in] PFLT_CALLBACK_DATA CallbackData,
[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, optional] Context
指向要传递给 waitCompletionRoutine 和
[in, optional] WaitCompletionRoutine
指向调用方提供的回调例程的指针。 如果作锁中断正在进行中,筛选器管理器会在完成 oplock 中断时调用此例程。 此参数是可选的,可以是 NULL。 如果为 NULL,则调用方将进入等待状态,直到 oplock 中断完成。
此例程声明如下:
typedef VOID
(*PFLTOPLOCK_WAIT_COMPLETE_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
地点:
CallbackData 是指向 I/O作的 FLT_CALLBACK_DATA 结构的指针。
Context 是在 Context 参数中传递给 FltCheckOplock 的上下文信息指针。
[in, optional] PrePostCallbackDataRoutine
指向调用方提供的回调例程的指针,如果 I/O作发布到工作队列,则调用该例程。 此参数是可选的,可以是 NULL。
此例程声明如下:
typedef VOID
(*PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
地点:
CallbackData 是指向 I/O作的 FLT_CALLBACK_DATA 结构的指针。
Context 是在 Context 参数中传递给 FltCheckOplock 的上下文信息指针。
返回值
FltCheckOplock 返回以下FLT_PREOP_CALLBACK_STATUS代码之一:
| 返回代码 | 描述 |
|---|---|
| FLT_PREOP_COMPLETE | FltCheckOplock 遇到池分配失败,或者对 FsRtlCheckOplock 函数的调用返回错误。 FltCheckOplock 将在 FLT_CALLBACK_DATA 回调数据结构的 IoStatus 成员的 IO_STATUS_BLOCK 结构的 Status 成员中设置错误代码。 CallbackData 参数指向此FLT_CALLBACK_DATA。 |
| FLT_PREOP_PENDING | 已启动作锁中断,这导致筛选器管理器将 I/O作发布到工作队列。 I/O作由 CallbackData 参数指向的回调数据表示。 |
| FLT_PREOP_SUCCESS_NO_CALLBACK | I/O作已立即执行。 请注意,如果此作是在 create-options 参数中指定FILE_COMPLETE_IF_OPLOCKED的创建作,则即使作立即执行,作也可能正在进行中中断。 若要确定是否是这种情况,调用方应检查 FLT_CALLBACK_DATA 回调数据结构的 IoStatus 成员的 IO_STATUS_BLOCK 结构的 Status 成员中的状态。 |
言论
微型筛选器驱动程序调用 FltCheckOplock,以便根据以下条件将基于 IRP 的 I/O作与文件的当前 oplock 状态同步:
如果 I/O作将导致 oplock 中断,则会启动 oplock 中断。
如果 I/O作在 oplock 中断完成之前无法继续, 则 FltCheckOplock 将返回 FLT_PREOP_PENDING 并调用 PrePostCallbackDataRoutine 参数指向的回调例程。
如果微筛选器驱动程序使用 oplock,则必须从任何作前回调 (PFLT_PRE_OPERATION_CALLBACK) 例程调用 FltCheckOplock,以便执行可能导致 oplock 中断的 I/O作。 此规则适用于以下类型的 I/O 操作,因为这些操作可能会导致 oplock 中断:
- IRP_MJ_CLEANUP
- IRP_MJ_CREATE
- IRP_MJ_文件系统控制
- IRP_MJ_FLUSH_BUFFERS
- IRP_MJ_LOCK_CONTROL
- IRP_MJ_READ
- IRP_MJ_SET_INFORMATION
- IRP_MJ_WRITE
- IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION
I/O作必须是基于 IRP 的 I/O作。 若要确定给定的回调数据结构是否表示基于 IRP 的 I/O作,请使用 FLT_IS_IRP_OPERATION 宏。
微型筛选器不得在 WaitCompletionRoutine中指定的回调中再次调用 FltCheckOplock。 如果 oplock 包在 FltCheckOplock 返回之前调用完成回调,则这样做可能会导致死锁条件。
有关机会锁的详细信息,请参阅 Microsoft Windows SDK 文档。
要求
| 要求 | 价值 |
|---|---|
| 目标平台 | 普遍 |
| 标头 | fltkernel.h (包括 Fltkernel.h) |
| IRQL | <= APC_LEVEL |
另请参阅
FSCTL_OPBATCH_ACK_CLOSE_PENDING