Freigeben über


IOCTL_SCSI_PASS_THROUGH_EX IOCTL (ntddscsi.h)

Die IOCTL_SCSI_PASS_THROUGH_EX Steuerelementcodeanforderung ist die erweiterte Version der IOCTL_SCSI_PASS_THROUGH Anforderung. Diese Anforderung bietet Unterstützung für bidirektionale Datenübertragungen und ermöglicht einen Befehlsdatenblock (CDB) > 16 Bytes.

Ermöglicht einer Anwendung, fast jeden SCSI-Befehl an ein Zielgerät mit den folgenden Einschränkungen zu senden:

  • Multitarget-Befehle, z. B. KOPIEREN, 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 direkt an den Systemporttreiber für eine Ziel-logische Einheit (LU) senden, wenn es keinen Klassentreiber für den Gerätetyp gibt, der mit dieser LU verbunden ist. Der Systemporttreiber überprüft nicht, ob ein Gerät von einem Klassentreiber beansprucht wurde, bevor er eine Pass-Through-Anforderung verarbeitet. Wenn eine Anwendung daher einen Klassentreiber umgeht, der ein Gerät beansprucht hat und eine Pass-Through-Anforderung für dieses Gerät direkt an den Porttreiber sendet, kann ein Konflikt zur Steuerung des Geräts zwischen dem Klassentreiber und der Anwendung auftreten. Wenn eine Pass-Through-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 den zugrunde liegenden Miniporttreiber benötigt, um direkt auf den Arbeitsspeicher zuzugreifen. Wenn das CDB des Anrufers möglicherweise direkten Zugriff auf den Arbeitsspeicher erfordert, verwenden Sie stattdessen IOCTL_SCSI_PASS_THROUGH_DIRECT_EX.
  • Anwendungen dürfen nicht versuchen, eine Pass-Through-Anforderung asynchron zu senden. Alle Pass-Through-Anforderungen müssen synchron sein.
  • Anwendungen erfordern keine Administratorrechte, um eine Pass-Through-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 anforderung für gepufferte Gerätesteuerelemente. Um puffern im Systemspeicher zu umgehen, sollten Anrufer IOCTL_SCSI_PASS_THROUGH_DIRECT_EXverwenden. Bei der Behandlung 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 zum Übertragen kleiner Datenmengen (<16K) verwendet.

Anwendungen 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.

Hinweis Der SCSI-Porttreiber und die SCSI-Miniporttreibermodelle können in Zukunft geändert oder nicht mehr verfügbar sein. Stattdessen empfehlen wir die Verwendung des Storport-Treibers und Storport Miniport Treibermodelle.
 

Hauptcode

IRP_MJ_DEVICE_CONTROL

Eingabepuffer

Diese Struktur enthält einen SCSI CDB, der vom Aufrufer initialisiert werden muss, mit Ausnahme der Pfad-, Ziel-ID und logischen Einheitennummer (LUN), die vom Porttreiber ausgefüllt werden. Bei einem Datenausgangsbefehl werden die zu übertragenden Daten in den Puffer bei Irp->AssociatedIrp.SystemBuffer bei DataInBufferOffset- in der SCSI_PASS_THROUGH_EX Struktur eingeschlossen. Der Anrufer muss jedoch zusätzlichen Speicher zuweisen, unmittelbar nach SCSI_PASS_THROUGH_EX, wenn der Anrufer nach Anforderungsoptimierungsdaten fragt.

Eingabepufferlänge

Parameters.DeviceIoControl.InputBufferLength gibt die Größe des Puffers bei Irp->AssociatedIrp.SystemBuffer-an, die mindestens (Sense-Datengröße + Größe(SCSI_PASS_THROUGH_EX)) sein muss. 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 an den Puffer übertragenen Daten an Irp->AssociatedIrp.SystemBufferzurück. Die SenseInfoLength und DataOutTransferLength in der SCSI_PASS_THROUGH_EX-Struktur werden aktualisiert, um die Übertragene Datenmenge anzugeben.

Länge des Ausgabepuffers

Die SenseInfoLength und DataOutTransferLength in der SCSI_PASS_THROUGH_EX-Struktur werden aktualisiert, um die Übertragene Datenmenge anzugeben.

Statusblock

Das Feld Information wird auf die Anzahl der im Ausgabepuffer zurückgegebenen Bytes bei Irp->AssociatedIrp.SystemBufferfestgelegt. Das feld Status wird auf STATUS_SUCCESS oder möglicherweise auf STATUS_BUFFER_TOO_SMALL oder STATUS_INVALID_PARAMETER festgelegt, wenn die Eingabe Length Wert in SCSI_PASS_THROUGH_EX nicht ordnungsgemäß festgelegt ist.

Bemerkungen

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_BLOCKist. Eine Anwendung kann die SRB-Unterstützung mit der IOCTL_STORAGE_QUERY_PROPERTY-Anforderung mit einem Abfragetyp von PropertyStandardQuery- und einem Eigenschaftstyp von StorageDevicePropertyabfragen. Das in der STORAGE_ADAPTER_DESCRIPTIOR Struktur zurückgegebene SrbType-Element gibt entweder SRB_TYPE_SCSI_REQUEST_BLOCK oder SRB_TYPE_STORAGE_REQUEST_BLOCKan.

Anforderungen

Anforderung Wert
Header- ntddscsi.h (include Ntddscsi.h)

Siehe auch

SCSI_PASS_THROUGH_EX