DispatchDeviceControl および DispatchInternalDeviceControl ルーチン
ドライバーのディスパッチ ルーチン (DRIVER_DISPATCH を参照) は、IRP_MJ_DEVICE_CONTROL と IRP_MJ_INTERNAL_DEVICE_CONTROL の I/O 関数コードをそれぞれ使用して IRP を処理します。
IRP_MJ_DEVICE_CONTROL 要求の I/O 制御コード セットは、すべての一般的な種類の周辺機器について、システムで定義されています。 各種類のデバイスの新しいドライバーは、これらの要求をサポートする必要があります。 ほとんどの場合、デバイスの種類ごとにこれらのパブリック I/O 制御コードは、ユーザー モード アプリケーションにはエクスポートされません。
これらのシステム定義の I/O 制御コードの一部は、上位ドライバーが基になるデバイス ドライバー用の IRP を作成するために、IoBuildDeviceIoControlRequest を呼び出して使用されます。 その他システム定義の I/O 制御コードには、Win32 関数が基になるデバイス ドライバーと通信するために、DeviceIoControl (Microsoft Windows SDK ドキュメントを参照) を呼び出して使用されるものもあります。この関数は、システム サービスを呼び出します。 I/O マネージャーは IRP を設定し、主要な関数コード IRP_MJ_DEVICE_CONTROL と指定された I/O 制御コードを Parameters.DeviceIoControl.IoControlCode の IO_STACK_LOCATION 構造体に格納します。 次に、I/O マネージャーは、チェーン内の最上位ドライバーの DispatchDeviceControl ルーチンを呼び出します。
新しいドライバーと相互運用し、サポートするように設計された特定のシステム提供ドライバーについては、オペレーティング システムが IRP_MJ_INTERNAL_DEVICE_CONTROL 要求の I/O 制御コードのセットも定義しています。 ほとんどの場合、これらのパブリック I/O 制御コードを使用することで、アドオンの上位ドライバーを基になるデバイス ドライバーと相互運用できます。
たとえば、システム提供の並列ドライバーは、ベンダーが提供するドライバーが IRP_MJ_INTERNAL_DEVICE_CONTROL 要求で送信する内部 I/O 制御コードのセットをサポートします。 詳細については、「並列ポートの内部デバイス制御要求」および「並列デバイスの内部デバイス制御要求」を参照してください。
システム定義の I/O 制御コードを介して要求されるほぼすべての操作では、バッファー I/O が使用されます。この種類の要求では大量のデータの転送が必要な場合はほとんどありません。 つまり、ダイレクト I/O 用にデバイス オブジェクトを設定したドライバーであっても、Irp->AssociatedIrp.SystemBuffer でバッファーとの間で送受信されるデータを含むデバイス制御要求の IRP が送信されます (Win32 マルチメディア ドライバーを密接に結合した、特定の種類の最上位デバイス ドライバーを除く)。
さらに、ドライバーは、他のドライバーとの通信に使用できるプライベート I/O 制御コードのセットを定義できます。 パブリック I/O 制御コードはオペレーティング システム自体に組み込まれているため、新しいパブリック I/O 制御コードはマイクロソフトの協力がある場合のみシステムに追加できます。
さまざまな種類のドライバーがサポートする必要があるパブリック I/O 制御コードのセットと、プライベート I/O 制御コードの定義の詳細については、Windows Driver Kit (WDK) のデバイス固有のリファレンス セクションを参照してください。