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


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

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

Синтаксис

NTSTATUS FsRtlCheckOplockEx(
  [in]           POPLOCK                       Oplock,
  [in]           PIRP                          Irp,
  [in]           ULONG                         Flags,
  [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] Flags

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

Ценность Значение
OPLOCK_FLAG_COMPLETE_IF_OPLOCKED (0x00000001) Указывает, чтобы разрешить прерывание оппортунистической блокировки продолжать работу без блокировки или ожидания операции, вызвавшей разрыв оплока.
OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY (0x00000002) Поддерживается начиная с Windows 7. Указывает, что FsRtlCheckOplockEx должен проверять только оппортунистический ключ блокировки на FILE_OBJECT, связанный с IRP, на который указывает параметр Irp. FsRtlCheckOplockEx необходимо добавить ключ, если он указан в IRP. Ни один другой процесс обработки оплока не выполняется; т. е. не будет происходить оппортунистический разрыв блокировки.
OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK (0x00000004) Поддерживается начиная с Windows 7. Указывает, что FsRtlCheckOplockEx должен вернуть любое состояние, которое ранее было настроено с помощью вызова FsRtlOplockFsctrl подпрограммы. FsRtlOplockFsctrl вызывается во время обработки запроса IRP_MJ_CREATE, указывающего флаг FILE_OPEN_REQUIRING_OPLOCK в параметре create options. Флаг OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK обычно используется в окончательной обработке такого запроса на создание при сбое.
OPLOCK_FLAG_IGNORE_OPLOCK_KEYS (0x00000008) Поддерживается начиная с Windows 7. Указывает, чтобы все оппортунистические разрывы блокировки продолжались независимо от ключа оппортунистической блокировки.
OPLOCK_FLAG_PARENT_OBJECT (0x00000010) Поддерживается начиная с Windows 8. Указывает, что Oplock связана с родительским (каталогом) файла или каталога, к которому направляется IRP в параметре Irp.
OPLOCK_FLAG_CLOSING_DELETE_ON_CLOSE (0x00000020) Поддерживается начиная с Windows 8. Указывает, что операция ввода-вывода, указанная в Irp, представляет собой IRP_MJ_CLEANUP для дескриптора, который был первоначально открыт с помощью флага FILE_DELETE_ON_CLOSE в параметрах создания. Этот флаг не действует, если Irp не является операцией IRP_MJ_CLEANUP. Указание этого флага может привести к прерыванию оппортунистической блокировки.
OPLOCK_FLAG_REMOVING_FILE_OR_LINK (0x00000040) Поддерживается начиная с Windows 8. Указывает обработку оппортунистического разрыва блокировки в родительском каталоге при удалении файла или ссылки в этом каталоге. Если этот флаг указан, этот флаг должен сочетаться с OPLOCK_FLAG_PARENT_OBJECT. Этот флаг необходимо указать, когда файловая система обрабатывает операцию, которая приводит к удалению ссылки или файла.

[in, optional] Context

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

[in, optional] CompletionRoutine

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

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

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

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

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

[in, optional] PostIrpRoutine

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

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

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

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

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

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

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

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

Замечания

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

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

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

  • Если операция ввода-вывода не может продолжаться до тех пор, пока не будет завершена блокировка оппортунистических операций и CompleteRoutine, FsRtlCheckOplockEx не вернется до тех пор, пока не будет признан оппортунистический разрыв блокировки.

PostIrpRoutine следует указать только в том случае, если указан завершения.

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

  • 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 для Microsoft Windows.

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

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows Vista
целевая платформа Всеобщий
заголовка ntifs.h (include 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

FltCheckOplockEx

FsRtlCurrentBatchOplock

FsRtlInitializeOplock

FsRtlOplockFsctrl

FsRtlOplockIsFastIoPossible

FsRtlUninitializeOplock