Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Analogamente a tutti i driver in modalità kernel di livello superiore, un driver della classe di archiviazione deve configurare la posizione dello stack I/O di IRP per il driver inferiore successivo durante la gestione delle richieste alle periferiche di archiviazione. Nei IRP configurati dal driver di classe con SRB per il driver di porta fornito dal sistema operativo, la posizione nello stack di I/O del driver di porta viene impostata con quanto segue:
MajorFunction contiene IRP_MJ_SCSI
Parameters.Scsi.Srb contiene un puntatore a SRB
Ogni driver di classe è responsabile dell'allocazione della memoria per gli SRB e della loro configurazione con i CDB per il driver della porta di archiviazione sottostante. Il driver di classe può configurare un elenco di lookaside per i propri SRB con ExInitializeNPageLookasideList o chiamare ExAllocatePool per la memoria non paginata. Per altre informazioni sull'uso di elenchi Lookaside e del pool non di paging, consultare Using Lookaside Lists.
Indipendentemente dal fatto che alloca memoria dal pool o da un elenco lookaside creato dal driver, ogni driver della classe di archiviazione è responsabile della liberazione della memoria allocata per i database SRB. Le routine IoCompletion dei driver di classe di archiviazione, descritte in Routine IoCompletion del driver di classe di archiviazione, di solito restituiscono la memoria allocata per gli SRB a un elenco lookaside.
La routine BuildRequest di un driver di classe deve impostare i valori appropriati nei membri SRB, inclusa la lunghezza del CDB configurato per comunicare con il dispositivo. Per le richieste che restituiscono informazioni sul senso della richiesta e/o che il driver potrebbe dover riprovare, imposta una routine IoCompletion in IRP. Per le richieste di lettura o scrittura, esegue l'operazione OR con SrbFlags e la direzione di trasferimento appropriata, SRB_FLAGS_DATA_IN o SRB_FLAGS_DATA_OUT, rispettivamente.
Una routine BuildRequest potrebbe condividere la responsabilità di configurare un SRB con una coppia di routine SendSrbSynchronous e SendSrbAsynchronous . Ovvero, la routine BuildRequest potrebbe configurare i membri SRB comunemente configurati per tutte le richieste, mentre la routine SendSrbXxx esegue ogni set di valori SRB pertinenti solo a ogni tipo di richiesta. Quando un IRP viene passato al driver di porta da una routine SendSrbAsynchronous , l'IRP deve essere configurato con una routine IoCompletion fornita dal driver.
Dopo che il driver di classe è stato caricato, configura la maggior parte degli SRB con il membro Function impostato su SRB_FUNCTION_EXECUTE_SCSI, che indica una richiesta di I/O del dispositivo da inviare sul bus.
Per altre informazioni sui membri SRB definiti dal sistema e sui relativi valori, vedere SCSI_REQUEST_BLOCK.
Impostazione degli SRB per Request Sense
Un driver di classe può richiedere che il driver della porta restituisca informazioni SCSI di tipo request-sense o equivalenti quando il controller di destinazione restituisce una condizione di verifica. A tale scopo, il driver di classe configura il puntatore SenseInfoBuffer e SenseInfoBufferLength in SRB, in modo che il driver del port possa restituire le informazioni della request-sense se si verifica una condizione di controllo. Il driver di porta indica che ha restituito informazioni di tipo request-sense impostando il membro SrbStatus con SRB_STATUS_AUTOSENSE_VALID quando restituisce l'IRP. Per altre informazioni sulle routine InterpretSenseInfo , vedere La routine InterpretRequestSense del driver di classe di archiviazione.
Tentativi
I driver della classe di archiviazione sono responsabili di ripetere le richieste che falliscono a causa di errori del target/controller, reimpostazioni del bus o timeout delle richieste. Di conseguenza, molti driver di classe mantengono un conteggio dei tentativi nella propria posizione dello stack di I/O dell'IRP. Anche la routine BuildRequest di un driver di classe di questo tipo potrebbe inizializzare il limite di tentativi per una determinata richiesta prima di configurare la routine IoCompletion e inviare l'IRP al driver della porta. Per ulteriori informazioni sulle routine RetryRequest, consultare la routine RetryRequest del driver della classe di archiviazione.