Partilhar via


Pendente de uma operação de E/S em uma rotina de retorno de chamada de pré-operação

A rotina de retorno de chamada de pré-operação de um driver de minifiltro pode aguardar uma operação de E/S postando a operação em uma fila de trabalho do sistema e retornando FLT_PREOP_PENDING. Retornar esse valor status indica que o driver de minifiltro está mantendo o controle da operação de E/S até chamar FltCompletePendedPreOperation para retomar o processamento da operação de E/S.

A rotina de retorno de chamada de pré-operação de um driver de minifiltro aguarda uma operação de E/S executando as seguintes etapas:

  1. Postando a operação de E/S em uma fila de trabalho do sistema chamando uma rotina como FltQueueDeferredIoWorkItem.

  2. Retornando FLT_PREOP_PENDING.

Um driver de minifiltro que deve aguardar todas (ou a maioria) operações de E/S de entrada não deve usar rotinas como FltQueueDeferredIoWorkItem para operações pendentes, pois chamar essa rotina pode fazer com que as filas de trabalho do sistema sejam inundadas. Em vez disso, esse driver de minifiltro deve usar uma fila cancel-safe. Para obter mais informações sobre como usar filas cancel-safe, consulte FltCbdqInitialize.

Observe que a chamada para FltQueueDeferredIoWorkItem falhará se qualquer uma das seguintes condições for verdadeira:

  • A operação não é uma operação de E/S baseada em IRP.

  • A operação é uma operação de E/S de paginação.

  • O campo TopLevelIrp do thread atual não é NULL. (Para obter mais informações sobre como localizar o valor desse campo, consulte IoGetTopLevelIrp.)

  • A instância de destino para a operação de E/S está sendo interrompida.

Se a rotina de retorno de chamada de pré-operação do driver de minifiltro retornar FLT_PREOP_PENDING, ela deverá retornar NULL no parâmetro de saída CompletionContext .

Um driver de minifiltro pode retornar FLT_PREOP_PENDING somente para operações de E/S baseadas em IRP. Para determinar se uma operação é uma operação de E/S baseada em IRP, use a macro FLT_IS_IRP_OPERATION .

A rotina de trabalho que desativa e processa a operação de E/S deve chamar FltCompletePendedPreOperation para retomar o processamento da operação.