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.
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.
Hauptcode
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) |