Routine IoCompletion del driver della classe di archiviazione
Un driver della classe di archiviazione deve avere una o più routine IoCompletion , a meno che il driver non attenda in modo sincrono il completamento di ogni IRP inviato al driver di porta, ritenta le richieste in base alle esigenze, quindi rilascia memoria per i database SRB dall'interno di una routine dispatch o BuildRequest . Si noti che la gestione di ogni IRP in modo sincrono comporterà un peggioramento delle prestazioni del driver di classe. Inoltre, i driver della classe di archiviazione per i dispositivi che potrebbero contenere il file di pagina di sistema devono gestire tutte le richieste di trasferimento in modo asincrono e pertanto deve avere una routine IoCompletion per le richieste di lettura/scrittura.
Come descritto in Routine BuildRequest del driver della classe di archiviazione, i driver della classe di archiviazione sono responsabili della liberazione della memoria allocata per i database SRB, che si tratti di un elenco lookaside o di un pool non di paging. Come qualsiasi altro driver in modalità kernel di livello superiore, è anche responsabile del rilascio di tutti i provider di integrazione allocati, ad esempio un IRP per suddividere una richiesta di trasferimento, come descritto in SplitTransferRequest Routine del driver della classe di archiviazione.
La routine IoCompletion di un driver di classe è in definitiva responsabile di garantire che il blocco di stato di I/O sia impostato e per completare l'IRP originale. Si noti che il completamento di un IRP può includere la conversione di un errore restituito nel membro ScsiStatus di SRB o nel membro SenseInfoBuffer in un valore di tipo NTSTATUS e/o la registrazione di un errore, come descritto in Completamento di irP in Routine dispatch.
Quando si verificano determinati tipi di errori durante l'elaborazione di una richiesta, un driver della porta di archiviazione blocca la coda interna per l'unità logica di destinazione e imposta SRB_STATUS_QUEUE_FROZEN al completamento della richiesta. Di conseguenza, i driver di classe hanno in genere routine interne per modificare lo stato della coda per le richieste di I/O del dispositivo. Per altre informazioni, vedere Routine ReleaseQueue del driver della classe di archiviazione.
Se la routine BuildRequest del driver ha richiesto che il driver di porta restituisca informazioni di tipo request-sense per una richiesta, la routine IoCompletion chiama una routine InterpretRequestSense interna o implementa la stessa funzionalità inline. Per altre informazioni, vedere Routine InterpretRequestSense del driver della classe di archiviazione.
I driver della classe di archiviazione sono responsabili della ripetizione di richieste che hanno esito negativo a causa di errori del controller di destinazione, reimpostazioni del bus o timeout delle richieste. Quando il driver di porta restituisce una richiesta specifica con il relativo oggetto SrbStatus impostato per indicare un errore di questo tipo, il driver di classe può chiamare una routine RetryRequest dalla routine IoCompletion o, eventualmente, dalla routine InterpretRequestSense . Per altre informazioni, vedere Routine RetryRequest del driver della classe di archiviazione.
Per informazioni generali sulle routine IoCompletion , vedere Completamento dei runtime di integrazione.