Condividi tramite


Routine BuildRequest del driver della classe di archiviazione

Come tutti i driver in modalità kernel di livello superiore, un driver di 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. In IRP configurati dal driver di classe con srB per il driver di porta fornito dal sistema, la posizione dello stack I/O del driver di porta è impostata con quanto segue:

  • MajorFunction contiene IRP_MJ_SCSI

  • Parameters.Scsi.Srb contiene un puntatore alla SRB

Ogni driver di classe è responsabile dell'allocazione della memoria per gli SRB e della configurazione con i CDB per il driver della porta di archiviazione sottostante. Il driver di classe può configurare un elenco lookaside per gli SRBs con ExInitializeNPageLookasideList o chiamare ExAllocatePool per memoria non paginata. Per altre informazioni sull'uso di elenchi lookaside e pool non di pagina, vedere Uso di elenchi lookaside.

Indipendentemente dal fatto che alloca memoria dal pool o da un elenco lookaside creato dal driver, ogni driver di classe di archiviazione è responsabile della liberazione della memoria allocata per gli SRB. Routine IoCompletion dei driver della classe di archiviazione, descritte nelle routine IoCompletion del driver di classe di archiviazione, in genere rilasciano la memoria allocata per gli SRB in un elenco lookaside.

La routine BuildRequest di un driver di classe deve impostare i valori appropriati nei membri SRB, inclusa la lunghezza della CDB configurata 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, il controllo SrbFlags viene eseguito rispettivamente con la direzione di trasferimento appropriata, SRB_FLAGS_DATA_IN o SRB_FLAGS_DATA_OUT.

Una routine BuildRequest potrebbe condividere la responsabilità di configurare una SRB con una coppia di routine SendSrbSynchronous e SendSrbAsynchronous. Vale a dire, la routine BuildRequest potrebbe configurare i membri SRB comunemente configurati per tutte le richieste, mentre le routine SendSrbXxx ogni set di valori SRB sono pertinenti solo per ogni tipo di richiesta. Quando un'IRP viene passata al driver di porta da una routine SendSrbAsynchronous , l'IRP deve essere configurato con una routine IoCompletion fornita dal driver.

Dopo il caricamento del driver di classe, viene configurato la maggior parte degli SRB con il membro funzione 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.

Configurazione di SRB per Il senso della richiesta

Un driver di classe può richiedere che il driver di porta restituisca informazioni di richiesta SCSI o equivalenti quando il controller di destinazione restituisce una condizione di controllo. A tale scopo, il driver di classe configura il puntatore SenseInfoBuffer e SenseInfoBufferLength in SRB, in modo che il driver della porta possa restituire le informazioni sul senso della richiesta se si verifica una condizione di controllo. Il driver di porta indica che ha restituito informazioni sul senso della richiesta impostando il membro SrbStatus con SRB_STATUS_AUTOSENSE_VALID quando restituisce l'IRP. Per altre informazioni sulle routine InterpretSenseInfo , vedere Routine InterpretRequestSense del driver di classe di archiviazione.

Tentativi

I driver della classe di archiviazione sono responsabili della ripetizione dei tentativi che hanno esito negativo a causa di errori di destinazione/controller, reimpostazioni del bus o timeout delle richieste. Di conseguenza, molti driver di classe mantengono un conteggio dei tentativi nella propria posizione dello stack I/O dell'IRP. Tale routine BuildRequest di un driver di classe può anche inizializzare il limite di tentativi per una determinata richiesta prima di configurare la routine IoCompletion e invia l'IRP al driver di porta. Per altre informazioni sulle routine RetryRequest, vedere Routine retryRequest del driver di classe di archiviazione.