FltCheckOplock 函数 (fltkernel.h)

微型筛选器驱动程序调用 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 PrePostCallbackDataRoutine 指向的回调例 程的调用方定义的上下文信息的指针。 筛选器管理器将此信息视为不透明。

[in, optional] WaitCompletionRoutine

指向调用方提供的回调例程的指针。 如果作锁中断正在进行中,筛选器管理器会在完成 oplock 中断时调用此例程。 此参数是可选的,可以 NULL。 如果 NULL,则调用方将进入等待状态,直到 oplock 中断完成。

此例程声明如下:

typedef VOID
(*PFLTOPLOCK_WAIT_COMPLETE_ROUTINE) (
      IN PFLT_CALLBACK_DATA CallbackData,
      IN PVOID Context
      );

此例程具有以下参数:

CallbackData

指向 I/O作的回调数据结构的指针。

上下文

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作的回调数据结构的指针。

上下文

Context 参数中传递给 FltCheckOplock的上下文信息指针。

返回值

FltCheckOplock 返回以下FLT_PREOP_CALLBACK_STATUS代码之一:

返回代码 描述
FLT_PREOP_COMPLETE
FltCheckOplock 遇到池分配失败,或者调用 FsRtlCheckOplock 函数返回错误。 FltCheckOplock 将在 IoStatusFLT_CALLBACK_DATA 回调数据结构的 IO_STATUS_BLOCK 结构的 状态 成员中设置错误代码。 CallbackData 参数指向此FLT_CALLBACK_DATA。
FLT_PREOP_PENDING
已启动作锁中断,这导致筛选器管理器将 I/O作发布到工作队列。 I/O作由 CallbackData 参数指向的回调数据表示。
FLT_PREOP_SUCCESS_WITH_CALLBACK
I/O作已立即执行。 请注意,如果此作是在 create-options 参数中指定FILE_COMPLETE_IF_OPLOCKED的创建作,则即使作立即执行,作也可能正在进行中中断。 若要确定情况是否为这种情况,调用方应检查 状态IoStatusFLT_CALLBACK_DATA 回调数据结构 IO_STATUS_BLOCK 成员的状态。

言论

微型筛选器驱动程序调用 FltCheckOplock,以便根据以下条件将基于 IRP 的 I/O作与文件的当前 oplock 状态同步:

  • 如果 I/O作将导致 oplock 中断,则会启动 oplock 中断。
  • 如果 I/O作在作锁中断完成之前无法继续,FltCheckOplock 返回FLT_PREOP_PENDING并调用 PrePostCallbackDataRoutine 参数指向的回调例程。
如果微型筛选器驱动程序使用 oplocks,则必须从任何预作回调(PFLT_PRE_OPERATION_CALLBACK)例程调用 FltCheckOplock,这些例程可能会导致 oplock 中断。 此规则适用于以下类型的 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中指定的回调中再次调用 FltCheckOplock。 如果 oplock 包在 FltCheckOplock 返回之前调用完成回调,则这样做可能会导致死锁条件。

有关机会锁的详细信息,请参阅 Microsoft Windows SDK 文档。

要求

要求 价值
目标平台 普遍
标头 fltkernel.h (包括 Fltkernel.h)
IRQL <= APC_LEVEL

另请参阅

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FSCTL_OPBATCH_ACK_CLOSE_PENDING

FSCTL_OPLOCK_BREAK_ACKNOWLEDGE

FSCTL_OPLOCK_BREAK_ACK_NO_2

FSCTL_OPLOCK_BREAK_NOTIFY

FSCTL_REQUEST_BATCH_OPLOCK

FSCTL_REQUEST_FILTER_OPLOCK

FSCTL_REQUEST_OPLOCK_LEVEL_1

FSCTL_REQUEST_OPLOCK_LEVEL_2

FltCheckOplockEx

FltCurrentBatchOplock

FltInitializeOplock

FltOplockFsctrl

FltOplockIsFastIoPossible

FltUninitializeOplock

FsRtlCheckOplock

PFLT_PRE_OPERATION_CALLBACK