Функция FltCheckOplockEx (fltkernel.h)
Драйвер мини-фильтра вызывает подпрограмму FltCheckOplockEx для синхронизации структуры данных обратного вызова для операции ввода-вывода на основе IRP, которая имеет текущее оппортунистическое состояние блокировки (oplock) файла.
Синтаксис
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
);
Параметры
[in] Oplock
Непрозрачный указатель oplock для файла. Этот указатель должен быть инициализирован предыдущим вызовом FltInitializeOplock.
[in] CallbackData
Указатель на данные обратного вызова FLT_CALLBACK_DATAструктуру для операции ввода-вывода.
[in] Flags
Битовая маска для связанной операции ввода-вывода файла. Драйвер минифильтра задает биты для указания поведения FltCheckOplockEx. Параметр Flags имеет следующие параметры:
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
Указатель на структуру данных обратного вызова для операции ввода-вывода.
Контекст
Указатель сведений о контексте, переданный в параметре Context в FltCheckOplockEx.
[in, optional] PrePostCallbackDataRoutine
Указатель на подпрограмму обратного вызова, предоставляемую вызывающим абонентом, которая будет вызвана, если операция ввода-вывода помещается в рабочую очередь. Этот параметр является необязательным и может иметь значение NULL.
Эта подпрограмма объявляется следующим образом:
typedef VOID
(*PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
CallbackData
Указатель на структуру данных обратного вызова для операции ввода-вывода.
Контекст
Указатель сведений о контексте, переданный в параметре Context в FltCheckOplockEx.
Возвращаемое значение
FltCheckOplockEx возвращает один из следующих кодов FLT_PREOP_CALLBACK_STATUS:
Код возврата | Описание |
---|---|
|
FltCheckOplockEx обнаружил сбой выделения пула или вызов функции FsRtlCheckOplockEx вернул ошибку. FltCheckOplockEx задает код ошибки в элементе Statusструктуры IO_STATUS_BLOCK элемента IoStatusструктуры данных обратного вызова FLT_CALLBACK_DATA . Параметр CallbackData указывает на эту FLT_CALLBACK_DATA структуру. |
|
Был инициирован разрыв блокировки, в результате которого диспетчер фильтров перенаправил операцию ввода-вывода в рабочую очередь. Операция ввода-вывода представлена данными обратного вызова, на которые указывает параметр CallbackData . |
|
Данные обратного вызова, на которые указывает параметр CallbackData , не были подданы, и операция ввода-вывода была выполнена немедленно. Имейте в виду, что если вызывающий объект, указанный OPLOCK_FLAG_COMPLETE_IF_OPLOCKED в параметре Flags , возможно, на самом деле выполняется прерывание операции, даже если операция ввода-вывода не была выполнена. Чтобы определить, является ли это ситуацией, вызывающий объект должен проверка для STATUS_OPLOCK_BREAK_IN_PROGRESS в элементе Status структуры IO_STATUS_BLOCK элемента IoStatus структуры данных обратного вызова FLT_CALLBACK_DATA. |
Комментарии
Драйвер мини-фильтра вызывает FltCheckOplockEx для синхронизации операции ввода-вывода на основе IRP с текущим состоянием блокировки файла в соответствии со следующими условиями:
Если операция ввода-вывода приведет к прерыванию блокировки, инициируется прерывание операции.
Если операция ввода-вывода не может продолжаться до завершения приостановки операции, Функция 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. Чтобы определить, представляет ли данная структура данных обратного вызова операцию ввода-вывода на основе IRP, используйте макрос FLT_IS_IRP_OPERATION .
Минифильтры не должны снова вызывать FltCheckOplockEx в обратном вызове, указанном в WaitCompletionRoutine. Это может привести к взаимоблокировке, если пакет oplock вызывает обратный вызов завершения до возврата FltCheckOplockEx .
Дополнительные сведения об оппортунистических блокировках см. в документации по Microsoft Windows SDK.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Подпрограмма FltCheckOplockEx доступна начиная с Windows 7. |
Целевая платформа | Универсальное |
Верхняя часть | fltkernel.h (включая Fltkernel.h) |
Библиотека | FltMgr.lib |
IRQL | <= APC_LEVEL |