Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйвер мини-фильтра вызывает FltCheckOplock для синхронизации структуры данных обратного вызова для операции ввода-вывода на основе IRP с текущим состоянием оппортунистической блокировки (oplock).
Синтаксис
FLT_PREOP_CALLBACK_STATUS FLTAPI FltCheckOplock(
[in] POPLOCK Oplock,
[in] PFLT_CALLBACK_DATA CallbackData,
[in, optional] PVOID Context,
[in, optional] PFLTOPLOCK_WAIT_COMPLETE_ROUTINE WaitCompletionRoutine,
[in, optional] PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE PrePostCallbackDataRoutine
);
Параметры
[in] Oplock
Непрозрачный указатель на оплок для файла. Этот указатель должен быть инициализирован предыдущим вызовом FltInitializeOplock.
[in] CallbackData
Указатель на структуру данных обратного вызова (FLT_CALLBACK_DATA) для операции ввода-вывода.
[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 — это указатель на структуру FLT_CALLBACK_DATA для операции ввода-вывода.
Context — это указатель на информацию о контексте, который был передан в параметре Context в FltCheckOplock.
[in, optional] PrePostCallbackDataRoutine
Указатель на подпрограмму обратного вызова, предоставленного вызывающим абонентом, который должен вызываться, если операция ввода-вывода помещается в рабочую очередь. Этот параметр является необязательным и может иметь значение NULL.
Эта подпрограмма объявлена следующим образом:
typedef VOID
(*PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
где:
CallbackData — это указатель на структуру FLT_CALLBACK_DATA для операции ввода-вывода.
Context — это указатель на информацию о контексте, который был передан в параметре Context в FltCheckOplock.
Возвращаемое значение
FltCheckOplock возвращает один из следующих кодов FLT_PREOP_CALLBACK_STATUS:
| Возвращаемый код | Описание |
|---|---|
| FLT_PREOP_COMPLETE | В FltCheckOplock произошел сбой выделения пула или вызов функции FsRtlCheckOplock вернул ошибку. FltCheckOplock установит код ошибки в элементе Status структуры IO_STATUS_BLOCK элемента IoStatus структуры данных обратного вызова FLT_CALLBACK_DATA. На эту FLT_CALLBACK_DATA указывает параметр CallbackData. |
| FLT_PREOP_PENDING | Была инициирована блокировка, из-за которой диспетчер фильтров опубликовал операцию ввода-вывода в рабочую очередь. Операция ввода-вывода представлена данными обратного вызова, на которые указывает параметр CallbackData. |
| FLT_PREOP_SUCCESS_NO_CALLBACK | Операция ввода-вывода выполнялась немедленно. Помните, что если эта операция была операцией создания, которая указала FILE_COMPLETE_IF_OPLOCKED в параметре create-options, то на самом деле может возникнуть разрыв блокировки, даже если операция была выполнена немедленно. Чтобы определить, так ли это на самом деле, вызывающий объект должен проверить состояние в элементе Status структуры IO_STATUS_BLOCK элемента IoStatus структуры данных обратного вызова FLT_CALLBACK_DATA. |
Замечания
Драйвер минифильтра вызывает FltCheckOplock для синхронизации операции ввода-вывода на основе IRP с текущим состоянием oplock файла в соответствии со следующими условиями:
Если операция ввода-вывода приведет к прерыванию операции ввода-вывода, инициируется прерывание операции.
Если операция ввода-вывода не может продолжаться до тех пор, пока прерывание блокировки не будет завершено, FltCheckOplock возвращает FLT_PREOP_PENDING и вызывает подпрограмму обратного вызова, на которую указывает параметр PrePostCallbackDataRoutine .
Если драйвер минифильтра использует блокировки, он должен вызывать FltCheckOplock из любых подпрограмм предоперационного обратного вызова (PFLT_PRE_OPERATION_CALLBACK) для операций ввода-вывода, которые могут привести к прерыванию блокировки. Это правило применяется к следующим типам операций ввода-вывода, так как эти операции могут вызвать разрывы оплока:
- IRP_MJ_CLEANUP
- IRP_MJ_CREATE
- IRP_MJ_УПРАВЛЕНИЕ_ФАЙЛОВОЙ_СИСТЕМОЙ (if context permits adaptation or added clarity)
- 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. Чтобы определить, представляет ли данная структура данных обратного вызова операцию ввода-вывода на основе IRP, используйте макрос FLT_IS_IRP_OPERATION.
Минифильтры не должны вызывать FltCheckOplock снова в обратном вызове, указанном в WaitCompletionRoutine. Это может привести к взаимоблокировке, если пакет oplock вызывает обратный вызов завершения до возврата FltCheckOplock.
Подробные сведения о оппортунистических блокировках см. в документации по пакету SDK для Microsoft Windows.
Требования
| Требование | Ценность |
|---|---|
| целевая платформа | Всеобщий |
| заголовка | fltkernel.h (включая Fltkernel.h) |
| IRQL | <= APC_LEVEL |
См. также
FSCTL_OPBATCH_ACK_CLOSE_PENDING