IOCTL_SCSI_PASS_THROUGH IOCTL (ntddscsi.h)
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.
- Bidirektionale Datenübertragungsvorgänge werden nicht unterstützt.
- 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 .
- 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 ist eine gepufferte Gerätesteuerungsanforderung. Um die Pufferung im Systemspeicher zu umgehen, sollten Aufrufer IOCTL_SCSI_PASS_THROUGH_DIRECT verwenden. Bei der Verarbeitung 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 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 im Puffer unter Irp-AssociatedIrp.SystemBuffer> bei DataBufferOffset in der SCSI_PASS_THROUGH-Struktur eingeschlossen. Der Aufrufer muss jedoch unmittelbar nach SCSI_PASS_THROUGH zusätzlichen Speicher zuordnen, wenn der Aufrufer nach Anforderungsoptimierungsdaten fragt.
Länge des Eingabepuffers
Parameters.DeviceIoControl.InputBufferLength gibt die Größe des Puffers in Bytes bei Irp->AssociatedIrp.SystemBuffer an, die mindestens sein muss (Sense Data sizeof + (SCSI_PASS_THROUGH)). Die Größe der SCSI_PASS_THROUGH-Struktur variiert je nach DataTransferLength-Spezifikation .Ausgabepuffer
Der Porttreiber gibt alle Anforderungsoptimierungsdaten und alle vom Gerät übertragenen Daten an den Puffer von Irp-AssociatedIrp.SystemBuffer> zurück.
Länge des Ausgabepuffers
SenseInfoLength und DataTransferLength in der SCSI_PASS_THROUGH-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 nicht ordnungsgemäß festgelegt ist.
Anforderungen
Anforderung | Wert |
---|---|
Header | ntddscsi.h (einschließen von Ntddscsi.h) |