Condividi tramite


In sospeso un'operazione di I/O in una routine di callback postperation

Una routine di callback di post-intervento di un driver minifilter può eseguire un'operazione di I/O eseguendo i passaggi seguenti:

  1. Chiamata di FltAllocateDeferredIoWorkItem per allocare un elemento di lavoro per l'operazione di I/O.

  2. Chiamata di FltQueueDeferredIoWorkItem per pubblicare l'operazione di I/O in una coda di lavoro di sistema.

  3. Restituzione di FLT_POSTOP_MORE_PROCESSING_REQUIRED.

Si noti che la chiamata a FltQueueDeferredIoWorkItem avrà esito negativo se una delle condizioni seguenti è vera:

  • L'operazione non è un'operazione di I/O basata su IRP.

  • L'operazione è un'operazione di I/O di paging.

  • Il campo TopLevelIrp del thread corrente non è NULL. Per altre informazioni su come trovare il valore di questo campo, vedere IoGetTopLevelIrp.

  • L'istanza di destinazione per l'operazione di I/O viene distrutta. Il gestore filtri indica questa situazione impostando il flag FLTFL_POST_OPERATION_DRAINING nel parametro di input Flags sulla routine di callback di post-operazione.

I driver minifilter devono essere preparati per gestire questo errore. Se il driver minifilter non è in grado di gestire tali errori, è consigliabile usare la tecnica descritta in Restituzione di FLT_PREOP_SYNCHRONIZE anziché in sospeso per l'operazione di I/O.

Dopo la restituzione FLT_POSTOP_MORE_PROCESSING_REQUIRED della routine di callback del driver minifilter, il gestore filtri non eseguirà ulteriori elaborazioni di completamento per l'operazione di I/O fino a quando la routine di lavoro del driver minifilter chiama FltCompletePendedPostOperation per restituire il controllo dell'operazione al gestore filtri. Il gestore filtri non eseguirà ulteriori elaborazioni in questa situazione anche se la routine di lavoro imposta un valore NTSTATUS non riuscito nel campo IoStatus.Status della struttura dei dati di callback per l'operazione.

La routine di lavoro che esegue la coda ed esegue l'elaborazione del completamento per l'operazione di I/O deve chiamare FltCompletePendedPostOperation per restituire il controllo dell'operazione al gestore filtri.