FsRtlCheckUpperOplock 函数 (ntifs.h)

FsRtlCheckUpperOplock 例程在辅助文件系统或分层文件系统中提供机会锁(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的行为。 标志 参数具有以下选项:

价值 意义
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 中断或已确认中断。 如果 CompletionRoutine 为 NULL,则在处理 oplock 中断时 FsRtlCheckUpperOplock 块,而不是返回STATUS_PENDING。
STATUS_CANNOT_BREAK_OPLOCK 无法完成 oplock 中断。 有关限制中断的条件,请参阅 标志
STATUS_PENDING 机会锁中断正在进行中。 如果已提供,PrePendIrpRoutine 将作为挂起操作的通知调用。 当 oplock 中断完成时,将调用 CompletionRoutine。 STATUS_PENDING是成功的代码。

要求

要求 价值
最低支持的客户端 Windows 8.1
目标平台 普遍
标头 ntifs.h (include Ntifs.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= APC_LEVEL

另请参阅

FsRtlCheckOplockEx

FsRtlUpperOplockFsctrl