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

Подпрограмма FltQueueDeferredIoWorkItem отправляет операцию ввода-вывода на основе IRP в рабочую очередь.

Синтаксис

NTSTATUS FLTAPI FltQueueDeferredIoWorkItem(
  [in] PFLT_DEFERRED_IO_WORKITEM         FltWorkItem,
  [in] PFLT_CALLBACK_DATA                Data,
  [in] PFLT_DEFERRED_IO_WORKITEM_ROUTINE WorkerRoutine,
  [in] WORK_QUEUE_TYPE                   QueueType,
  [in] PVOID                             Context
);

Параметры

[in] FltWorkItem

Указатель на рабочий элемент, добавляемый в рабочую очередь. Рабочий элемент должен быть выделен путем вызова Метода FltAllocateDeferredIoWorkItem.

[in] Data

Указатель на структуру FLT_CALLBACK_DATA для операции ввода-вывода. Операция должна быть операцией ввода-вывода на основе IRP. Чтобы определить, представляет ли данная структура данных обратного вызова операцию ввода-вывода на основе IRP, используйте макрос FLT_IS_IRP_OPERATION .

[in] WorkerRoutine

Указатель на подпрограмму обратного вызова, предоставляемую вызывающим абонентом. Эта подпрограмма объявляется следующим образом:

typedef VOID
(*PFLT_DEFERRED_IO_WORKITEM_ROUTINE) (
    _In_ PFLT_DEFERRED_IO_WORKITEM FltWorkItem,
    _In_ PFLT_CALLBACK_DATA CallbackData,
    _In_opt_ PVOID Context
    );

где:

  • FltWorkItem — это непрозрачный указатель на структуру отложенного рабочего элемента.
  • CallbackData — это указатель на структуру данных обратного вызова для операции ввода-вывода.
  • Context — это необязательный указатель сведений о контексте, переданный в качестве параметра Contextобъекта FltQueueDeferredIoWorkItem.

[in] QueueType

Указывает очередь, в которую будет вставлен рабочий элемент, на который указывает FltWorkItem . QueueType может иметь одно из следующих значений.

Значение Значение
CriticalWorkQueue Вставьте рабочий элемент в очередь, из которой системный поток с атрибутом приоритета в режиме реального времени обрабатывает рабочий элемент.
DelayedWorkQueue Вставьте рабочий элемент в очередь, из которой системный поток с атрибутом переменной приоритета обрабатывает рабочий элемент.

Значение QueueTypeHyperCriticalWorkQueue зарезервировано для использования системой.

[in] Context

Указатель на определяемые вызывающим объектом сведения о контексте, передаваемые в качестве параметра Context подпрограммы обратного вызова, указанной в параметре WorkerRoutine .

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

Подпрограмма FltQueueDeferredIoWorkItem возвращает STATUS_SUCCESS или соответствующее значение NTSTATUS, например одно из следующих значений:

Код возврата Описание
STATUS_FLT_DELETING_OBJECT Целевой экземпляр операции ввода-вывода (Data-Iopb-TargetInstance>>) сносится. Это код ошибки.
STATUS_FLT_NOT_SAFE_TO_POST_OPERATION Операция ввода-вывода не может быть безопасно размещена в рабочем потоке. Возможные причины, по которым возвращается этот код ошибки, см. в разделе Примечания.

Комментарии

Подпрограмма FltQueueDeferredIoWorkItem отправляет операцию ввода-вывода в системную рабочую очередь. Указанная подпрограмма обратного вызова WorkerRoutine вызывается в контексте системного потока на PASSIVE_LEVEL IRQL.

Операция должна быть операцией ввода-вывода на основе IRP. Чтобы определить, представляет ли данная структура данных обратного вызова операцию ввода-вывода на основе IRP, используйте макрос FLT_IS_IRP_OPERATION .

FltQueueDeferredIoWorkItem возвращает STATUS_FLT_NOT_SAFE_TO_POST_OPERATION, когда операция ввода-вывода не может быть безопасно размещена в рабочем потоке. Возможные причины:

  • FltQueueDeferredIoWorkItem не может отправить операцию ввода-вывода на разбиение по страницам в рабочий поток.

  • FltQueueDeferredIoWorkItem не может отправить операцию ввода-вывода в рабочий поток, если поле TopLevelIrp текущего потока не равно NULL, так как результирующая рекурсия файловой системы может привести к взаимоблокировкам или переполнению стека. Дополнительные сведения см. в разделе IoGetTopLevelIrp.

Драйвер мини-фильтра может использовать FltQueueDeferredIoWorkItem в подпрограмме обратного вызова перед работой (PFLT_PRE_OPERATION_CALLBACK) следующим образом:

  1. Обратный вызов перед операции вызывает FltAllocateDeferredIoWorkItem для выделения рабочего элемента.

  2. Обратный вызов перед операцией вызывает FltQueueDeferredIoWorkItem для отправки операции в рабочую очередь.

  3. Обратный вызов перед операции возвращает FLT_PREOP_PENDING.

  4. После обработки операции ввода-вывода рабочая подпрограмма вызывает FltCompletePendedPreOperation , чтобы вернуть операцию ввода-вывода в диспетчер фильтров.

  5. Рабочая процедура вызывает FltFreeDeferredIoWorkItem , чтобы освободить рабочий элемент.

Драйвер мини-фильтра может использовать FltQueueDeferredIoWorkItem в подпрограмме обратного вызова после операции (PFLT_POST_OPERATION_CALLBACK) следующим образом:

  1. Обратный вызов после операции вызывает FltAllocateDeferredIoWorkItem для выделения рабочего элемента.

  2. Обратный вызов после операции вызывает FltQueueDeferredIoWorkItem для отправки операции в рабочую очередь.

  3. Обратный вызов после операции возвращает FLT_POSTOP_MORE_PROCESSING_REQUIRED.

  4. После обработки операции ввода-вывода рабочая подпрограмма вызывает FltCompletePendedPostOperation , чтобы вернуть операцию ввода-вывода в диспетчер фильтров.

  5. Рабочая процедура вызывает FltFreeDeferredIoWorkItem , чтобы освободить рабочий элемент.

Требования

Требование Значение
Минимальная версия клиента Windows 2000
Целевая платформа Универсальное
Верхняя часть fltkernel.h (включая Fltkernel.h)
Библиотека Fltmgr.lib
DLL Fltmgr.sys
IRQL <= DISPATCH_LEVEL

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

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltAllocateDeferredIoWorkItem

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltFreeDeferredIoWorkItem

IoGetTopLevelIrp

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK