Função FltQueueDeferredIoWorkItem (fltkernel.h)
A rotina FltQueueDeferredIoWorkItem posta uma operação de E/S baseada em IRP em uma fila de trabalho.
Sintaxe
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
);
Parâmetros
[in] FltWorkItem
Um ponteiro para o item de trabalho a ser adicionado à fila de trabalho. O item de trabalho deve ter sido alocado chamando FltAllocateDeferredIoWorkItem.
[in] Data
Um ponteiro para a estrutura FLT_CALLBACK_DATA para a operação de E/S. A operação deve ser uma operação de E/S baseada em IRP. Para determinar se uma determinada estrutura de dados de retorno de chamada representa uma operação de E/S baseada em IRP, use a macro FLT_IS_IRP_OPERATION .
[in] WorkerRoutine
Um ponteiro para uma rotina de retorno de chamada de trabalho fornecida pelo chamador. Essa rotina é declarada da seguinte maneira:
typedef VOID
(*PFLT_DEFERRED_IO_WORKITEM_ROUTINE) (
_In_ PFLT_DEFERRED_IO_WORKITEM FltWorkItem,
_In_ PFLT_CALLBACK_DATA CallbackData,
_In_opt_ PVOID Context
);
em que:
- FltWorkItem é um ponteiro opaco para uma estrutura de item de trabalho adiada.
- CallbackData é um ponteiro para a estrutura de dados de retorno de chamada para a operação de E/S.
- Context é um ponteiro opcional de informações de contexto que foi passado como o parâmetro Context de FltQueueDeferredIoWorkItem.
[in] QueueType
Especifica a fila na qual o item de trabalho para o qual FltWorkItem aponta deve ser inserido. QueueType pode ser um dos valores a seguir.
Valor | Significado |
---|---|
CriticalWorkQueue | Insira o item de trabalho na fila da qual um thread do sistema com um atributo de prioridade em tempo real processa o item de trabalho. |
DelayedWorkQueue | Insira o item de trabalho na fila da qual um thread do sistema com um atributo de prioridade variável processa o item de trabalho. |
O valor QueueType HyperCriticalWorkQueue é reservado para uso do sistema.
[in] Context
Um ponteiro para informações de contexto definidas pelo chamador a serem passadas como o parâmetro Context da rotina de retorno de chamada especificada no parâmetro WorkerRoutine .
Retornar valor
A rotina FltQueueDeferredIoWorkItem retorna STATUS_SUCCESS ou um valor NTSTATUS apropriado, como um dos seguintes:
Código de retorno | Descrição |
---|---|
STATUS_FLT_DELETING_OBJECT | A instância de destino para a operação de E/S (Data-Iopb-TargetInstance>>) está sendo interrompida. Este é um código de erro. |
STATUS_FLT_NOT_SAFE_TO_POST_OPERATION | A operação de E/S não pode ser postada com segurança em um thread de trabalho. Consulte Comentários por possíveis motivos pelos quais esse código de erro é retornado. |
Comentários
A rotina FltQueueDeferredIoWorkItem posta uma operação de E/S em uma fila de trabalho do sistema. A rotina de retorno de chamada WorkerRoutine especificada é chamada no contexto de um thread do sistema, em IRQL PASSIVE_LEVEL.
A operação deve ser uma operação de E/S baseada em IRP. Para determinar se uma determinada estrutura de dados de retorno de chamada representa uma operação de E/S baseada em IRP, use a macro FLT_IS_IRP_OPERATION .
FltQueueDeferredIoWorkItem retorna STATUS_FLT_NOT_SAFE_TO_POST_OPERATION quando a operação de E/S não pode ser postada com segurança em um thread de trabalho. Os possíveis motivos incluem o seguinte:
FltQueueDeferredIoWorkItem não pode postar uma operação de E/S de paginação em um thread de trabalho.
FltQueueDeferredIoWorkItem não poderá postar uma operação de E/S em um thread de trabalho se o campo TopLevelIrp do thread atual não for NULL, pois a recursão resultante do sistema de arquivos poderá causar deadlocks ou estouros de pilha. Para obter mais informações, consulte IoGetTopLevelIrp.
Um driver de minifiltro pode usar FltQueueDeferredIoWorkItem em uma rotina de retorno de chamada de pré-operação (PFLT_PRE_OPERATION_CALLBACK) da seguinte maneira:
O retorno de chamada de pré-operação chama FltAllocateDeferredIoWorkItem para alocar o item de trabalho.
O retorno de chamada de pré-operação chama FltQueueDeferredIoWorkItem para postar a operação na fila de trabalho.
O retorno de chamada de pré-operação retorna FLT_PREOP_PENDING.
Depois de processar a operação de E/S, a rotina de trabalho chama FltCompletePendedPreOperation para retornar a operação de E/S ao Gerenciador de Filtros.
A rotina de trabalho chama FltFreeDeferredIoWorkItem para liberar o item de trabalho.
Um driver de minifiltro pode usar FltQueueDeferredIoWorkItem em uma rotina de retorno de chamada pós-operação (PFLT_POST_OPERATION_CALLBACK) da seguinte maneira:
O retorno de chamada pós-operação chama FltAllocateDeferredIoWorkItem para alocar o item de trabalho.
O retorno de chamada pós-operação chama FltQueueDeferredIoWorkItem para postar a operação na fila de trabalho.
O retorno de chamada pós-operação retorna FLT_POSTOP_MORE_PROCESSING_REQUIRED.
Depois de processar a operação de E/S, a rotina de trabalho chama FltCompletePendedPostOperation para retornar a operação de E/S ao Gerenciador de Filtros.
A rotina de trabalho chama FltFreeDeferredIoWorkItem para liberar o item de trabalho.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows 2000 |
Plataforma de Destino | Universal |
Cabeçalho | fltkernel.h (inclua Fltkernel.h) |
Biblioteca | Fltmgr.lib |
DLL | Fltmgr.sys |
IRQL | <= DISPATCH_LEVEL |