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 de 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
);
onde:
- 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 de informações de contexto opcional que foi passado como o parâmetro de Contexto de FltQueueDeferredIoWorkItem.
[in] QueueType
Especifica a fila na qual o item de trabalho que 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.
Valor de retorno
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 da operação de E/S (Data->Iopb->TargetInstance) está sendo demolida. 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. |
Observações
A rotina FltQueueDeferredIoWorkItem publica 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, no PASSIVE_LEVEL IRQL.
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 estiver NULL, pois a recursão resultante do sistema de arquivos pode 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:
As chamadas de retorno de chamada de pré-operação FltAllocateDeferredIoWorkItem para alocar o item de trabalho.
As chamadas de retorno de chamada de pré-operação 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:
As chamadas de retorno de chamada pós-operação FltAllocateDeferredIoWorkItem para alocar o item de trabalho.
As chamadas de retorno de chamada pós-operação 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 |
---|---|
de cliente com suporte mínimo | Windows 2000 |
da Plataforma de Destino | Universal |
cabeçalho | fltkernel.h (inclua Fltkernel.h) |
biblioteca | Fltmgr.lib |
de DLL | Fltmgr.sys |
IRQL | <= DISPATCH_LEVEL |