Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйвер минифильтра вызывает подпрограмму FltCheckOplockEx для синхронизации структуры данных обратного вызова для операции ввода-вывода на основе IRP, которая имеет текущее состояние оппортунистической блокировки (oplock) файла.
Syntax
FLT_PREOP_CALLBACK_STATUS FLTAPI FltCheckOplockEx(
[in] POPLOCK Oplock,
[in] PFLT_CALLBACK_DATA CallbackData,
[in] ULONG Flags,
[in, optional] PVOID Context,
[in, optional] PFLTOPLOCK_WAIT_COMPLETE_ROUTINE WaitCompletionRoutine,
[in, optional] PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE PrePostCallbackDataRoutine
);
Parameters
[in] Oplock
Непрозрачный указатель на оплок для файла. Этот указатель должен быть инициализирован предыдущим вызовом FltInitializeOplock.
[in] CallbackData
Указатель на данные обратного вызова FLT_CALLBACK_DATA структуру операции ввода-вывода.
[in] Flags
Битовая маска для связанной операции ввода-вывода файла. Драйвер мини-фильтра задает биты, чтобы указать поведение FltCheckOplockEx. Флаги могут быть одним или несколькими из следующих значений.
| Flag | Description |
|---|---|
| OPLOCK_FLAG_COMPLETE_IF_OPLOCKED (0x00000001) | Позволяет оппортунистическим блокировкам продолжать работу без блокировки или ожидания операции, вызвавшей разрыв оплока. |
| OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY (0x00000002) | Указывает, что FltCheckOplockEx должен проверять только оппортунистический ключ блокировки на FILE_OBJECT, связанной с операцией ввода-вывода. Эти операции ввода-вывода представлены данными обратного вызова, на которые указывает параметр CallbackData . FltCheckOplockEx должен добавить ключ, если он указан в операции ввода-вывода. Ни один другой процесс обработки оплока не выполняется; т. е. не будет происходить оппортунистический разрыв блокировки. |
| OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK (0x00000004) | Указывает, что FsRtlCheckOplockEx должен вернуть любое состояние, которое ранее было настроено с помощью вызова подпрограммы FltOplockFsctrl . FltOplockFsctrl вызывается при обработке запроса IRP_MJ_CREATE. Этот запрос IRP_MJ_CREATE указывает флаг FILE_OPEN_REQUIRING_OPLOCK в параметре создания параметров. Флаг OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK обычно используется в окончательной обработке такого запроса на создание при сбое. |
| OPLOCK_FLAG_IGNORE_OPLOCK_KEYS (0x00000008) | Позволяет продолжать все оппортунистические разрывы блокировки независимо от ключа оппортунистической блокировки. |
[in, optional] Context
Указатель на определяемые вызывающим контекстом сведения о контексте, передаваемые в подпрограммы обратного вызова, на которые указывает WaitCompletionRoutine и PrePostCallbackDataRoutine . Диспетчер фильтров обрабатывает эти сведения как непрозрачные.
[in, optional] WaitCompletionRoutine
Указатель на подпрограмму обратного вызова, предоставленного вызывающим абонентом. Если выполняется разрыв оплока, диспетчер фильтров вызывает эту подпрограмму при завершении останова. Этот параметр является необязательным и может иметь значение NULL. Если он равен NULL, вызывающий объект переводится в состояние ожидания до тех пор, пока не будет завершен разрыв блокировки.
Эта подпрограмма объявлена следующим образом:
typedef VOID
(*PFLTOPLOCK_WAIT_COMPLETE_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
Эта подпрограмма имеет следующие параметры:
CallbackData — это указатель на структуру данных обратного вызова для операции ввода-вывода. При вызове WaitCompleteRoutine подстрока IoStatus может быть заполнена состоянием сбоя (например, STATUS_CANCELLED). Вы должны проверить это состояние и реагировать соответствующим образом.
Контекст — это указатель сведений о контексте, переданный в параметр Контекстав FltCheckOplockEx.
[in, optional] PrePostCallbackDataRoutine
Указатель на подпрограмму обратного вызова, предоставленного вызывающим абонентом, который должен вызываться, если операция ввода-вывода помещается в рабочую очередь. Этот параметр является необязательным и может иметь значение NULL.
Эта подпрограмма объявлена следующим образом:
typedef VOID
(*PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
CallbackData — это указатель на структуру данных обратного вызова для операции ввода-вывода.
Контекст — это указатель сведений о контексте, переданный в параметр Контекстав FltCheckOplockEx.
Возвращаемое значение
FltCheckOplockEx возвращает один из следующих кодов FLT_PREOP_CALLBACK_STATUS:
| Код возврата | Description |
|---|---|
| FLT_PREOP_COMPLETE | FltCheckOplockEx обнаружил сбой выделения пула или вызов функции FsRtlCheckOplockEx вернул ошибку. FltCheckOplockEx задает код ошибки в элементе состояния структуры IO_STATUS_BLOCK члена IoStatus структуры данных обратного вызова FLT_CALLBACK_DATA . Параметр CallbackData указывает на эту FLT_CALLBACK_DATA структуру. |
| FLT_PREOP_PENDING | Была инициирована блокировка, из-за которой диспетчер фильтров опубликовал операцию ввода-вывода в рабочую очередь. Операция ввода-вывода представлена данными обратного вызова, на которые указывает параметр CallbackData . |
| FLT_PREOP_SUCCESS_WITH_CALLBACK | Данные обратного вызова, указывающие на параметр CallbackData , не были заданы, и операция ввода-вывода выполнялась немедленно. Имейте в виду, что если вызывающий объект указал OPLOCK_FLAG_COMPLETE_IF_OPLOCKED в параметре Flags , то разрыв оплока может выполняться даже в том случае, если операция ввода-вывода не была выполнена. Чтобы определить, является ли это ситуацией, вызывающий объект должен проверить наличие STATUS_OPLOCK_BREAK_IN_PROGRESS в элементе состояния структуры IO_STATUS_BLOCK члена IoStatus структуры данных обратного вызова FLT_CALLBACK_DATA . |
Remarks
Драйвер минифильтра вызывает FltCheckOplockEx для синхронизации операции ввода-вывода на основе IRP с текущим состоянием oplock файла в соответствии со следующими условиями:
Если операция ввода-вывода приведет к прерыванию операции ввода-вывода, инициируется прерывание операции.
Если операция ввода-вывода не может продолжаться до завершения останова oplock, FltCheckOplockEx возвращает FLT_PREOP_PENDING и вызывает подпрограмму обратного вызова, на которую указывает параметр PrePostCallbackDataRoutine .
Если драйвер мини-фильтра использует оплоки, он должен вызывать FltCheckOplockEx из любой процедуры обратного вызова предварительного ввода-вывода (PFLT_PRE_OPERATION_CALLBACK) для операций ввода-вывода, которые могут вызвать разрывы оплока. Это правило применяется к следующим типам операций ввода-вывода, так как эти операции могут вызвать разрывы оплока:
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
IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION
За исключением IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION операция ввода-вывода должна быть операцией ввода-вывода на основе IRP. Чтобы определить, представляет ли данная структура данных обратного вызова операцию ввода-вывода на основе IRP, используйте макрос FLT_IS_IRP_OPERATION .
Минифильтры не должны вызывать FltCheckOplockEx снова в обратном вызове, указанном в WaitCompletionRoutine. Это может привести к взаимоблокировке, если пакет oplock вызывает обратный вызов завершения до возврата FltCheckOplockEx .
FltCheckOplockEx будет возвращать только каждую возвращаемую FLT_PREOP_SUCCESS_WITH_CALLBACK, если основная функция IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION.
Дополнительные сведения о оппортунистических блокировках см. в разделе "Оппортунистические блокировки".
Requirements
| Requirement | Value |
|---|---|
| минимальные поддерживаемые клиентские | Windows 7 |
| целевая платформа | Universal |
| Header | fltkernel.h (включая Fltkernel.h) |
| Library | FltMgr.lib |
| IRQL | <= APC_LEVEL |