I/O 制御コードの概要

I/O 制御コード (IOCTL) は、ユーザー モード アプリケーションとドライバー間の通信、またはスタック内のドライバー間の内部通信に使用されます。 I/O 制御コードは、IRP を使用して送信されます。

ユーザー モード アプリケーションは、Microsoft Windows SDK ドキュメントで説明されている DeviceIoControl を呼び出して、ドライバーに IOCTL を送信します。 DeviceIoControl を呼び出すと、I/O マネージャーは IRP_MJ_DEVICE_CONTROL 要求を作成し、最上位のドライバーに送信します。

さらに、上位レベルのドライバーは、IRP_MJ_DEVICE_CONTROL または IRP_MJ_INTERNAL_DEVICE_CONTROL 要求を作成して送信することで、下位レベルのドライバーに IOCTL を送信できます。 ドライバーは、DispatchDeviceControl ルーチンと DispatchInternalDeviceControl ルーチンでこれらの要求を処理します。 (ユーザー モード アプリケーションは IRP_MJ_INTERNAL_DEVICE_CONTROL 要求を送信できません。)

IOCTL には "パブリック" のものと、"プライベート" のものがあります。 パブリック IOCTL は一般的にシステムで定義され、Microsoft によって Windows Driver Kit (WDK) または Windows SDK で文書化されています。 これらの IOCTL は、ユーザー モード コンポーネントの DeviceIoControl への呼び出しによって送信されるか、IRP_MJ_DEVICE_CONTROL または IRP_MJ_INTERNAL_DEVICE_CONTROL 要求を使用して、あるカーネル モード ドライバーから別のカーネル モード ドライバーに送信されます。 パブリック IOCTL の例としては、SCSI ポート I/O 制御コードI8042prt マウス内部デバイス制御要求などがあります。

一方、プライベート IOCTL は、ベンダーのソフトウェア コンポーネントが互いに通信するためにのみ使用されることを意図しています。 プライベート IOCTL は、通常、ベンダーが提供するヘッダー ファイルで定義され、パブリックに文書化されていません。 パブリック IOCTL と同様に、これらの IOCTL は、ユーザー モード コンポーネントの DeviceIoControl への呼び出しによって送信されるか、IRP_MJ_DEVICE_CONTROL または IRP_MJ_INTERNAL_DEVICE_CONTROL 要求を使用して、あるカーネル モード ドライバーから別のカーネル モード ドライバーに送信されます。

パブリック IOCTL とプライベート IOCTL のコーディングには違いはありません。 ただし、ベンダー定義の IOCTL で使用できる内部コードには、システム定義 IOCTL に使用されるコードとの違いがあります。 使用可能なパブリック IOCTL がニーズに合わない場合は、ソフトウェア コンポーネントが相互に通信するために使用できる新しいプライベート IOCTL を定義できます。 詳細については「I/O 制御コードの定義」参照してください。