Compartilhar via


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:

  1. O retorno de chamada de pré-operação chama FltAllocateDeferredIoWorkItem para alocar o item de trabalho.

  2. O retorno de chamada de pré-operação chama FltQueueDeferredIoWorkItem para postar a operação na fila de trabalho.

  3. O retorno de chamada de pré-operação retorna FLT_PREOP_PENDING.

  4. 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.

  5. 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:

  1. O retorno de chamada pós-operação chama FltAllocateDeferredIoWorkItem para alocar o item de trabalho.

  2. O retorno de chamada pós-operação chama FltQueueDeferredIoWorkItem para postar a operação na fila de trabalho.

  3. O retorno de chamada pós-operação retorna FLT_POSTOP_MORE_PROCESSING_REQUIRED.

  4. 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.

  5. 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

Confira também

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltAllocateDeferredIoWorkItem

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltFreeDeferredIoWorkItem

IoGetTopLevelIrp

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK