FsRtlCheckUpperOplock 函数 (ntifs.h)

FsRtlCheckUpperOplock 例程提供机会锁 (oplock) 在辅助文件系统或分层文件系统中检查它们所持有的 oplock 更改状态时。 当辅助文件系统(如网络重定向器和聚类分析文件服务)在辅助文件系统的较低文件系统中持有的 oplock 更改状态时,调用 FsRtlCheckUpperOplock。 状态更改可以通过中断或升级发生。 如有必要,FsRtlCheckUpperOplock 将中断上部文件系统的 oplock,以确认新的低 oplock 状态。 调用方还可以为中断确认和挂起状态的通知提供可选的回调。

语法

NTSTATUS FsRtlCheckUpperOplock(
  [in]           POPLOCK                       Oplock,
  [in]           ULONG                         NewLowerOplockState,
  [in, optional] PVOID                         CompletionRoutineContext,
  [in, optional] POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine,
                 POPLOCK_FS_PREPOST_IRP        PrePendRoutine,
  [in]           ULONG                         Flags
);

参数

[in] Oplock

文件的不透明不锁定指针。 此指针必须已由之前对 FsRtlInitializeOplock 的调用初始化。

[in] NewLowerOplockState

一个 值,该值表示请求的 oplock 由辅助文件系统保留在较低文件系统中。 这是以下各项的按位 OR 组合:

含义
OPLOCK_LEVEL_CACHE_READ 指示 oplock Read (R) 类型。
OPLOCK_LEVEL_CACHE_WRITE 指示 oplock Write (W) 类型。
OPLOCK_LEVEL_CACHE_HANDLE 指示 oplock Handle (H) 类型。

[in, optional] CompletionRoutineContext

指向要传递给 CompletionRoutinePrePendIrpRoutine 参数指向的回调例程的调用方定义的上下文信息的指针。

[in, optional] CompletionRoutine

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

此例程的声明和参数说明如下:

typedef VOID
(*POPLOCK_WAIT_COMPLETE_ROUTINE) (
      _In_ PVOID Context,
      _In_opt_ PIRP Irp
      );
参数 说明
上下文 CompletionRoutineContext 参数中传递到 FsRtlCheckUpperOplock 的上下文信息指针。
Irp 指向 I/O 操作的 IRP 的可选指针。 FsRtlCheckUpperOplock 将始终将此设置为 NULL。

PrePendRoutine

指向调用方提供的回调例程的指针,如果 FsRtlCheckUpperOplock 将返回STATUS_PENDING,则调用该例程。 此参数是可选的,可以为 NULL。

此例程的声明和参数说明如下:

typedef VOID
(*POPLOCK_FS_PREPOST_IRP) (
      _In_ PVOID Context,
      _in_opt_ PIRP Irp
      );
参数 说明
上下文 CompletionRoutineContext 参数中传递到 FsRtlCheckUpperOplock 的上下文信息指针。
Irp 指向 I/O 操作的 IRP 的可选指针。 FsRtlCheckUpperOplock 将始终将此设置为 NULL。

[in] Flags

关联文件 I/O 操作的位掩码。 文件系统或筛选器驱动程序设置位以指定 FsRtlCheckUpperOplock 的行为。 Flags 参数具有以下选项:

含义
OPLOCK_UPPER_FLAG_CHECK_NO_BREAK (0x00010000) 如果 NewLowerOplockState 的值导致任何 oplock 中断,则返回STATUS_CANNOT_BREAK_OPLOCK。
OPLOCK_UPPER_FLAG_NOTIFY_REFRESH_READ (0x00020000) 仅中断只读 (R) 上部 oplock 并通知 R 持有者,他们可以再次请求 R。所有其他上 oplock 检查将返回STATUS_CANNOT_BREAK_OPLOCK。

返回值

FsRtlCheckUpperOplock 返回相应的 NTSTATUS 代码,如以下代码之一:

返回代码 说明
STATUS_SUCCESS 不需要 oplock 中断或已确认中断。 如果 CompletionRoutineNULL,FsRtlCheckUpperOplock 会在处理 oplock 中断时阻止,而不是返回STATUS_PENDING。
STATUS_CANNOT_BREAK_OPLOCK 无法完成 oplock 中断。 有关限制中断的条件,请参阅 标志
STATUS_PENDING 机会主义的锁正在中断。 如果提供, 将调用 PrePendIrpRoutine 作为挂起操作的通知。 当 oplock 中断完成时,将调用 CompletionRoutine。 STATUS_PENDING是一个成功代码。

要求

要求
最低受支持的客户端 Windows 8.1
目标平台 通用
标头 ntifs.h (包括 Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= APC_LEVEL

另请参阅

FsRtlCheckOplockEx

FsRtlUpperOplockFsctrl