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
指向要传递给 CompletionRoutine 和 PrePendIrpRoutine 参数指向的回调例程的调用方定义的上下文信息的指针。
[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 中断或已确认中断。 如果 CompletionRoutine 为 NULL,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 |