Freigeben über


Pufferbeschreibungen für E/A-Steuerelementcodes

I/O-Steuercodes sind in IRP_MJ_DEVICE_CONTROL und IRP_MJ_INTERNAL_DEVICE_CONTROL Anfragen enthalten. Der E/A-Manager erstellt diese Anforderungen als Ergebnis von Aufrufen von DeviceIoControl und IoBuildDeviceIoControlRequest.

Da DeviceIoControl und IoBuildDeviceIoControlRequest sowohl einen Eingabepuffer als auch einen Ausgabepuffer als Argumente akzeptieren, geben alle IRP_MJ_DEVICE_CONTROL - und IRP_MJ_INTERNAL_DEVICE_CONTROL-Anforderungen sowohl einen Eingabepuffer als auch einen Ausgabepuffer an. Die Art und Weise, wie das System diese Puffer beschreibt, hängt vom Datentyp der Datenübertragung ab. Der Übertragungstyp wird durch den TransferType-Wert im CTL_CODE-Makro angegeben, das IOCTL-Codewerte erstellt.

Das System beschreibt Puffer für jeden TransferType-Wert wie folgt.

METHOD_BUFFERED

Für diesen Übertragungstyp liefern IRPs einen Zeiger auf einen Puffer bei Irp-AssociatedIrp.SystemBuffer>. Dieser Puffer stellt sowohl den Eingabepuffer als auch den Ausgabepuffer dar, der in Aufrufen von DeviceIoControl und IoBuildDeviceIoControlRequest angegeben wird. Der Treiber überträgt Daten aus diesem Puffer und dann in diesen Puffer.

Für Eingabedaten wird die Puffergröße durch Parameters.DeviceIoControl.InputBufferLength in der IO_STACK_LOCATION Struktur des Treibers angegeben. Für Ausgabedaten wird die Puffergröße durch Parameters.DeviceIoControl.OutputBufferLength in der IO_STACK_LOCATION-Struktur des Treibers angegeben.

Die Größe des Abstands, den das System für den einzelnen Eingabe-/Ausgabepuffer zuweist, ist der größere der beiden Längenwerte.

METHOD_IN_DIRECT oder METHOD_OUT_DIRECT

Für diese Übertragungstypen liefern IRPs einen Zeiger auf einen Puffer bei Irp-AssociatedIrp.SystemBuffer>. Dies stellt den ersten Puffer dar, der in Aufrufen von DeviceIoControl und IoBuildDeviceIoControlRequest angegeben wird. Die Puffergröße wird durch Parameters.DeviceIoControl.InputBufferLength in der IO_STACK_LOCATION-Struktur des Treibers angegeben.

Für diese Übertragungstypen liefern IRPs auch einen Zeiger auf eine MDL bei Irp-MdlAddress>. Dies stellt den zweiten Puffer dar, der in Aufrufen von DeviceIoControl und IoBuildDeviceIoControlRequest angegeben wird. Dieser Puffer kann wie folgt als Eingabepuffer oder als Ausgabepuffer verwendet werden:

  • METHOD_IN_DIRECT wird angegeben, wenn der Treiber, der das IRP verarbeitet, Daten im Puffer empfängt, wenn er aufgerufen wird. Die MDL beschreibt einen Eingabepuffer und stellt METHOD_IN_DIRECT sicher, dass der ausgeführte Thread Lesezugriff auf den Puffer hat.

  • METHOD_OUT_DIRECT wird angegeben, wenn der Treiber, der die IRP verarbeitet, Daten in den Puffer schreibt, bevor das IRP abgeschlossen wird. Die MDL beschreibt einen Ausgabepuffer und stellt METHOD_OUT_DIRECT sicher, dass der ausgeführte Thread Schreibzugriff auf den Puffer hat.

Für beide Übertragungstypen gibt Parameters.DeviceIoControl.OutputBufferLength die Größe des Puffers an, der von der MDL beschrieben wird.

METHODE_KEINES

Der E/A-Manager stellt keine Systempuffer oder MDLs bereit. Das IRP stellt die virtuellen Adressen des Benutzermodus der Eingabe- und Ausgabepuffer bereit, die für DeviceIoControl oder IoBuildDeviceIoControlRequest angegeben wurden, ohne sie zu überprüfen oder zuzuordnen.

Die Adresse des Eingabepuffers wird von Parameters.DeviceIoControl.Type3InputBuffer in der IO_STACK_LOCATION Struktur des Treibers bereitgestellt, und die Adresse des Ausgabepuffers wird durch Irp-UserBuffer> angegeben.

Puffergrößen werden von Parameters.DeviceIoControl.InputBufferLength und Parameters.DeviceIoControl.OutputBufferLength in der IO_STACK_LOCATION Struktur des Treibers bereitgestellt.

Weitere Informationen zum CTL_CODE Makros und den oben aufgeführten Übertragungstypen finden Sie unter Definieren von E/A-Steuerungscodes.