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


Функция FltPerformAsynchronousIo (fltkernel.h)

Драйвер минифильтра вызывает FltPerformAsynchronousIo для запуска асинхронной операции ввода-вывода.

Синтаксис

NTSTATUS FLTAPI FltPerformAsynchronousIo(
  [in, out] PFLT_CALLBACK_DATA               CallbackData,
  [in]      PFLT_COMPLETED_ASYNC_IO_CALLBACK CallbackRoutine,
  [in]      PVOID                            CallbackContext
);

Параметры

[in, out] CallbackData

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

[in] CallbackRoutine

Указатель на PFLT_COMPLETED_ASYNC_IO_CALLBACK типизированный подпрограмма обратного вызова, вызываемая после завершения операции ввода-вывода. Примечание. Диспетчер фильтров вызывает эту подпрограмму после вызова подпрограмм обратного вызова после операции (PFLT_POST_OPERATION_CALLBACK) любых драйверов минифильтра, экземпляры которых присоединены ниже инициирующего экземпляра (указанного в параметре Instance для FltAllocateCallbackData). Этот параметр является обязательным и не может иметь значение NULL. Диспетчер фильтров всегда вызывает эту подпрограмму, даже если fltPerformAsynchronousIo завершается сбоем.

[in] CallbackContext

Указатель контекста, передаваемый в CallbackRoutine . Этот параметр является необязательным и может иметь значение NULL.

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

FltPerformAsynchronousIo возвращает STATUS_SUCCESS, чтобы указать, что операция ввода-вывода была завершена файловой системой и что была вызвана процедура обратного вызова, на которую указывает CallbackRoutine . В противном случае возвращается соответствующее значение NTSTATUS, например одно из следующих значений:

Код возврата Описание
STATUS_FLT_INVALID_ASYNCHRONOUS_REQUEST IRP_MJ_CREATE запросы не могут выполняться асинхронно. Это код ошибки.
STATUS_PENDING Операция вернула STATUS_PENDING. Диспетчер фильтров вызовет подпрограмму обратного вызова, на которую указывает CallbackRoutine после завершения операции ввода-вывода. Этот код указывает только на то, что операция была инициирована.
STATUS_FLT_IO_COMPLETE Операция была завершена подпрограммой обратного вызова перед операцией драйвера минифильтра, экземпляры которого присоединены ниже инициирующего экземпляра.

Комментарии

Драйвер минифильтра вызывает FltPerformAsynchronousIo для запуска асинхронной операции ввода-вывода после вызова FltAllocateCallbackData для выделения структуры данных обратного вызова для операции.

FltPerformAsynchronousIo отправляет операцию ввода-вывода только экземплярам драйвера мини-фильтра, подключенным под экземпляром-инициатором (указанный в параметре ЭкземпляраFltAllocateCallbackData), и файловой системе. Драйверы минифильтра, подключенные к указанному экземпляру, не получают операцию ввода-вывода.

Драйверы минифильтра могут инициировать только операции ввода-вывода на основе IRP. Они не могут инициировать операции обратного вызова быстрого ввода-вывода или фильтра файловой системы (FSFilter).

Драйверы минифильтра должны использовать FltPerformAsynchronousIo только для асинхронных операций ввода-вывода, для которых нельзя использовать такие подпрограммы:

IRP_MJ_CREATE запросы не могут выполняться асинхронно.

Структура данных обратного вызова (FLT_CALLBACK_DATA) может быть освобождена или повторно использована в любое время после вызова процедуры обратного вызова, на которую указывает CallbackRoutine . Вызывающий объект может освободить структуру данных обратного вызова, вызвав FltFreeCallbackData , или подготовить ее к повторному использованию, вызвав FltReuseCallbackData.

Примечание

STATUS_SUCCESS и STATUS_FLT_IO_COMPLETE указывают, что операция ввода-вывода завершена, но не указывают окончательное состояние операции ввода-вывода. Чтобы определить фактическое состояние операции, возвращаемое базовыми драйверами минифильтра, драйверами фильтров и файловой системой, callbackRoutine должно изучить элемент IoStatus структуры данных обратного вызова, полученной в параметре CallbackContext CallbackRoutine.

Так как диспетчер фильтров всегда вызывает подпрограмму обратного вызова, на которую указывает CallbackRoutine , даже при сбое FltPerformAsynchronousIo , драйвер мини-фильтра может выполнять операции освобождения или повторного использование непосредственно в подпрограмме обратного вызова.

Вызывающий объект FltPerformAsynchronousIo может выполняться в среде IRQL <= APC_LEVEL, если флаг IRP_PAGING_IO установлен в элементе IrpFlagsструктуры FLT_IO_PARAMETER_BLOCK для операции. (Этот флаг действителен только для операций IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_QUERY_INFORMATION и IRP_MJ_SET_INFORMATION.) В противном случае вызывающий объект должен работать на PASSIVE_LEVEL IRQL.

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть fltkernel.h (включая Fltkernel.h)
Библиотека FltMgr.lib
DLL Fltmgr.sys
IRQL См. раздел "Примечания".

См. также раздел

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FltAllocateCallbackData

FltFreeCallbackData

FltPerformSynchronousIo

FltReuseCallbackData

IRP_MJ_CREATE

PFLT_COMPLETED_ASYNC_IO_CALLBACK

PFLT_POST_OPERATION_CALLBACK