Condividi tramite


Uso delle routine di completamento di IRP

Nota

Per garantire affidabilità e prestazioni ottimali, usare i driver minifilter del file system con il supporto di Filter Manager anziché i driver di filtro del file system legacy. Per convertire il driver legacy in un driver minifilter, vedere Linee guida per la conversione dei driver di filtro legacy.

I driver di filtro del file system usano routine di completamento simili a quelle usate dai driver di dispositivo. Una routine di completamento esegue l'elaborazione del completamento in un'istanza di IRP. Qualsiasi routine del driver che passa un'IRP fino al driver di livello inferiore successivo può registrare facoltativamente una routine di completamento per l'IRP chiamando IoSetCompletionRoutine prima di chiamare IoCallDriver.

Ogni routine di completamento di IRP è definita come segue:

NTSTATUS
(*PIO_COMPLETION_ROUTINE) (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

Le routine di completamento vengono chiamate a IRQL <= DISPATCH_LEVEL, in un contesto di thread arbitrario.

Poiché possono essere chiamati in IRQL DISPATCH_LEVEL, le routine di completamento non possono chiamare routine in modalità kernel che devono essere chiamate a un IRQL inferiore, ad esempio IoDeleteDevice. Per lo stesso motivo, tutte le strutture di dati usate in una routine di completamento devono essere allocate da un pool non di pagine.

Questa sezione illustra gli argomenti seguenti:

Modalità di esecuzione dell'elaborazione del completamento

Controllo del flag PendingReturned

Restituzione dello stato dalle routine di completamento

Esempio: semplice Pass-Through dispatch e completamento

Vincoli per le routine di completamento