Функция 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 — это указатель на структуру данных обратного вызова для операции ввода-вывода.
  • Контекст является необязательным указателем сведений о контексте, который был передан в качестве параметра контекста контекстаFltQueueDeferredIoWorkItem.

[in] QueueType

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

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

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

[in] 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 (include 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