IOCTL_SCSI_PASS_THROUGH_DIRECT IOCTL (ntddscsi.h)
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.
- Le operazioni di trasferimento dei dati bidirezionali non sono supportate.
- 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.
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 LUN, compilato dal driver della porta. Per un comando di uscita dei dati, i dati da trasferire devono trovarsi in un buffer allineato al dispositivo adattatore. Il membro databuffer di SCSI_PASS_THROUGH_DIRECT è un puntatore a questo buffer allineato al dispositivo adattatore. Il chiamante deve allocare spazio di archiviazione aggiuntivo, seguendo la struttura SCSI_PASS_THROUGH_DIRECT, 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 (ha dimensioni dei dati + sizeof (SCSI_PASS_THROUGH_DIRECT)). La dimensione della struttura SCSI_PASS_THROUGH_DIRECT è fissa.Buffer di output
Il driver di porta restituisce tutti i dati di tipo request-sense e la struttura SCSI_PASS_THROUGH_DIRECT nel buffer in Irp->AssociatedIrp.SystemBuffer.
Lunghezza del buffer di output
SenseInfoLength e DataTransferLength vengono aggiornati per indicare la quantità di dati trasferiti. Il driver della porta restituisce tutti i dati trasferiti dal dispositivo al buffer fornito allineato alla cache in DataBuffer .
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_SUCCESSoppure su STATUS_BUFFER_TOO_SMALL o STATUS_INVALID_PARAMETER se il valore lunghezza di input in SCSI_PASS_THROUGH_DIRECT non è impostato correttamente o il buffer specificato in DataBuffer non è allineato correttamente.
Osservazioni
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 inviando una richiesta di codice di controllo IOCTL_STORAGE_QUERY_PROPERTY con un tipo di query di PropertyStandardQuery e l'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 dell'adattatore DeviceObject.
Nella funzione di esempio seguente un buffer viene preparato come buffer di trasferimento 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;
}
Fabbisogno
Requisito | Valore |
---|---|
intestazione | ntddscsi.h (include Ntddscsi.h) |