Condividi tramite


Esempio: passaggio dell'IRP verso il basso senza impostare una routine di completamento

Nota

Per garantire un'affidabilità e prestazioni ottimali, usare i driver minifilter del file system con il supporto di Gestione filtri 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.

Per passare l'IRP ai driver di livello inferiore senza impostare una routine di completamento, una routine dispatch deve eseguire le azioni seguenti:

  • Chiamare IoSkipCurrentIrpStackLocation per rimuovere il percorso dello stack IRP corrente, in modo che Gestione I/O non cerchi una routine di completamento quando esegue l'elaborazione del completamento in IRP.
  • Chiamare IoCallDriver per passare l'IRP al driver di livello inferiore successivo.

Questa tecnica è illustrata negli esempi di codice seguenti:

IoSkipCurrentIrpStackLocation ( Irp ); 
return IoCallDriver ( NextLowerDriverDeviceObject, Irp ); 

In alternativa, in modo equivalente:

IoSkipCurrentIrpStackLocation ( Irp ); 
status = IoCallDriver ( NextLowerDriverDeviceObject, Irp ); 
/* log or debugprint the status value here */
return status; 

In questi esempi, il primo parametro nella chiamata a IoCallDriver è un puntatore all'oggetto dispositivo del driver di filtro di livello inferiore successivo. Il secondo parametro è un puntatore all'IRP.

Vantaggi di questo approccio

La chiamata a IoSkipCurrentIrpStackLocation è semplice ed efficiente e deve essere usata in tutti i casi in cui il driver passa l'IRP verso il basso lo stack di driver senza registrare una routine di completamento.

Svantaggi di questo approccio

Dopo la chiamata a IoCallDriver , il puntatore IRP passato a IoCallDriver non è più valido e non può essere dereferenziato in modo sicuro. Se il driver deve eseguire ulteriori operazioni di elaborazione o pulizia dopo che i driver di livello inferiore hanno elaborato l'IRP, deve impostare una routine di completamento prima di inviare l'IRP allo stack di driver. Per altre informazioni sulla scrittura e l'impostazione di routine di completamento, vedere Using Completion Routines.For more information about writing and setting completion routines, see Using Completion Routines.

Se chiami IoSkipCurrentIrpStackLocation per un IRP, non puoi impostare una routine di completamento.