I/O 制御コードは、 IRP_MJ_DEVICE_CONTROL および IRP_MJ_INTERNAL_DEVICE_CONTROL要求に 含まれています。 I/O マネージャーは、DeviceIoControl と IoBuildDeviceIoControlRequest の呼び出しの結果として、これらの要求を作成します。
DeviceIoControl と IoBuildDeviceIoControlRequest は、入力バッファーと出力バッファーの両方を引数として受け入れるため、すべてのIRP_MJ_DEVICE_CONTROL要求とIRP_MJ_INTERNAL_DEVICE_CONTROL要求で入力バッファーと出力バッファーの両方が提供されます。 システムがこれらのバッファーを記述する方法は、データ転送の種類によって異なります。 転送の種類は、IOCTL コード値を作成する CTL_CODE マクロの TransferType 値によって指定されます。
システムは、 各 TransferType 値のバッファーを次のように記述します。
メソッド_バッファード
この転送の種類では、IRP は Irp->AssociatedIrp.SystemBuffer でバッファーへのポインターを提供します。 このバッファーは、 DeviceIoControl と IoBuildDeviceIoControlRequest の呼び出しで指定された入力バッファーと出力バッファーの両方を表します。 ドライバーは、このバッファーからデータを転送し、その後、このバッファーにデータを転送します。
入力データの場合、バッファー サイズはドライバーのIO_STACK_LOCATION構造体の Parameters.DeviceIoControl.InputBufferLength によって指定されます。 出力データの場合、バッファー サイズは、ドライバーのIO_STACK_LOCATION構造体の Parameters.DeviceIoControl.OutputBufferLength によって指定されます。
システムが単一の入出力バッファーに割り当てるスペースのサイズは、2 つの長さの値の中で大きくなります。
METHOD_IN_DIRECT または METHOD_OUT_DIRECT
これらの転送の種類では、IRPが Irp->AssociatedIrp.SystemBuffer にあるバッファーへのポインターを指定します。 これは、DeviceIoControl および IoBuildDeviceIoControlRequest の呼び出しで指定された最初のバッファーを表します。 バッファー サイズは、ドライバーのIO_STACK_LOCATION構造体の Parameters.DeviceIoControl.InputBufferLength によって指定されます。
これらの転送の種類では、IRP は、 Irp->MdlAddress で MDL へのポインターも提供します。 これは、DeviceIoControl および IoBuildDeviceIoControlRequest の呼び出しで指定される 2 番目のバッファーを表します。 このバッファーは、次のように入力バッファーまたは出力バッファーとして使用できます。
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 に指定された入力バッファーと出力バッファーのユーザー モードの仮想アドレスを提供します。
入力バッファーのアドレスは、ドライバーのIO_STACK_LOCATION構造体で Parameters.DeviceIoControl.Type3InputBuffer によって提供され、出力バッファーのアドレスは Irp->UserBuffer で指定されます。
バッファー サイズは、ドライバーのIO_STACK_LOCATION構造体で Parameters.DeviceIoControl.InputBufferLength と Parameters.DeviceIoControl.OutputBufferLength によって提供されます。
CTL_CODEマクロおよび上記の転送タイプの詳細については、入出力制御コードの定義を参照してください。