Freigeben über


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.
Die aufrufende Anwendung erstellt den SCSI-Befehlsdeskriptorblock, der eine Anforderung für Anforderungsoptimierungsdaten enthalten kann, wenn eine CHECK CONDITION auftritt.

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.

Hinweis Der SCSI-Porttreiber und die SCSI-Miniporttreibermodelle sind möglicherweise geändert oder in Zukunft nicht mehr verfügbar. Stattdessen wird empfohlen, die Modelle Storport-Treiber und Storport-Miniporttreiber zu verwenden.
 

Hauptcode

IRP_MJ_DEVICE_CONTROL

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)

Weitere Informationen

SCSI_PASS_THROUGH_EX