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


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

подпрограмма FsRtlCheckOplock синхронизирует IRP для операции ввода-вывода файла с текущим состоянием оппортунистической блокировки (oplock).

Синтаксис

NTSTATUS FsRtlCheckOplock(
  [in]           POPLOCK                       Oplock,
  [in]           PIRP                          Irp,
  [in, optional] PVOID                         Context,
  [in, optional] POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine,
  [in, optional] POPLOCK_FS_PREPOST_IRP        PostIrpRoutine
);

Параметры

[in] Oplock

Непрозрачный оппортунистический указатель блокировки для файла. Этот указатель должен быть инициализирован предыдущим вызовом FsRtlInitializeOplock.

[in] Irp

Указатель на IRP для операции ввода-вывода.

[in, optional] Context

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

[in, optional] CompletionRoutine

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

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

typedef VOID
(*POPLOCK_WAIT_COMPLETE_ROUTINE) (
      IN PVOID Context,
      IN PIRP Irp
      );

Эта подпрограмма имеет следующие параметры:

Параметр Описание
Контекст Указатель сведений о контексте, переданный в параметре контекста для FsRtlCheckOplock.
Irp Указатель на IRP для операции ввода-вывода.

[in, optional] PostIrpRoutine

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

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

typedef VOID
(*POPLOCK_FS_PREPOST_IRP) (
      IN PVOID Context,
      IN PIRP Irp
      );

Эта подпрограмма имеет следующие параметры:

Параметр Описание
Контекст Указатель сведений о контексте, переданный в параметре контекста для FsRtlCheckOplock.
Irp Указатель на IRP для операции ввода-вывода.

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

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

Возвращаемый код Описание
STATUS_CANCELLED IRP был отменен. STATUS_CANCELLED — это код ошибки.
STATUS_CANNOT_BREAK_OPLOCK Если IRP является IRP_MJ_CREATE и FILE_OPEN_REQUIRING_OPLOCK находится в службе CreateOptions IRP, подпрограмма не инициирует разрыв существующей оппортунистической блокировки, но завершается сбоем с STATUS_CANNOT_BREAK_OPLOCK.
STATUS_OPLOCK_BREAK_IN_PROGRESS Ведется оппортунистический разрыв блокировки. IRP — это запрос IRP_MJ_CREATE и FILE_COMPLETE_IF_OPLOCKED был указан в параметре создания параметров для операции. STATUS_OPLOCK_BREAK_IN_PROGRESS — это код успешного выполнения.
STATUS_PENDING Была инициирована оппортунистическая блокировка, а управление IRP передано в пакет oplock. Если значение CompletionRoutine равно NULL, эта подпрограмма будет блокироваться во время обработки останова оплока, а не возвращать STATUS_PENDING. STATUS_PENDING — это код успешного выполнения.

Замечания

FsRtlCheckOplock синхронизирует IRP для операции ввода-вывода с текущим состоянием блокировки оппортунистической блокировки файла в соответствии со следующими условиями:

  • Если операция ввода-вывода приведет к прерыванию оппортунистической блокировки, инициируется оппортунистическая блокировка.

  • Если операция ввода-вывода не может продолжаться до завершения оппортунистической блокировки, FsRtlCheckOplock возвращает STATUS_PENDING и вызывает подпрограмму обратного вызова, на которую указывает параметр PostIrpRoutine.

Если в файловой системе или драйвере фильтра используются оппортунистические блокировки, он должен вызывать FsRtlCheckOplock из любых подпрограмм отправки для операций ввода-вывода, которые могут вызвать разрывы оппортунистических блокировок. Это правило применяется к следующим типам операций ввода-вывода, так как эти операции могут вызывать разрывы оппортунистических блокировок:

  • IRP_MJ_CLEANUP
  • IRP_MJ_CREATE
  • IRP_MJ_FILE_SYSTEM_CONTROL
  • IRP_MJ_FLUSH_BUFFERS
  • IRP_MJ_LOCK_CONTROL
  • IRP_MJ_READ
  • IRP_MJ_SET_INFORMATION
  • IRP_MJ_WRITE

Подробные сведения о оппортунистических блокировках см. в документации по пакету SDK для Windows.

Минифильтры должны вызывать FltCheckOplock вместо FsRtlCheckOplock.

Требования

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

См. также

FSCTL_OPBATCH_ACK_CLOSE_PENDING

FSCTL_OPLOCK_BREAK_ACKNOWLEDGE

FSCTL_OPLOCK_BREAK_ACK_NO_2

FSCTL_OPLOCK_BREAK_NOTIFY

FSCTL_REQUEST_BATCH_OPLOCK

FSCTL_REQUEST_FILTER_OPLOCK

FSCTL_REQUEST_OPLOCK_LEVEL_1

FSCTL_REQUEST_OPLOCK_LEVEL_2

FltCheckOplock

FsRtlCurrentBatchOplock

FsRtlInitializeOplock

FsRtlOplockFsctrl

FsRtlOplockIsFastIoPossible

FsRtlUninitializeOplock