IOCTL_ATA_PASS_THROUGH_DIRECT IOCTL (ntddscsi.h)
IOCTL_ATA_PASS_THROUGH_DIRECT ermöglicht es einer Anwendung, fast jeden ATA-Befehl mit den folgenden Einschränkungen an ein Zielgerät zu senden:
Wenn ein Klassentreiber für den Zieltyp des Geräts vorhanden ist, muss die Anwendung die Anforderung an den Klassentreiber senden. Daher kann eine Anwendung diese Anforderung nur direkt an den Systemporttreiber für eine logische Zieleinheit senden, wenn kein Klassentreiber für das Gerät vorhanden ist.
Die Anwendung muss diese Anforderung anstelle von IOCTL_ATA_PASS_THROUGH verwenden, wenn der eingebettete ATA-Befehl möglicherweise erfordert, dass der zugrunde liegende Miniporttreiber direkt auf den Arbeitsspeicher zugreifen kann.
Wenn der ATA-Befehl einen Datenübertragungsvorgang anfordert, muss der Aufrufer einen cacheorientierten Puffer einrichten, von dem oder in den der Treiber Daten direkt übertragen kann. Der Aufrufer sollte Folgendes sicherstellen:
- Die Datenübertragungsdauer erfüllt die E/A-Ausrichtungsanforderung des Geräts. Andernfalls schlägt diese IOCTL mit STATUS_INVALID_PARAMETER fehl.
- Die Datenübertragungsdauer sollte nicht größer als die maximale E/A-Übertragungslänge des Geräts sein. andernfalls wird erwartet, dass das Gerät bei der Anforderung fehlschlägt.
Die IOCTL_ATA_PASS_THROUGH_DIRECT-Anforderung wird in der Regel für die Übertragung großer Datenmengen (mehr als 16 KB) verwendet.
Hauptcode
Eingabepuffer
Der Puffer bei Irp-AssociatedIrp.SystemBuffer> enthält eine ATA_PASS_THROUGH_DIRECT-Struktur, die eine Reihe von Aufgabendateieingaberegistern enthält, die die Art des auszuführenden Befehls angeben. Der Aufrufer muss alle Member dieser Struktur mit Ausnahme von PathId, TargetId und Lun initialisieren, die der Porttreiber ausfüllt. Für einen Data-Out-Befehl muss das DataBuffer-Element von ATA_PASS_THROUGH_DIRECT auf einen cacheorientierten Puffer zeigen, der die zu schreibenden Daten enthält.
Eingabepufferlänge
Parameters.DeviceIoControl.InputBufferLength gibt die Größe des Puffers in Bytes bei Irp-AssociatedIrp.SystemBuffer> an. Der Wert von InputBufferLength ist festgelegt und hängt nicht von der übertragenen Datenmenge ab. Es entspricht sizeof(ATA_PASS_THROUGH_DIRECT). Wenn die Größe des Puffers kleiner als sizeof(ATA_PASS_THROUGH_DIRECT) ist, schlägt der Porttreiber die E/A-Anforderung fehl und gibt einen Fehler zurück.
Ausgabepuffer
Der Porttreiber formatiert die Rückgabedaten mithilfe einer ATA_PASS_THROUGH_DIRECT Struktur, die er im Puffer unter Irp-AssociatedIrp.SystemBuffer> speichert.
Der Porttreiber speichert die übertragenen Daten im cacheorientierten Puffer, auf den der DataBuffer-Membervon ATA_PASS_THROUGH_DIRECT verweist.
Der Porttreiber füllt den CurrentTaskFile-Member von ATA_PASS_THROUGH_DIRECT mit den Werten, die bei Abschluss des ATA-Befehls in den Ausgaberegistern des Geräts vorhanden sind. Die Anwendung ist für die Interpretation des Inhalts der Ausgaberegister verantwortlich, um zu bestimmen, welche Fehler , falls vorhanden, vom Gerät zurückgegeben wurden.
Länge des Ausgabepuffers
Der Porttreiber aktualisiert das DataTransferLength-Element der ATA_PASS_THROUGH_DIRECT-Struktur , um die Datenmenge anzugeben, die vom Gerät übertragen wurde.
Eingabe-/Ausgabepuffer
Keine.
Länge des Eingabe-/Ausgabepuffers
Nicht zutreffend.
Statusblock
Das Element Information ist auf die Anzahl der Bytes festgelegt, die im Ausgabepuffer bei Irp-AssociatedIrp.SystemBuffer> zurückgegeben werden. Das Element Status ist auf STATUS_SUCCESS oder möglicherweise auf STATUS_BUFFER_TOO_SMALL oder STATUS_INVALID_PARAMETER festgelegt, wenn der Eingabelängenwert in ATA_PASS_THROUGH_DIRECT nicht ordnungsgemäß festgelegt ist.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows Server 2003 |
Kopfzeile | ntddscsi.h (include Ntddscsi.h) |