Функция 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
);
Эта подпрограмма имеет следующие параметры:
Параметр | Описание |
---|---|
Контекст | Указатель сведений о контексте, переданный в параметре контекста |
Irp | Указатель на IRP для операции ввода-вывода. |
[in, optional] PostIrpRoutine
Указатель на подпрограмму обратного вызова, предоставленного вызывающим абонентом, который должен вызываться, если операция ввода-вывода помещается в рабочую очередь. Этот параметр является необязательным и может иметь значение NULL.
Эта подпрограмма объявлена следующим образом:
typedef VOID
(*POPLOCK_FS_PREPOST_IRP) (
IN PVOID Context,
IN PIRP Irp
);
Эта подпрограмма имеет следующие параметры:
Параметр | Описание |
---|---|
Контекст | Указатель сведений о контексте, переданный в параметре контекста |
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