IOCTL_SCSI_PASS_THROUGH_DIRECT_EX IOCTL (ntddscsi.h)
Die IOCTL_SCSI_PASS_THROUGH_DIRECT_EX-Steuerelementcodeanforderung ist die erweiterte Version der IOCTL_SCSI_PASS_THROUGH_DIRECT Anforderung. Diese Anforderung bietet Unterstützung für bidirektionale Datenübertragungen und lässt einen Befehlsdatenblock (CDB) > mit 16 Bytes zu.
Ermöglicht einer Anwendung das Senden von fast jedem SCSI-Befehl an ein Zielgerät mit den folgenden Einschränkungen:
- Multitarget-Befehle, z. B. COPY, sind nicht zulässig.
- Wenn ein Klassentreiber für den Zieltyp des Geräts vorhanden ist, muss die Anforderung an diesen Klassentreiber gesendet werden. Daher kann eine Anwendung diese Anforderung nur direkt an den Systemporttreiber für eine logische Zieleinheit senden, wenn kein Klassentreiber für den Gerätetyp vorhanden ist, der mit dieser LU verbunden ist.
- Diese Anforderung muss gestellt werden, wenn die Eingabe-CDB möglicherweise erfordert, dass der zugrunde liegende Miniporttreiber direkt auf den Arbeitsspeicher zugreifen kann.
Bewerbungen können diese Anforderung über eine IRP_MJ_DEVICE_CONTROL-Anforderung senden.
Speicherklassentreiber legen die Neben-IRP-Nummer auf IRP_MN_SCSI_CLASS fest, um anzugeben, dass die Anforderung von einem Speicherklassentreiber verarbeitet wurde.
Hauptcode
Eingabepuffer
Parameters.DeviceIoControl.InputBufferLength gibt die Größe des Puffers in Bytes bei Irp->AssociatedIrp.SystemBuffer an, die mindestens sein muss (Sense data sizeof + (SCSI_PASS_THROUGH_DIRECT_EX)). Die Größe der SCSI_PASS_THROUGH_DIRECT_EX-Struktur ist festgelegt.Diese Struktur enthält ein SCSI-CDB, das vom Aufrufer initialisiert werden muss, mit Ausnahme des Pfads, der Ziel-ID und der LUN, die vom Porttreiber eingegeben werden. Für einen Data-Out-Befehl müssen sich die zu übertragenden Daten in einem Adaptergerät ausgerichteten Puffer befinden. Das DataInBuffer-Element von SCSI_PASS_THROUGH_DIRECT_EX ist ein Zeiger auf diesen adaptergeräteorientierten Puffer. Der Aufrufer muss zusätzlichen Speicher gemäß der SCSI_PASS_THROUGH_DIRECT_EX-Struktur zuweisen, wenn der Aufrufer nach Anforderungssinnsdaten fragt.
Eingabepufferlänge
Parameters.DeviceIoControl.InputBufferLength gibt die Größe des Puffers in Bytes bei Irp->AssociatedIrp.SystemBuffer an, die mindestens sein muss (Sense data sizeof + (SCSI_PASS_THROUGH_DIRECT_EX)). Die Größe der SCSI_PASS_THROUGH_DIRECT_EX-Struktur ist festgelegt.Ausgabepuffer
Der Porttreiber gibt alle Anforderungssinnsdaten und die SCSI_PASS_THROUGH_DIRECT_EX Struktur an den Puffer von Irp-AssociatedIrp.SystemBuffer> zurück.
Länge des Ausgabepuffers
SenseInfoLength und DataOutTransferLength werden aktualisiert, um die Menge der übertragenen Daten anzugeben. Der Porttreiber gibt alle Daten zurück, die vom Gerät an den bereitgestellten cacheorientierten Puffer bei DataOutBuffer übertragen werden.
Statusblock
Das Feld Information ist auf die Anzahl der Bytes festgelegt, die im Ausgabepuffer bei Irp-AssociatedIrp.SystemBuffer> zurückgegeben werden. Das Feld Status ist auf STATUS_SUCCESS oder möglicherweise auf STATUS_BUFFER_TOO_SMALL oder STATUS_INVALID_PARAMETER festgelegt, wenn der Eingabelängenwert in SCSI_PASS_THROUGH_DIRECT_EX nicht ordnungsgemäß festgelegt ist oder der in DataInBuffer angegebene Puffer nicht ordnungsgemäß auf das Gerät ausgerichtet ist.
Hinweise
Für Datenübertragungsvorgänge ist ein Puffer mit einer Ausrichtung erforderlich, die dem Adaptergerät entspricht. Anwendungen können die Geräteausrichtungsmaske abrufen, indem sie eine IOCTL_STORAGE_QUERY_PROPERTY Steuerelementcodeanforderung mit dem Abfragetyp PropertyStandardQuery und der Eigenschaften-ID von StorageAdapterProperty ausstellen. Die Ausrichtungsmaske befindet sich im AlignmentMask-Element der zurückgegebenen STORAGE_ADAPTER_DESCRIPTOR-Struktur . Treiber können auch den Wert im AlignmentMask-Member des DeviceObject des Adapters verwenden.
In der folgenden Beispielfunktion wird ein Puffer als geräteorientierter Datenübertragungspuffer vorbereitet.
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;
}
Um eine IOCTL_SCSI_PASS_THROUGH_DIRECT_EX-Anforderung ausstellen zu können, muss das zugrunde liegende Speichergerät erweiterte SRBs unterstützen. Dies bedeutet, dass der unterstützte SRB-Typ SRB_TYPE_STORAGE_REQUEST_BLOCK ist. Eine Anwendung kann die SRB-Unterstützung mit der IOCTL_STORAGE_QUERY_PROPERTY-Anforderung mit dem Abfragetyp PropertyStandardQuery und dem Eigenschaftstyp StorageDeviceProperty abfragen. Das in der STORAGE_ADAPTER_DESCRIPTIOR-Struktur zurückgegebene SrbType-Element gibt entweder SRB_TYPE_SCSI_REQUEST_BLOCK oder SRB_TYPE_STORAGE_REQUEST_BLOCK an.
Anforderungen
Anforderung | Wert |
---|---|
Header | ntddscsi.h (include Ntddscsi.h) |