IOCTL_SCSI_PASS_THROUGH_EX IOCTL (ntddscsi.h)
La richiesta di codice di controllo IOCTL_SCSI_PASS_THROUGH_EX è la versione estesa della richiesta di IOCTL_SCSI_PASS_THROUGH. Questa richiesta fornisce supporto per i trasferimenti di dati bidirezionali e consente un blocco di dati dei comandi (CDB) > 16 byte.
Consente a un'applicazione di inviare quasi qualsiasi comando SCSI a un dispositivo di destinazione, con le restrizioni seguenti:
- I comandi multitarget, ad esempio COPY, non sono consentiti.
- Se esiste un driver di classe per il tipo di dispositivo di destinazione, la richiesta deve essere inviata a tale driver di classe. Pertanto, un'applicazione può inviare questa richiesta direttamente al driver della porta di sistema per un'unità logica di destinazione (LU) solo se non è presente alcun driver di classe per il tipo di dispositivo connesso a tale lu. Il driver della porta di sistema non verifica se un dispositivo è stato richiesto da un driver di classe prima di elaborare una richiesta pass-through. Pertanto, se un'applicazione ignora un driver di classe che ha richiesto un dispositivo e invia una richiesta pass-through per tale dispositivo direttamente al driver della porta, può verificarsi un conflitto per il controllo del dispositivo tra il driver di classe e l'applicazione. Se una richiesta pass-through viene inviata a un oggetto dispositivo adattatore e se ha origine dalla modalità utente e ha come destinazione un lu richiesto da un driver di classe, Storport non riesce la richiesta con STATUS_INVALID_DEVICE_REQUEST. Se la richiesta viene inviata a un oggetto dispositivo LU, ha origine in modalità kernel o ha come destinazione un LU non richiesto, viene passata al driver miniport.
- Questa richiesta non può essere usata se il CDB potrebbe richiedere al driver miniport sottostante di accedere direttamente alla memoria. Se il CDB del chiamante potrebbe richiedere l'accesso diretto alla memoria, usare invece IOCTL_SCSI_PASS_THROUGH_DIRECT_EX.
- Le applicazioni non devono tentare di inviare una richiesta pass-through in modo asincrono. Tutte le richieste pass-through devono essere sincrone.
- Le applicazioni non richiedono privilegi amministrativi per inviare una richiesta pass-through a un dispositivo, ma devono avere accesso in lettura/scrittura al dispositivo.
IOCTL_SCSI_PASS_THROUGH_EX è una richiesta di controllo del dispositivo memorizzata nel buffer. Per ignorare il buffering nella memoria di sistema, i chiamanti devono usare IOCTL_SCSI_PASS_THROUGH_DIRECT_EX. Quando si gestisce una richiesta di IOCTL_SCSI_PASS_THROUGH_DIRECT_EX, il sistema blocca il buffer nella memoria utente e il dispositivo accede direttamente a questa memoria.
Questa richiesta viene in genere usata per trasferire piccole quantità di dati (<16.000).
Le applicazioni possono inviare questa richiesta tramite una richiesta di IRP_MJ_DEVICE_CONTROL.
I driver della classe di archiviazione impostano il numero IRP secondario su IRP_MN_SCSI_CLASS per indicare che la richiesta è stata elaborata da un driver di classe di archiviazione.
Codice principale
Buffer di input
Questa struttura include un CDB SCSI, che deve essere inizializzato dal chiamante, ad eccezione del percorso, dell'ID di destinazione e del numero di unità logica (LUN), compilato dal driver della porta. Per un comando di dataout, i dati da trasferire vengono inclusi nel buffer in Irp->AssociatedIrp.SystemBuffer in DataInBufferOffset nella struttura SCSI_PASS_THROUGH_EX. Tuttavia, il chiamante deve allocare spazio di archiviazione aggiuntivo, immediatamente dopo SCSI_PASS_THROUGH_EX, se il chiamante richiede dati di tipo request-sense.
Lunghezza del buffer di input
Parameters.DeviceIoControl.InputBufferLength indica le dimensioni, in byte, del buffer in Irp->AssociatedIrp.SystemBuffer, che deve essere almeno (dimensioni dei dati + sizeof(SCSI_PASS_THROUGH_EX)). Le dimensioni della struttura SCSI_PASS_THROUGH_EX variano a seconda del valore specificato in DataInTransferLength .Buffer di output
Il driver di porta restituisce i dati di tipo request-sense e tutti i dati trasferiti dal dispositivo al buffer in Irp->AssociatedIrp.SystemBuffer. I SenseInfoLength e DataOutTransferLength nella struttura SCSI_PASS_THROUGH_EX vengono aggiornati per indicare la quantità di dati trasferiti.
Lunghezza del buffer di output
I SenseInfoLength e DataOutTransferLength nella struttura SCSI_PASS_THROUGH_EX vengono aggiornati per indicare la quantità di dati trasferiti.
Blocco di stato
Il campo Informazioni è impostato sul numero di byte restituiti nel buffer di output in Irp->AssociatedIrp.SystemBuffer. Il campo Stato è impostato su STATUS_SUCCESS oppure su STATUS_BUFFER_TOO_SMALL o STATUS_INVALID_PARAMETER se il valore lunghezza di input in SCSI_PASS_THROUGH_EX non è impostato correttamente.
Osservazioni
Per emettere una richiesta di IOCTL_SCSI_PASS_THROUGH_EX, il dispositivo di archiviazione sottostante deve supportare srb estesi. Ciò significa che il tipo SRB supportato è SRB_TYPE_STORAGE_REQUEST_BLOCK. Un'applicazione può eseguire query per il supporto di SRB con la richiesta di IOCTL_STORAGE_QUERY_PROPERTY con un tipo di query di PropertyStandardQuery e un tipo di proprietà di StorageDeviceProperty. Il membro SrbType restituito nella struttura STORAGE_ADAPTER_DESCRIPTIOR indicherà SRB_TYPE_SCSI_REQUEST_BLOCK o SRB_TYPE_STORAGE_REQUEST_BLOCK.
Fabbisogno
Requisito | Valore |
---|---|
intestazione | ntddscsi.h (include Ntddscsi.h) |