Condividi tramite


SCSI_REQUEST_BLOCK struttura (srb.h)

La struttura SCSI_REQUEST_BLOCK è associata a una funzione SRB.

Nota

I modelli di driver di porta SCSI e miniport SCSI possono essere modificati o non disponibili in futuro. È invece consigliabile usare i modelli di driver Storport e Miniport Storport.

Sintassi

typedef struct _SCSI_REQUEST_BLOCK {
  USHORT                     Length;
  UCHAR                      Function;
  UCHAR                      SrbStatus;
  UCHAR                      ScsiStatus;
  UCHAR                      PathId;
  UCHAR                      TargetId;
  UCHAR                      Lun;
  UCHAR                      QueueTag;
  UCHAR                      QueueAction;
  UCHAR                      CdbLength;
  UCHAR                      SenseInfoBufferLength;
  ULONG                      SrbFlags;
  ULONG                      DataTransferLength;
  ULONG                      TimeOutValue;
  PVOID                      DataBuffer;
  PVOID                      SenseInfoBuffer;
  struct _SCSI_REQUEST_BLOCK *NextSrb;
  PVOID                      OriginalRequest;
  PVOID                      SrbExtension;
  union {
    ULONG InternalStatus;
    ULONG QueueSortKey;
    ULONG LinkTimeoutValue;
  };
  ULONG                      Reserved;
  UCHAR                      Cdb[16];
} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;

Members

Length

Specifica le dimensioni in byte di questa struttura.

Function

Specifica l'operazione da eseguire, che può essere uno dei valori seguenti:

Valore Operazione
SRB_FUNCTION_EXECUTE_SCSI (0x00) Una richiesta di I/O del dispositivo SCSI deve essere eseguita nell'unità logica di destinazione.
SRB_FUNCTION_ABORT_COMMAND (0x10) Un messaggio SCSIMESS_ABORT deve essere inviato per annullare la richiesta a cui fa riferimento il membro NextSrb . Se si tratta di una richiesta di coda contrassegnata, è consigliabile usare un messaggio SCSIMESS_ABORT_WITH_TAG. Se la richiesta indicata è stata completata, questa richiesta deve essere completata normalmente. Sono validi solo i membri SRB Function, PathId, TargetId, Lun e NextSrb.
SRB_FUNCTION_RESET_DEVICE (0x13) Il driver SCSIPort non invia più questo SRB ai miniport. Solo i driver miniport Storport usano questa SRB. Il controller di destinazione SCSI deve essere reimpostato usando il messaggio di SCSIMESS_BUS_DEVICE_RESET. Il driver miniport deve completare tutte le richieste attive per il controller di destinazione. Sono validi solo i membri SRB ,TargetId ePathId .
SRB_FUNCTION_RESET_LOGICAL_UNIT (0x20) Se possibile, l'unità logica deve essere reimpostata. Il driver miniport HBA deve completare tutte le richieste attive per l'unità logica. Sono validi solo i membri function, PathId, TargetId e Lun di SRB. Storport supporta questo tipo di reimpostazione, ma la porta SCSI non è disponibile.
SRB_FUNCTION_RESET_BUS (0x12) Il bus SCSI deve essere reimpostato usando il messaggio SCSIMESS_BUS_DEVICE_RESET. Un driver miniport riceve questa richiesta solo se una determinata richiesta ha timeout e una richiesta successiva per interrompere la richiesta di timeout ha anche timeout. Sono validi solo i membri SRB Function e PathId .
SRB_FUNCTION_TERMINATE_IO (0x14) Un messaggio SCSIMESS_TERMINATE_IO_PROCESS deve essere inviato per annullare la richiesta puntata dal membro NextSrb . Se la richiesta indicata è già stata completata, questa richiesta deve essere completata normalmente. Sono validi solo i membri SRB Function, PathId, TargetId, Lun e NextSrb.
SRB_FUNCTION_RELEASE_RECOVERY (0x11) Un messaggio SCSIMESS_RELEASE_RECOVERY deve essere inviato al controller di destinazione. Sono validi solo i membri SRB,PathId, TargetId e Lun.
SRB_FUNCTION_RECEIVE_EVENT (0x03) L'HBA deve essere preparato per ricevere una notifica di evento asincrona dalla destinazione indirizzata. Il membro SRB DataBuffer indica dove inserire i dati.
SRB_FUNCTION_SHUTDOWN (0x07) Il sistema viene arrestato. Questa richiesta viene inviata a un driver miniport solo se imposta CachesData su TRUE nella PORT_CONFIGURATION_INFORMATION per l'HBA. Tale driver miniport può ricevere diverse di queste notifiche prima che tutte le attività di sistema vengano effettivamente arrestate. Tuttavia, l'ultima notifica di arresto verrà eseguita dopo l'ultimo avvio di I/O. Sono validi solo i membri SRB,PathId, TargetId e Lun.
SRB_FUNCTION_FLUSH (0x08) Il driver miniport deve scaricare tutti i dati memorizzati nella cache per il dispositivo di destinazione. Questa richiesta viene inviata al driver miniport solo se imposta CachesData su TRUE nella PORT_CONFIGURATION_INFORMATION per l'HBA. Sono validi solo i membri SRB,PathId, TargetId e Lun.
SRB_FUNCTION_IO_CONTROL (0x02) La richiesta è una richiesta di controllo I/O, che ha origine in un'applicazione in modalità utente con un hbA dedicato. SRB DataBuffer punta a un'intestazione SRB_IO_CONTROL seguita dall'area dati. Il valore in DataBuffer può essere usato dal driver, indipendentemente dal valore di MapBuffers. Solo i membri SRB Function, SrbFlags, TimeOutValue, DataBuffer e DataTransferLength sono validi, insieme al membro SrbExtension se il driver miniport richiedeva estensioni SRB durante l'inizializzazione. Se un driver miniport controlla un hbA dedicato all'applicazione in modo che supporti questa richiesta, il driver miniport deve eseguire la richiesta e notificare il driver di porta specifico del sistema operativo al termine dell'applicazione, usando il normale meccanismo di chiamate a SCSIPortNotification con RequestComplete e NextRequest.
SRB_FUNCTION_LOCK_QUEUE (0x18) Contiene richieste accodate dal driver di porta per una determinata unità logica, in genere mentre viene elaborata una richiesta di alimentazione. Sono validi solo i membri SRB Length,Function, SrbFlags e OriginalRequest . Quando la coda è bloccata, verranno elaborate solo le richieste con SrbFlags ORed con SRB_FLAGS_BYPASS_LOCKED_QUEUE. I driver miniport SCSI non elaborano SRB_FUNCTION_LOCK_QUEUE richieste.
SRB_FUNCTION_UNLOCK_QUEUE (0x19) Rilascia la coda del driver di porta per un'unità logica bloccata in precedenza con SRB_FUNCTION_LOCK_QUEUE. Gli SrbFlags della richiesta di sblocco devono essere ORed con SRB_FLAGS_BYPASS_LOCKED_QUEUE. Sono validi solo i membri SRB Length,Function, SrbFlags e OriginalRequest . I driver miniport SCSI non elaborano le richieste di SRB_FUNCTION_UNLOCK_QUEUE.
SRB_FUNCTION_UNLOCK_QUEUE (0x19) Rilascia la coda del driver di porta per un'unità logica bloccata in precedenza con SRB_FUNCTION_LOCK_QUEUE. Gli SrbFlags della richiesta di sblocco devono essere ORed con SRB_FLAGS_BYPASS_LOCKED_QUEUE. Sono validi solo i membri SRB Length,Function, SrbFlags e OriginalRequest . I driver miniport SCSI non elaborano le richieste di SRB_FUNCTION_UNLOCK_QUEUE.
SRB_FUNCTION_DUMP_POINTERS (0x26) Una richiesta con questa funzione viene inviata a un driver miniport Storport usato per controllare il disco che contiene i dati di dump di arresto anomalo. La richiesta raccoglie informazioni necessarie dal driver miniport per supportare il dump di arresto anomalo e l'ibernazione. Vedere la struttura MINIPORT_DUMP_POINTERS . Un driver miniport fisico deve impostare il flag di STOR_FEATURE_DUMP_POINTERS nel membro FeatureSupport del relativo HW_INITIALIZATION_DATA per ricevere una richiesta con questa funzione.
SRB_FUNCTION_FREE_DUMP_POINTERS (0x27) Una richiesta con questa funzione viene inviata a un driver miniport Storport per rilasciare qualsiasi risorsa allocata durante una richiesta precedente per SRB_FUNCTION_DUMP_POINTERS.

SrbStatus

Restituisce lo stato della richiesta completata. Questo membro deve essere impostato dal driver miniport prima di notificare al driver specifico del sistema operativo che la richiesta è stata completata chiamando SCSIPortNotification con RequestComplete. Il valore di questo membro può essere uno dei seguenti:

Valore Significato
SRB_STATUS_PENDING Indica che la richiesta è in corso. Il driver di porta specifico del sistema operativo inizializza SrbStatus a questo valore.
SRB_STATUS_SUCCESS Indica che la richiesta è stata completata correttamente.
SRB_STATUS_ABORTED Indica che la richiesta è stata interrotta come diretto dal driver della porta. Un driver miniport imposta questo stato in NextSrb per una richiesta di SRB_FUNCTION_ABORT_COMMAND riuscita.
SRB_STATUS_ABORT_FAILED Indica un tentativo di interruzione della richiesta non riuscita. Restituisce questo stato per una richiesta di SRB_FUNCTION_ABORT_COMMAND quando non è possibile trovare la richiesta specificata.
SRB_STATUS_ERROR Indica che la richiesta è stata completata con un errore nello stato del bus SCSI.
SRB_STATUS_BUSY Indica che il driver miniport o il dispositivo di destinazione non è riuscito ad accettare la richiesta in questo momento. Il driver di porta specifico del sistema operativo invia di nuovo la richiesta in un secondo momento.
SRB_STATUS_INTERNAL_ERROR Indica che il driver della porta SCSI non è riuscito a recapitare la richiesta al driver miniport o al dispositivo di destinazione. In questi casi, lo stato viene registrato in InternalStatus.
SRB_STATUS_INVALID_REQUEST Indica che il driver miniport non supporta la richiesta specificata.
SRB_STATUS_NO_DEVICE Indica che il dispositivo non ha risposto.
SRB_STATUS_TIMEOUT Indica il timeout della richiesta.
SRB_STATUS_SELECTION_TIMEOUT Indica il timeout della selezione del dispositivo SCSI.
SRB_STATUS_COMMAND_TIMEOUT Indica che la destinazione non ha completato il comando entro il limite di tempo.
SRB_STATUS_MESSAGE_REJECTED Indica la destinazione rifiutata da un messaggio. Questa operazione viene in genere restituita solo per le richieste di tipo messaggio come SRB_FUNCTION_TERMINATE_IO.
SRB_STATUS_BUS_RESET Indica che si è verificato un ripristino del bus durante l'esecuzione di questa richiesta.
SRB_STATUS_PARITY_ERROR Indica che si è verificato un errore di parità nel bus SCSI e che un nuovo tentativo non è riuscito.
SRB_STATUS_REQUEST_SENSE_FAILED Indica che il comando request-sense non è riuscito. Viene restituito solo se l'HBA esegue il rilevamento automatico della richiesta e il driver miniport imposta AutoRequestSense su TRUE nel PORT_CONFIGURATION_INFORMATION per questo HBA.
SRB_STATUS_NO_HBA Indica che l'HBA non risponde.
SRB_STATUS_DATA_OVERRUN Indica che si è verificato un errore di sovraccarico o sottorun dei dati. Il driver miniport deve anche aggiornare il membro DataTransferLength di SRB per indicare la quantità di dati effettivamente trasferiti se si verifica una sottorun.
SRB_STATUS_UNEXPECTED_BUS_FREE Indica la destinazione disconnessa in modo imprevisto.
SRB_STATUS_PHASE_SEQUENCE_FAILURE Indica che l'HBA ha rilevato un errore di errore della sequenza di fasi non valido.
SRB_STATUS_REQUEST_FLUSHED Indica che la richiesta di stato è stata arrestata.
SRB_STATUS_BAD_FUNCTION Indica che il codice della funzione SRB non è supportato.
SRB_STATUS_INVALID_PATH_ID Indica che il PathId specificato in SRB non esiste.
SRB_STATUS_INVALID_TARGET_ID Indica che il valore TargetID in SRB non è valido.
SRB_STATUS_INVALID_LUN Indica che il valore Lun in SRB non è valido.
SRB_STATUS_ERROR_RECOVERY Indica che la richiesta è stata completata con un errore nello stato del bus SCSI e che il messaggio SCSI INITIATE RECOVERY è stato ricevuto.
SRB_STATUS_AUTOSENSE_VALID Indica che le informazioni restituite in SenseInfoBuffer sono valide.
SRB_STATUS_QUEUE_FROZEN Un driver miniport non deve mai impostare il membro SrbStatus su questo valore. Il driver della porta di Windows può impostare questo valore per informare un driver della classe di archiviazione che la coda di richieste per una determinata periferica è stata bloccata.

ScsiStatus

Restituisce lo stato SCSI restituito dal dispositivo HBA o di destinazione. Se lo stato non è SUCCESS, il driver miniport deve impostare il membro SrbStatus su SRB_STATUS_ERROR.

PathId

Indica la porta o il bus SCSI per la richiesta. Questo valore è in base zero.

TargetId

Indica il controller di destinazione o il dispositivo nel bus.

Lun

Indica il numero di unità logica del dispositivo.

QueueTag

Contiene il valore queue-tag assegnato dal driver di porta specifico del sistema operativo. Se questo membro viene usato per l'accodamento con tag, l'HBA supporta l'accodamento interno delle richieste alle UNITÀ di calcolo e il set di driver miniport TaggedQueueing su TRUE nella PORT_CONFIGURATION_INFORMATION per l'HBA.

QueueAction

Indica il messaggio di accodamento con tag da utilizzare quando è impostato il flag di SRB_FLAGS_QUEUE_ACTION_ENABLE. Il valore può essere uno dei seguenti: SRB_SIMPLE_TAG_REQUEST, SRB_HEAD_OF_QUEUE_TAG_REQUEST o SRB_ORDERED_QUEUE_TAG_REQUEST, come definito in base alla specifica SCSI.

CdbLength

Indica le dimensioni in byte del blocco del descrittore di comandi SCSI-2 o versione successiva.

SenseInfoBufferLength

Indica le dimensioni in byte del buffer di rilevamento della richiesta. Se si verifica una sottorun, il driver miniport deve aggiornare questo membro al numero di byte effettivamente trasferiti.

SrbFlags

Indica vari parametri e opzioni sulla richiesta. SrbFlags è di sola lettura, tranne quando SRB_FLAGS_UNSPECIFIED_DIRECTION è impostato e sono necessari driver miniport di adattatori DMA subordinati per aggiornare SRB_FLAGS_DATA_IN o SRB_FLAGS_DATA_OUT. Questo membro può avere uno o più dei flag seguenti impostati:

Contrassegno Significato
SRB_FLAGS_QUEUE_ACTION_ENABLE Indica che le azioni della coda con tag devono essere abilitate.
SRB_FLAGS_DISABLE_AUTOSENSE Indica che le informazioni sul senso della richiesta non devono essere restituite.
SRB_FLAGS_DATA_IN Indica che i dati verranno trasferiti dal dispositivo al sistema.
SRB_FLAGS_DATA_OUT Indica che i dati verranno trasferiti dal sistema al dispositivo.
SRB_FLAGS_UNSPECIFIED_DIRECTION Definito per la compatibilità con le versioni precedenti con le interfacce SCSI ASPI/CAM, questo flag indica che la direzione di trasferimento potrebbe essere una delle due precedenti perché sono impostati entrambi i flag precedenti. Se questo flag è impostato, un driver miniport deve determinare la direzione di trasferimento esaminando la fase di dati per la destinazione sul bus SCSI. Se l'HBA è un dispositivo DMA subordinato, tale driver miniport deve aggiornare SRB_FLAGS_DATA_OUT o SRB_FLAGS_DATA_IN al valore corretto prima di chiamare ScsiPortIoMapTransfer.
SRB_FLAGS_NO_DATA_TRANSFER Indica che non viene trasferito alcun dato con questa richiesta. Se questa impostazione è impostata, i flag SRB_FLAGS_DATA_OUT, SRB_FLAGS_DATA_IN e SRB_FLAGS_UNSPECIFIED_DIRECTION sono chiari.
SRB_FLAGS_DISABLE_SYNCH_TRANSFER Indica l'HBA, se possibile, deve eseguire operazioni di I/O asincrone per questa richiesta di trasferimento. Se l'I/O sincrono è stato negoziato in precedenza, l'HBA deve rinegoziare per le operazioni di I/O asincrone prima di eseguire il trasferimento.
SRB_FLAGS_DISABLE_DISCONNECT Indica che l'HBA non deve consentire alla destinazione di disconnettersi dal bus SCSI durante l'elaborazione di questa richiesta.
SRB_FLAGS_BYPASS_FROZEN_QUEUE È irrilevante per i driver miniport.
SRB_FLAGS_NO_QUEUE_FREEZE È irrilevante per i driver miniport.
SRB_FLAGS_IS_ACTIVE È irrilevante per i driver miniport.
SRB_FLAGS_ALLOCATED_FROM_ZONE È irrilevante per i driver miniport ed è obsoleto per i driver di classe Windows correnti. Per un driver di classe legacy di Windows, questo indica se lo SRB è stato allocato da un buffer di zona. Se questo flag è impostato, il driver di classe deve chiamare ExInterlockedFreeToZone per rilasciare SRB; in caso contrario, deve chiamare ExFreePool. I nuovi driver di classe devono usare elenchi lookaside anziché buffer di zona.
SRB_FLAGS_SGLIST_FROM_POOL È irrilevante per i driver miniport. A un driver di classe Windows, questo indica che la memoria per un elenco a dispersione/raccolta è stata allocata da un pool non di paging. Se questo flag è impostato, il driver di classe deve chiamare ExFreePool per rilasciare la memoria dopo il completamento di SRB.
SRB_FLAGS_BYPASS_LOCKED_QUEUE È irrilevante per i driver miniport. Per il driver della porta, questo flag indica che la richiesta deve essere elaborata se la coda di unità logiche è bloccata. Un driver di livello superiore deve impostare questo flag per inviare una richiesta di SRB_FUNCTION_UNLOCK_QUEUE.
SRB_FLAGS_NO_KEEP_AWAKE È irrilevante per i driver miniport. Un driver di classe Windows usa questo flag per indicare al driver della porta di segnalare l'inattività anziché accendere il dispositivo per gestire questa richiesta.
SRB_FLAGS_FREE_SENSE_BUFFER Indica che la porta o il driver miniport ha allocato un buffer per i dati di rilevamento. In questo modo, il driver di classe deve liberare il buffer dei dati sense dopo l'estrazione dei dati.

DataTransferLength

Indica le dimensioni in byte del buffer di dati. Se si verifica una sottorun, il driver miniport deve aggiornare questo membro al numero di byte effettivamente trasferiti.

TimeOutValue

Indica l'intervallo in secondi che la richiesta può essere eseguita prima che il driver di porta specifico del sistema operativo possa considerarlo timeout. I driver Miniport non sono necessari per le richieste temporali perché il driver della porta lo fa già.

DataBuffer

Punta al buffer dei dati. I driver Miniport non devono usare questo valore come puntatore dati, a meno che il driver miniport non imposti MapBuffers su TRUE nella PORT_CONFIGURATION_INFORMATION per l'HBA. Nel caso di richieste di SRB_FUNCTION_IO_CONTROL, tuttavia, i driver miniport possono usare questo valore come puntatore dati indipendentemente dal valore di MapBuffers.

SenseInfoBuffer

Punta al buffer di rilevamento della richiesta. Un driver miniport non è necessario per fornire dati di tipo request-sense dopo una CONDIZIONE CHECK.

NextSrb

Indica il SCSI_REQUEST_BLOCK a cui si applica questa richiesta. Solo un piccolo subset di richieste usa un secondo SRB, ad esempio SRB_FUNCTION_ABORT_COMMAND.

OriginalRequest

Punta all'IRP per questa richiesta. Questo membro è irrilevante per i driver miniport

SrbExtension

Punta all'estensione Srb. Un driver miniport non deve utilizzare questo membro se imposta SrbExtensionSize su zero nel SCSI_HW_INITIALIZATION_DATA. La memoria in SrbExtension non viene inizializzata dal driver di porta specifico del sistema operativo e i dati determinati dal driver miniport possono essere accessibili direttamente dall'HBA. L'indirizzo fisico corrispondente può essere ottenuto chiamando ScsiPortGetPhysicalAddress con il puntatore SrbExtension .

InternalStatus

Usato dal driver della porta SCSI, invece di SrbStatus, per segnalare lo stato della richiesta completata ogni volta che la richiesta non può essere recapitata al driver miniport. In questi casi, SrbStatus è impostato su SRB_STATUS_INTERNAL_ERROR. Questo membro viene usato esclusivamente per la comunicazione tra la porta SCSI e il driver di classe e non deve essere usato dai driver miniport.

QueueSortKey

Specifica l'offset dall'inizio del supporto o zero, a seconda del tipo del dispositivo di destinazione.

LinkTimeoutValue

Valore di timeout del collegamento.

Reserved

Riservato.

Cdb[16]

Specifica il blocco descrittore di comandi SCSI-2 o versione successiva da inviare al dispositivo di destinazione.

Commenti

I driver di filtro e classe di archiviazione di Windows possono inviare srb con i valori di funzione seguenti al driver della porta di sistema:

  • SRB_FUNCTION_CLAIM_DEVICE per indicare che il driver di classe supporta una periferica identificata in SRB dai membri PathId, TargetId e Lun .
  • SRB_ATTACH_DEVICE per indicare che un driver di filtro, a più livelli sopra un driver di classe, vuole indirizzare prima le richieste di una determinata periferica al driver di filtro.
  • SRB_FUNCTION_RELEASE_DEVICE per indicare che un driver di classe rilascia l'attestazione in una determinata periferica.
  • SRB_FUNCTION_FLUSH_QUEUE per richiedere l'annullamento di eventuali richieste attualmente accodate nel driver di porta a una determinata periferica.
  • SRB_FUNCTION_RELEASE_QUEUE per richiedere che il driver della porta rilasci una coda bloccata di richieste a una determinata periferica.

I SRB_FUNCTION_XXX precedenti non vengono mai impostati in SRB inviati ai driver miniport SCSI. SRB_FUNCTION_REMOVE_DEVICE è definito per l'uso nelle versioni future del sistema. Anche questo non viene mai impostato nei driver miniport SCSI inviati ai driver del miniport SCSI. SRB_FUNCTION_WMI_REQUEST è valido solo in SCSI_WMI_REQUEST_BLOCK. Una classe di archiviazione o un driver di filtro usa questa opzione per inviare richieste WMI al driver della porta.

Requisiti

Requisito Valore
Intestazione srb.h (include Srb.h, Minitape.h, Storport.h)

Vedi anche

ExFreePool

ExInterlockedFreeToZone

HW_INITIALIZATION_DATA (SCSI)

PORT_CONFIGURATION_INFORMATION (SCSI)

SCSI_WMI_REQUEST_BLOCK

SRB_IO_CONTROL

ScsiPortGetPhysicalAddress

ScsiPortGetSrb

ScsiPortIoMapTransfer

ScsiPortNotification