Freigeben über


IOCTL_SCSI_PASS_THROUGH IOCTL (ntddscsi.h)

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.
  • Bidirektionale Datenübertragungsvorgänge werden nicht unterstützt.
  • 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.
  • 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 ist eine anforderung für gepufferte Gerätesteuerelemente. Um puffern im Systemspeicher zu umgehen, sollten Anrufer IOCTL_SCSI_PASS_THROUGH_DIRECTverwenden. Bei der Behandlung einer IOCTL_SCSI_PASS_THROUGH_DIRECT 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 im Puffer bei Irp->AssociatedIrp.SystemBuffer bei DataBufferOffset- in der SCSI_PASS_THROUGH Struktur enthalten. Der Anrufer muss jedoch zusätzlichen Speicher zuweisen, unmittelbar nach SCSI_PASS_THROUGH, 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)) sein muss. Die Größe der SCSI_PASS_THROUGH Struktur variiert je nach DataTransferLength Spezifikation.

Ausgabepuffer

Der Porttreiber gibt alle Anforderungsoptimierungsdaten und alle vom Gerät an den Puffer übertragenen Daten an Irp->AssociatedIrp.SystemBufferzurück.

Länge des Ausgabepuffers

Die SenseInfoLength und DataTransferLength in der SCSI_PASS_THROUGH-Struktur werden aktualisiert, um die Menge der übertragenen Daten 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 nicht ordnungsgemäß festgelegt ist.

Anforderungen

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

Siehe auch

SCSI_PASS_THROUGH