IOCTL_SCSI_PASS_THROUGH_EX IOCTL (ntddscsi.h)
Die IOCTL_SCSI_PASS_THROUGH_EX-Steuerungscodeanforderung ist die erweiterte Version der IOCTL_SCSI_PASS_THROUGH-Anforderung. Diese Anforderung bietet Unterstützung für bidirektionale Datenübertragungen und lässt einen Befehlsdatenblock (COMMAND Data Block, 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 Zielgerättyp vorhanden ist, muss die Anforderung an diesen Klassentreiber gesendet werden. Daher kann eine Anwendung diese Anforderung nur direkt an den Systemporttreiber für eine Ziel-LU senden, wenn kein Klassentreiber für den Gerätetyp vorhanden ist, der mit dieser LU verbunden ist. Der Systemporttreiber überprüft nicht, ob ein Gerät von einem Klassentreiber beansprucht wurde, bevor er eine Passthroughanforderung verarbeitet. Wenn eine Anwendung also einen Klassentreiber umgeht, der ein Gerät beansprucht hat, und eine Passthroughanforderung für dieses Gerät direkt an den Porttreiber sendet, kann ein Konflikt bei der Steuerung des Geräts zwischen dem Klassentreiber und der Anwendung auftreten. Wenn eine Passthrough-Anforderung an ein Adaptergerätobjekt gesendet wird und aus dem Benutzermodus stammt und auf eine LU abzielt, die von einem Klassentreiber beansprucht wird, schlägt Storport die Anforderung mit STATUS_INVALID_DEVICE_REQUEST fehl. Wenn die Anforderung an ein LU-Geräteobjekt gesendet wird, aus dem Kernelmodus stammt oder auf eine nicht beanspruchte LU abzielt, wird sie an den Miniporttreiber übergeben.
- Diese Anforderung kann nicht verwendet werden, wenn der CDB möglicherweise erfordert, dass der zugrunde liegende Miniporttreiber direkt auf den Arbeitsspeicher zugreifen kann. Wenn das CDB des Aufrufers möglicherweise direkten Zugriff auf den Arbeitsspeicher benötigt, verwenden Sie stattdessen IOCTL_SCSI_PASS_THROUGH_DIRECT_EX .
- Anwendungen dürfen nicht versuchen, eine Passthroughanforderung asynchron zu senden. Alle Passthroughanforderungen müssen synchron sein.
- Anwendungen erfordern keine Administratorrechte, um eine Passthrough-Anforderung an ein Gerät zu senden, aber sie müssen Lese-/Schreibzugriff auf das Gerät haben.
IOCTL_SCSI_PASS_THROUGH_EX ist eine gepufferte Gerätesteuerungsanforderung. Um die Pufferung im Systemspeicher zu umgehen, sollten Aufrufer IOCTL_SCSI_PASS_THROUGH_DIRECT_EX verwenden. Bei der Verarbeitung einer IOCTL_SCSI_PASS_THROUGH_DIRECT_EX-Anforderung sperrt das System den Puffer im Benutzerspeicher, und das Gerät greift direkt auf diesen Speicher zu.
Diese Anforderung wird in der Regel für die Übertragung kleiner Datenmengen (<16.000) verwendet.
Anwendungen können diese Anforderung mittels einer 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
Diese Struktur enthält ein SCSI-CDB, das vom Aufrufer initialisiert werden muss, mit Ausnahme des Pfads, der Ziel-ID und der logischen Einheitsnummer (Logical Unit Number, LUN), die vom Porttreiber ausgefüllt werden. Bei einem Data-out-Befehl werden die zu übertragenden Daten in den Puffer unter Irp-AssociatedIrp.SystemBuffer> bei DataInBufferOffset in der SCSI_PASS_THROUGH_EX-Struktur eingeschlossen. Der Aufrufer muss jedoch unmittelbar nach SCSI_PASS_THROUGH_EX zusätzlichen Speicher zuordnen, wenn der Aufrufer nach Anforderungsoptimierungsdaten fragt.
Länge des Eingabepuffers
Parameters.DeviceIoControl.InputBufferLength gibt die Größe des Puffers in Byte bei Irp->AssociatedIrp.SystemBuffer an, die mindestens sein muss (GrößederDaten( + SCSI_PASS_THROUGH_EX)). Die Größe der SCSI_PASS_THROUGH_EX-Struktur variiert je nach dem in DataInTransferLength angegebenen Wert.Ausgabepuffer
Der Porttreiber gibt alle Anforderungsoptimierungsdaten und alle vom Gerät übertragenen Daten an den Puffer von Irp-AssociatedIrp.SystemBuffer> zurück. SenseInfoLength und DataOutTransferLength in der SCSI_PASS_THROUGH_EX-Struktur werden aktualisiert, um die übertragene Datenmenge anzugeben.
Länge des Ausgabepuffers
SenseInfoLength und DataOutTransferLength in der SCSI_PASS_THROUGH_EX-Struktur werden aktualisiert, um die übertragene Datenmenge anzugeben.
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 Wert für die Eingabelänge in SCSI_PASS_THROUGH_EX nicht ordnungsgemäß festgelegt ist.
Hinweise
Um eine IOCTL_SCSI_PASS_THROUGH_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. Der in der STORAGE_ADAPTER_DESCRIPTIOR-Struktur zurückgegebene SrbType-Member gibt entweder SRB_TYPE_SCSI_REQUEST_BLOCK oder SRB_TYPE_STORAGE_REQUEST_BLOCK an.
Anforderungen
Anforderung | Wert |
---|---|
Header | ntddscsi.h (einschließen von Ntddscsi.h) |