Pufferbeschreibungen für E/A-Steuerungscodes

E/A-Steuerungscodes sind in IRP_MJ_DEVICE_CONTROL - und IRP_MJ_INTERNAL_DEVICE_CONTROL-Anforderungen 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, stellen alle IRP_MJ_DEVICE_CONTROL - und IRP_MJ_INTERNAL_DEVICE_CONTROL-Anforderungen sowohl einen Eingabepuffer als auch einen Ausgabepuffer bereit. Die Art und Weise, wie das System diese Puffer beschreibt, hängt vom Datenübertragungstyp 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 stellen IRPs einen Zeiger auf einen Puffer bei Irp-AssociatedIrp.SystemBuffer> bereit. Dieser Puffer stellt sowohl den Eingabepuffer als auch den Ausgabepuffer dar, die in Aufrufen von DeviceIoControl und IoBuildDeviceIoControlRequest angegeben werden. Der Treiber überträgt Daten aus und dann in diesen Puffer.

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

Die Größe des Platzes, 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 stellen IRPs einen Zeiger auf einen Puffer bei Irp-AssociatedIrp.SystemBuffer> bereit. Dies stellt den ersten Puffer dar, der in Aufrufen von DeviceIoControl und IoBuildDeviceIoControlRequest angegeben wird. Die Puffergröße wird von Parameters.DeviceIoControl.InputBufferLength in der IO_STACK_LOCATION-Struktur des Treibers angegeben.

Für diese Übertragungstypen stellen IRPs auch einen Zeiger auf eine MDL unter Irp-MdlAddress> bereit. 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, beim Aufruf Daten im Puffer empfängt. Die MDL beschreibt einen Eingabepuffer, und die Angabe METHOD_IN_DIRECT stellt sicher, dass der ausführende Thread Über Lesezugriff auf den Puffer verfügt.

  • METHOD_OUT_DIRECT wird angegeben, wenn der Treiber, der das IRP verarbeitet, Vor abschluss des IRP Daten in den Puffer schreibt. Die MDL beschreibt einen Ausgabepuffer, und die Angabe METHOD_OUT_DIRECT stellt sicher, dass der ausführende 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.

METHOD_NEITHER

Der E/A-Manager stellt keine Systempuffer oder MDLs bereit. Das IRP stellt die virtuellen Benutzermodusadressen 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 von 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.