Routine di completamento I/O del driver della classe di archiviazione

Un driver di 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 srb dall'interno di una routine dispatch o BuildRequest . Si noti che la gestione di ogni IRP in modo sincrono degraderà le prestazioni del driver di classe. Inoltre, i driver di 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 devono avere una routine IoCompletion per le richieste di lettura/scrittura.

Come descritto nella routine BuildRequest del driver della classe di archiviazione, i driver della classe di archiviazione sono responsabili della liberazione della memoria allocata per gli SRB, sia che la restituiscano a una lista lookaside o a un pool non di paging. Come qualsiasi altro driver in modalità kernel di livello superiore, sono anche responsabili del rilascio di tutti gli IRP che allocano, ad esempio un IRP per suddividere una richiesta di trasferimento come descritto in SplitTransferRequest Routine del driver di classe di archiviazione.

La routine IoCompletion di un driver di classe è in definitiva responsabile della verifica dell'impostazione del blocco di stato di I/O e per il completamento dell'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 (LU) e imposta SRB_STATUS_QUEUE_FROZEN al completamento della richiesta. Di conseguenza, i driver di classe in genere hanno routine interne per modificare lo stato della coda per le richieste di I/O del dispositivo. Per ulteriori informazioni, consultare la routine ReleaseQueue del driver di classe di archiviazione.

Se la routine BuildRequest del driver ha richiesto che il driver di porta restituisca informazioni sul senso della richiesta per una richiesta, la routine IoCompletion chiama una routine InterpretRequestSense interna o implementa la stessa funzionalità inline. Per altre informazioni, vedere La routine InterpretRequestSense del driver della classe di archiviazione.

I driver della classe di archiviazione sono responsabili della ripetizione dei tentativi 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 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 ulteriori informazioni, vedere la routine RetryRequest del driver della classe di archiviazione.

Per informazioni generali sulle routine IoCompletion, vedere Completamento degli IRP.