Поделиться через


Функция FsRtlCheckUpperOplock (ntifs.h)

Подпрограмма FsRtlCheckUpperOplock обеспечивает оппортунистическую блокировку (oplock) во вторичных или многоуровневых файловых системах при изменении состояния блокировки. Вторичные файловые системы, такие как перенаправители сети и кластеризация файловых служб, вызывают FsRtlCheckUpperOplock при изменении состояния блокировки, удерживаемой в более низкой файловой системе вторичной файловой системой. Изменение состояния может произойти путем приостановки или обновления. При необходимости FsRtlCheckUpperOplock разрушит блокировку верхней файловой системы, чтобы подтвердить новое нижнее состояние блокировки. Вызывающий объект также может предоставлять необязательные обратные вызовы для уведомлений о подтверждении прерывания и состоянии ожидания.

Синтаксис

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_LEVEL_CACHE_READ Указывает тип чтения oplock (R).
OPLOCK_LEVEL_CACHE_WRITE Указывает тип записи oplock (W).
OPLOCK_LEVEL_CACHE_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 Необязательный указатель на IRP для операции ввода-вывода. FsRtlCheckUpperOplock всегда присваивает этому параметру значение NULL.

PrePendRoutine

Указатель на подпрограмму обратного вызова, предоставляемую вызывающим, если FsRtlCheckUpperOplock возвращает STATUS_PENDING. Этот параметр является необязательным и может иметь значение NULL.

Объявление и описание параметров этой подпрограммы приведены ниже.

typedef VOID
(*POPLOCK_FS_PREPOST_IRP) (
      _In_ PVOID Context,
      _in_opt_ PIRP Irp
      );
Параметр Описание
Контекст Указатель контекстной информации, переданный в параметре CompletionRoutineContext в FsRtlCheckUpperOplock.
Irp Необязательный указатель на IRP для операции ввода-вывода. FsRtlCheckUpperOplock всегда присваивает этому параметру значение NULL.

[in] Flags

Битовая маска для связанной операции ввода-вывода файла. Файловая система или драйвер фильтра задает биты, чтобы указать поведение FsRtlCheckUpperOplock. Параметр Flags имеет следующие параметры:

Значение Значение
OPLOCK_UPPER_FLAG_CHECK_NO_BREAK (0x00010000) Возвращает STATUS_CANNOT_BREAK_OPLOCK, если значение NewLowerOplockState приводит к разрыву операции.
OPLOCK_UPPER_FLAG_NOTIFY_REFRESH_READ (0x00020000) Разорвать только верхние блоки чтения (R) и уведомлять владельцев R о том, что они могут снова запросить R. Все остальные проверки верхней блокировки будут возвращать STATUS_CANNOT_BREAK_OPLOCK.

Возвращаемое значение

FsRtlCheckUpperOplock возвращает соответствующий код NTSTATUS, например один из следующих:

Код возврата Описание
STATUS_SUCCESS Разрыв блокировки не требуется, или разрыв был подтвержден. Если параметр CompletionRoutine имеет значение NULL, FsRtlCheckUpperOplock блокируется, а не возвращает STATUS_PENDING.
STATUS_CANNOT_BREAK_OPLOCK Не удается выполнить разрыв блокировки. Условия, ограничивающие разрыв, см. в разделе Флаги.
STATUS_PENDING Происходит оппортунистическая блокировка. Если он указан, prePendIrpRoutine вызывается в качестве уведомления об ожидающей операции. CompletionRoutine вызывается по завершении разрыва блокировки. STATUS_PENDING — это код успешного выполнения.

Требования

Требование Значение
Минимальная версия клиента Windows 8.1
Целевая платформа Универсальное
Верхняя часть ntifs.h (включая Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= APC_LEVEL

См. также раздел

FsRtlCheckOplockEx

FsRtlUpperOplockFsctrl