Функция 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) следующим образом:
Обратный вызов перед операции вызывает FltAllocateDeferredIoWorkItem для выделения рабочего элемента.
Обратный вызов перед операцией вызывает FltQueueDeferredIoWorkItem для отправки операции в рабочую очередь.
Обратный вызов перед операции возвращает FLT_PREOP_PENDING.
После обработки операции ввода-вывода рабочая подпрограмма вызывает FltCompletePendedPreOperation , чтобы вернуть операцию ввода-вывода в диспетчер фильтров.
Рабочая процедура вызывает FltFreeDeferredIoWorkItem , чтобы освободить рабочий элемент.
Драйвер мини-фильтра может использовать FltQueueDeferredIoWorkItem в подпрограмме обратного вызова после операции (PFLT_POST_OPERATION_CALLBACK) следующим образом:
Обратный вызов после операции вызывает FltAllocateDeferredIoWorkItem для выделения рабочего элемента.
Обратный вызов после операции вызывает FltQueueDeferredIoWorkItem для отправки операции в рабочую очередь.
Обратный вызов после операции возвращает FLT_POSTOP_MORE_PROCESSING_REQUIRED.
После обработки операции ввода-вывода рабочая подпрограмма вызывает FltCompletePendedPostOperation , чтобы вернуть операцию ввода-вывода в диспетчер фильтров.
Рабочая процедура вызывает FltFreeDeferredIoWorkItem , чтобы освободить рабочий элемент.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 2000 |
Целевая платформа | Универсальное |
Верхняя часть | fltkernel.h (включая Fltkernel.h) |
Библиотека | Fltmgr.lib |
DLL | Fltmgr.sys |
IRQL | <= DISPATCH_LEVEL |