Функция 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 | См. раздел "Примечания". |