I/O 制御コードのバッファー記述

I/O 制御コードは、 IRP_MJ_DEVICE_CONTROL および IRP_MJ_INTERNAL_DEVICE_CONTROL 要求に含まれています。 I/O マネージャーは、 DeviceIoControlIoBuildDeviceIoControlRequest の呼び出しの結果として、これらの要求を作成します。

DeviceIoControlIoBuildDeviceIoControlRequest は、入力バッファーと出力バッファーの両方を引数として受け入れるため、すべてのIRP_MJ_DEVICE_CONTROLおよびIRP_MJ_INTERNAL_DEVICE_CONTROL要求で入力バッファーと出力バッファーの両方が提供されます。 システムがこれらのバッファーを記述する方法は、データ転送の種類によって異なります。 転送の種類は、IOCTL コード値を作成するCTL_CODE マクロの TransferType 値によって指定されます。

システムは、各 TransferType 値のバッファーを次のように記述します。

METHOD_BUFFERED

この転送の種類では、IRP は Irp->AssociatedIrp.SystemBufferでバッファーへのポインターを提供します。 このバッファーは、DeviceIoControlIoBuildDeviceIoControlRequest の呼び出しで指定された入力バッファーと出力バッファーの両方を表します。 ドライバーは、このバッファーからデータを転送します。

入力データの場合、バッファー サイズは、ドライバーの IO_STACK_LOCATION 構造体の Parameters.DeviceIoControl.InputBufferLength によって指定されます。 入力データの場合、バッファー サイズは、ドライバーの IO_STACK_LOCATION 構造体の Parameters.DeviceIoControl.InputBufferLength によって指定されます。

システムが単一の入出力バッファーに割り当てるスペースのサイズは、2 つの長さの値の中で大きくなります。

METHOD_IN_DIRECT または METHOD_OUT_DIRECT

この転送の種類では、IRP は Irp->AssociatedIrp.SystemBuffer でバッファーへのポインターを提供します。 これは、 DeviceIoControl および IoBuildDeviceIoControlRequest の呼び出しで指定された最初のバッファーを表します。 入力データの場合、バッファー サイズは、ドライバーの IO_STACK_LOCATION 構造体の Parameters.DeviceIoControl.InputBufferLength によって指定されます。

これらの転送の種類では、 Irp->MdlAddress へのポインターも指定します。 これは、DeviceIoControl および IoBuildDeviceIoControlRequest の呼び出しで指定された最初のバッファーを表します。 このバッファーは、次のように入力バッファーまたは出力バッファーとして使用できます。

  • METHOD_IN_DIRECTは、IRP を処理するドライバーが呼び出されたときにバッファー内のデータを受信する場合に指定されます。 MDL は入力バッファーを記述し、METHOD_IN_DIRECTを指定すると、実行中のスレッドがバッファーへの読み取りアクセス権を持っていることを保証します。

  • METHOD_OUT_DIRECTは、IRP を処理するドライバーが IRP を完了する前にバッファーにデータを書き込む場合に指定します。 MDL は出力バッファーを記述し、METHOD_OUT_DIRECTを指定することで、実行中のスレッドがバッファーへの書き込みアクセス権を持っていることを確認します。

これらの両方の転送の種類の Parameters.DeviceIoControl.OutputBufferLength は、MDL によって記述されるバッファーのサイズを指定します。

METHOD_NEITHER

I/O マネージャーは、システム バッファーと MDL のいずれも提供しません。 IRP は、検証とマッピングのどちらも行わずに、DeviceIoControl または IoBuildDeviceIoControlRequest に指定された I/O バッファーのユーザーモードの仮想アドレスを提供します。

入力バッファーのアドレスは、ドライバーの IO_STACK_LOCATION 構造体で Parameters.DeviceIoControl.Type3InputBuffer によって提供され、出力バッファーのアドレスは Irp->UserBuffer で指定されます。

バッファー サイズは、ドライバーの IO_STACK_LOCATION 構造体で Parameters.DeviceIoControl.InputBufferLengthParameters.DeviceIoControl.OutputBufferLength によって提供されます。

CTL_CODE マクロおよび上記の転送タイプの詳細については、入出力制御コードの定義を参照してください。