Freigeben über


IOCTL_ATA_PASS_THROUGH IOCTL (ntddscsi.h)

Ermöglicht einer Anwendung, fast jeden ATA-Befehl an ein Zielgerät mit den folgenden Einschränkungen 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 direkt an den Systemporttreiber für eine Ziel-logische Einheit (LU) senden, wenn kein Klassentreiber für den Typ des mit dieser LU verbundenen Geräts vorhanden ist. Der Systemporttreiber überprüft nicht, ob ein Gerät von einem Klassentreiber beansprucht wurde, bevor eine Pass-Through-Anforderung verarbeitet wird. 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.
  • Diese Anforderung kann nicht verwendet werden, wenn für den Befehl der zugrunde liegende Treiber direkt auf den Arbeitsspeicher zugreifen muss. Wenn der Befehl des Aufrufers möglicherweise direkten Zugriff auf den Arbeitsspeicher erfordert, verwenden Sie stattdessen IOCTL_ATA_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 stellt den INHALT der ATA-Aufgabendatei für den vorgesehenen Befehl in der ATA_PASS_THROUGH_EX-Struktur bereit. Das System puffert alle Datenübertragungen. Diese Anforderung wird in der Regel zum Übertragen kleiner Datenmengen (weniger als 16 KB) verwendet.

Hauptcode

IRP_MJ_DEVICE_CONTROL

Eingabepuffer

Der Puffer bei Irp->AssociatedIrp.SystemBuffer sollte eine ATA_PASS_THROUGH_EX Struktur enthalten, die eine Reihe von Aufgabendateieingaberegistern enthält, die die Art der auszuführenden Befehle und deren Parameter angeben. Der Aufrufer muss alle Member dieser Struktur initialisieren, mit Ausnahme von PathId, TargetIdund Lun, die der Porttreiber ausfüllt. Bei einem Datenausgangsbefehl muss der DataBufferOffset- Member der Struktur auf einen zwischengespeicherten Puffer zeigen, der die zu schreibenden Daten enthält.

Eingabepufferlänge

Parameters.DeviceIoControl.InputBufferLength gibt die Größe des Puffers bei Irp->AssociatedIrp.SystemBufferan. Wenn der eingebettete ATA-Befehl ein Schreibvorgang ist, sollte die Größe des Eingabepuffers die Summe der Größe(ATA_PASS_THROUGH_EX) und der Wert im DataTransferLength Member von ATA_PASS_THROUGH_EXsein. Das folgende Pseudocodebeispiel zeigt, wie die Puffergröße berechnet wird:
ULONG buffsize; // size of the buffer
ATA_PASS_THROUGH_EX hdr;
hdr.DataTransferLength = size in bytes of the data transfer
buffsize = sizeof (ATA_PASS_THROUGH_EX) + hdr.DataTransferLength

Wenn der eingebettete ATA-Befehl ein Lesevorgang oder ein Gerätesteuerungsvorgang ist, der keine Datenübertragung umfasst, sollte InputBufferLength-Größe von (ATA_PASS_THROUGH_EX) entsprechen.

Wenn InputBufferLength- in beiden Fällen kleiner als Größe (ATA_PASS_THROUGH_EX) 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_EX Struktur und speichert die Daten im Puffer bei Irp->AssociatedIrp.SystemBuffer.

Der Porttreiber füllt das CurrentTaskFile Member mit den Werten aus, die in der Ausgabe des Geräts vorhanden sind, nach Abschluss des eingebetteten ATA-Befehls. Wenn der Befehl eine Datenübertragung war, speichert der Porttreiber die übertragenen Daten in einem zwischengespeicherten Puffer, der sich an einem Offset von DataBufferOffset Bytes vom Anfang der Struktur befindet. Die Anwendung ist für die Interpretation des Inhalts der Ausgaberegister verantwortlich, um festzustellen, welche Fehler ( falls vorhanden) vom Gerät zurückgegeben wurden.

Länge des Ausgabepuffers

Der Porttreiber aktualisiert das DataTransferLength Mitglied von ATA_PASS_THROUGH_EX, um die Menge der vom Gerät übertragenen Daten anzugeben. Wenn der eingebettete ATA-Befehl ein Schreibvorgang oder ein Gerätesteuerungsvorgang ist, der keine Daten überträgt, ist OutputBufferLength- gleich Größe von(ATA_PASS_THROUGH_EX). Wenn der eingebettete ATA-Befehl ein Lesevorgang ist, ist OutputBufferLength- gleich Größe(ATA_PASS_THROUGH_EX) + DataTransferLength.

Statusblock

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

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Ab Windows Server 2003 verfügbar.
Header- ntddscsi.h (include Ntddscsi.h)

Siehe auch

ATA_PASS_THROUGH_EX

IOCTL_ATA_PASS_THROUGH_DIRECT