IOCTL_SCSI_PASS_THROUGH_DIRECT_EX IOCTL (ntddscsi.h)

La richiesta di codice di controllo IOCTL_SCSI_PASS_THROUGH_DIRECT_EX è la versione estesa della richiesta di IOCTL_SCSI_PASS_THROUGH_DIRECT . Questa richiesta fornisce il supporto per i trasferimenti di dati bidirezionali e consente un blocco di dati di comando (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 solo se non è presente alcun driver di classe per il tipo di dispositivo connesso a tale LU.
  • Questa richiesta deve essere effettuata se il CDB di input potrebbe richiedere al driver miniport sottostante di accedere direttamente alla memoria.
L'applicazione chiamante crea il blocco descrittore del comando SCSI, che può includere una richiesta per i dati del senso della richiesta se si verifica una CONDIZIONE CHECK. Se il cdB richiede un'operazione di trasferimento dati, il chiamante deve configurare un buffer allineato al dispositivo adattatore da cui o in cui il driver miniport può trasferire direttamente i dati. Questa richiesta viene in genere usata per il trasferimento di grandi quantità di dati (>16K).

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.

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.
 

Codice principale

IRP_MJ_DEVICE_CONTROL

Buffer di input

Parameters.DeviceIoControl.InputBufferLength indica le dimensioni, in byte, del buffer in Irp->AssociatedIrp.SystemBuffer, che deve essere almeno (dimensioni dei dati + disensoof(SCSI_PASS_THROUGH_DIRECT_EX)). La dimensione della struttura SCSI_PASS_THROUGH_DIRECT_EX è fissa.

Questa struttura include un CDB SCSI, che deve essere inizializzato dal chiamante, ad eccezione del percorso, dell'ID di destinazione e del LUN, che vengono compilati dal driver di porta. Per un comando di dataout, i dati da trasferire devono trovarsi in un buffer allineato al dispositivo adattatore. Il membro DataInBuffer di SCSI_PASS_THROUGH_DIRECT_EX è un puntatore a questo buffer allineato al dispositivo adattatore. Il chiamante deve allocare spazio di archiviazione aggiuntivo, seguendo la struttura SCSI_PASS_THROUGH_DIRECT_EX , se il chiamante chiede i dati in senso richiesta.

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 + disensoof(SCSI_PASS_THROUGH_DIRECT_EX)). La dimensione della struttura SCSI_PASS_THROUGH_DIRECT_EX è fissa.

Buffer di output

Il driver di porta restituisce tutti i dati in senso richiesta e la struttura SCSI_PASS_THROUGH_DIRECT_EX nel buffer in Irp-AssociatedIrp.SystemBuffer>.

Lunghezza del buffer di output

SenseInfoLength e DataOutTransferLength vengono aggiornati per indicare la quantità di dati trasferiti. Il driver di porta restituisce tutti i dati trasferiti dal dispositivo al buffer allineato alla cache fornita in DataOutBuffer.

Blocco dello 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 o eventualmente su STATUS_BUFFER_TOO_SMALL o STATUS_INVALID_PARAMETER se il valore lunghezza di input in SCSI_PASS_THROUGH_DIRECT_EX è impostato in modo non corretto o il buffer specificato in DataInBuffer non è allineato correttamente.

Commenti

Per le operazioni di trasferimento dei dati, è necessario un buffer con allineamento corrispondente al dispositivo adattatore. Le applicazioni possono recuperare la maschera di allineamento del dispositivo emettendo una richiesta di codice di controllo IOCTL_STORAGE_QUERY_PROPERTY con un tipo di query propertyStandardQuery e id proprietà di StorageAdapterProperty. La maschera di allineamento si trova nel membro AlignmentMask della struttura STORAGE_ADAPTER_DESCRIPTOR restituita. I driver possono anche usare il valore nel membro AlignmentMask del DeviceObject dell'adattatore.

Nella funzione di esempio seguente viene preparato un buffer come buffer allineato ai dati allineato al dispositivo.


PVOID AllocateAlignedBuffer(ULONG size, ULONG AlignmentMask, PVOID *pUnAlignedBuffer)
{
    PVOID AlignedBuffer;
    ULONG_PTR FullWordMask = (ULONG_PTR)AlignmentMask;

    if (AlignmentMask == 0)
    {
        AlignedBuffer = malloc(size);
        // return the original buffer to free later
        *pUnAlignedBuffer = AlignedBuffer;
    }
    else
    {
        // expand the size for the alignment window
        size += AlignmentMask;
        AlignedBuffer = malloc(size);
        // return the original buffer to free later
        *pUnAlignedBuffer = AlignedBuffer;
        // adjust buffer pointer for the desired alignment
        AlignedBuffer = (PVOID)(((ULONG_PTR)AlignedBuffer + FullWordMask) & ~FullWordMask);
    }

    return AlignedBuffer;
}

Per eseguire una richiesta di IOCTL_SCSI_PASS_THROUGH_DIRECT_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 sul supporto di SRB con la richiesta di IOCTL_STORAGE_QUERY_PROPERTY con un tipo di query di PropertyStandardQuery e un tipo di proprietà StorageDeviceProperty. Il membro SrbType restituito nella struttura STORAGE_ADAPTER_DESCRIPTIOR indicherà SRB_TYPE_SCSI_REQUEST_BLOCK o SRB_TYPE_STORAGE_REQUEST_BLOCK.

Requisiti

Requisito Valore
Intestazione ntddscsi.h (include Ntddscsi.h)

Vedi anche

IOCTL_SCSI_PASS_THROUGH_EX

IOCTL_STORAGE_QUERY_PROPERTY

SCSI_PASS_THROUGH_DIRECT_EX