Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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) следующим образом:
Обратный вызов предварительной работы вызывает 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 (include Fltkernel.h) |
| библиотеки | Fltmgr.lib |
| DLL | Fltmgr.sys |
| IRQL | <= DISPATCH_LEVEL |