Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
Quando la routine dispatch di un driver riceve un IRP, deve chiamare IoGetCurrentIrpStackLocation in modo che possa controllare la propria posizione dello stack di I/O e determinare che tutti i parametri sono validi. Se il driver non può soddisfare e completare la richiesta stessa, può eseguire una delle operazioni seguenti:
Inoltra l'IRP per un'ulteriore elaborazione da parte dei driver di livello inferiore.
Creare uno o più nuovi runtime di integrazione e passarli a driver di livello inferiore.
Un driver di livello superiore deve passare una richiesta di I/O a un driver inferiore successivo come indicato di seguito:
Se il driver passerà l'IRP di input al driver di livello inferiore successivo, la routine dispatch deve chiamare IoSkipCurrentIrpStackLocation o IoCopyCurrentIrpStackLocationToNext per configurare la posizione dello stack di I/O del driver inferiore successivo.
Se il driver chiama IoAllocateIrp per allocare uno o più IRP aggiuntivi per i driver di livelli inferiori, la routine di dispatch deve inizializzare la posizione dello stack I/O del driver di livello immediatamente inferiore seguendo i passaggi descritti in Elaborazione di IRP nel driver Intermediate-Level.
La routine dispatch può modificare alcuni parametri nella posizione dello stack I/O del driver inferiore successivo per determinate richieste. Ad esempio, un driver di livello superiore potrebbe modificare i parametri per una richiesta di trasferimento di grandi dimensioni quando il dispositivo sottostante ha un limite noto nella capacità di trasferimento e riutilizzare l'IRP per inviare richieste di trasferimento parziale al driver di dispositivo sottostante.
Chiamare IoSetCompletionRoutine.
Se la routine dispatch passa un IRP ricevuto al driver inferiore successivo, l'impostazione di una routine IoCompletion è facoltativa ma utile, perché la routine può eseguire attività come determinare come i driver inferiori abbiano completato la richiesta, riutilizzare l'IRP per trasferimenti parziali, aggiornare lo stato mantenuto dal driver se segue gli IRP, e ritentare una richiesta che è stata restituita con un errore.
Se la routine dispatch ha allocato nuovi IRP, è necessario impostare una routine IoCompletion perché la routine deve rilasciare ogni IRP dopo che i driver di livello inferiore lo hanno completato.
Per ulteriori informazioni sulle routine IoCompletion, vedere Completing IRPs.
Chiamare IoCallDriver con ogni IRP da elaborare con driver inferiori.
Restituisce un valore NTSTATUS appropriato, ad esempio:
STATO_IN_ATTESA
Il driver restituisce in genere STATUS_PENDING se l'IRP di input è una richiesta asincrona, ad esempio IRP_MJ_READ o IRP_MJ_WRITE.
Risultato della chiamata a IoCallDriver
Il driver restituisce spesso il risultato della chiamata a IoCallDriver se l'IRP di input è una richiesta sincrona, ad esempio IRP_MJ_CREATE.
Un driver di dispositivo di livello più basso passa qualsiasi IRP che non può completare nella sua routine di dispatch ad altre routine driver nel modo seguente:
Chiamare IoMarkIrpPending con l'IRP di input.
Chiamare IoStartPacket per passare o accodare l'IRP alla routine StartIo del driver, a meno che il driver non gestisca il proprio accodamento IRP interno, come descritto in Driver-Managed code IRP.
Se il driver non dispone di una routine StartIo ma gestisce IRP annullabili, deve registrare una routine Cancel o implementare una coda IRP annullabile. Per ulteriori informazioni sulle routine di annullamento, vedere Annullamento degli IRP.
Restituisci STATUS_PENDING.