次の方法で共有


DispatchDeviceControl 関数ルーチンと DispatchInternalDeviceControl 関数ルーチン

ドライバーのディスパッチ ルーチン ( DRIVER_DISPATCHを参照) は、それぞれ 、IRP_MJ_DEVICE_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROLの I/O 関数コードを使用して IRP を処理します。

すべての共通タイプの周辺機器について、システムは IRP_MJ_DEVICE_CONTROL要求の I/O 制御コードのセットを定義します。 各種類のデバイスの新しいドライバーは、これらの要求をサポートする必要があります。 ほとんどの場合、デバイスの種類ごとにこれらのパブリック I/O 制御コードは、ユーザー モード アプリケーションにエクスポートされません。

これらのシステム定義の I/O 制御コードの一部は、 IoBuildDeviceIoControlRequest を呼び出すことによって、基になるデバイス ドライバーの IRP を作成する上位レベルのドライバーによって使用されます。 他のコンポーネントは、Win32 関数 DeviceIoControl (Microsoft Windows SDK ドキュメントで説明) を呼び出すことによって、基になるデバイス ドライバーと通信するために Win32 コンポーネントによって使用されます。この関数は、システム サービスを呼び出します。 I/O マネージャーは IRP を設定し、主要な関数コード IRP_MJ_DEVICE_CONTROLと指定された I/O コントロール コードを Parameters.DeviceIoControl.IoControlCodeIO_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 制御コードは Microsoft Corporation の協力を得た場合にのみシステムに追加できます。

さまざまな種類のドライバーがサポートする必要があるパブリック I/O コントロール コードのセットと、プライベート I/O コントロール コードの定義に関する詳細については、Windows Driver Kit (WDK) のデバイス固有のリファレンス セクションを参照してください。