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


Функция 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

Значение, представляющее запрошенный оплок, удерживаемый в более низкой файловой системе вторичной файловой системой. Это битовая комбинация OR следующего вида:

Ценность Значение
OPLOCK_LEVEL_CACHE_READ Указывает тип oplock Read (R).
OPLOCK_LEVEL_CACHE_WRITE Указывает тип операции записи (W).
OPLOCK_LEVEL_CACHE_HANDLE Указывает тип дескриптора oplock (H).

[in, optional] CompletionRoutineContext

Указатель на сведения о контексте, определяемые вызывающим объектом, которые необходимо передать в подпрограммы обратного вызова, на которые указывают параметры CompletionRout ine и PrePendIrpRoutine.

[in, optional] CompletionRoutine

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

Объявление и описание параметров этой подпрограммы приведены следующим образом:

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

PrePendRoutine

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

Объявление и описание параметров этой подпрограммы приведены следующим образом:

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

[in] Flags

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

Ценность Значение
OPLOCK_UPPER_FLAG_CHECK_NO_BREAK (0x00010000) Возвращает STATUS_CANNOT_BREAK_OPLOCK, если значение NewLowerOplockState приведет к любому разрыву oplock.
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 вызывается как уведомление о ожидающей операции. CompleteRoutine вызывается после завершения останова oplock. STATUS_PENDING — это код успешного выполнения.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows 8.1
целевая платформа Всеобщий
заголовка ntifs.h (include Ntifs.h)
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= APC_LEVEL

См. также

FsRtlCheckOplockEx

FsRtlUpperOplockFsctrl