デバイス オブジェクトの概要

オペレーティング システムは、デバイス オブジェクトごとにデバイスを表します。 1 つ以上のデバイス オブジェクトが各デバイスに関連付けられています。 デバイス オブジェクトは、デバイス上のすべての操作のターゲットとして機能します。

カーネル モード ドライバーは、以下の例外を除き、デバイスごとに少なくとも 1 つのデバイス オブジェクトを作成する必要があります。

  • クラスまたはポート ドライバーが関連付けられているミニドライバーは、独自のデバイス オブジェクトを作成する必要はありません。 クラスまたはポート ドライバーは、デバイス オブジェクトを作成し、ミニドライバーに操作をディスパッチします。

  • NDIS ミニポート ドライバーなど、デバイスの種類固有のサブシステムの一部であるドライバーには、サブシステムによって作成されたデバイス オブジェクトがあります。

ドライバーが独自のデバイス オブジェクトを作成するかどうかを判断するには、特定のデバイスの種類のドキュメントをご覧ください。

一部のデバイス オブジェクトは、物理デバイスを表していません。 I/O 要求を処理するが、それらの要求をハードウェアに渡さないソフトウェア専用ドライバーでは、操作のターゲットを表すデバイス オブジェクトを作成する必要があります。

ドライバーでデバイス オブジェクトを作成する方法について詳しくは、「デバイス オブジェクトの作成」をご覧ください。

通常デバイスは、デバイスの I/O 要求を処理するドライバー スタック内のドライバーごとに 1 つずつ、複数のデバイス オブジェクトによって表されます。 デバイスのデバイス オブジェクトは、デバイス スタックにまとめられます。 デバイスで操作が実行されるたびに、システムは、デバイス スタック内の最上位のデバイス オブジェクトのドライバーに IRP データ構造を渡します。 各ドライバーは、IRP を処理するか、デバイス スタック内の次の下位のデバイス オブジェクトに関連付けられているドライバーに渡します。 デバイス スタックについて詳しくは、「WDM デバイス スタックの例」をご覧ください。 IRP の詳細については、「IRP の処理」を参照してください。

デバイス オブジェクトは、オブジェクト マネージャーによって管理される DEVICE_OBJECT 構造によって表されます。 オブジェクト マネージャーは、他のシステム オブジェクトに対して行うのと同じ機能をデバイス オブジェクトに提供します。 特に、デバイス オブジェクトに名前を付け、名前付きデバイス オブジェクトでハンドルを開くことができます。 名前付きデバイス オブジェクトについて詳しくは、「名前付きデバイス オブジェクト」をご覧ください。

システムは、ドライバーがデバイス固有のストレージに使用できるデバイス拡張機能と呼ばれる、デバイス オブジェクトごとに専用のストレージを提供します。 デバイス拡張機能は、デバイス オブジェクトと共にシステムによって作成および解放されます。 詳細については、「デバイス拡張」を参照してください。

次の図は、デバイス オブジェクトと I/O マネージャーの関係を示しています。

diagram illustrating a device object.

この図は、ドライバー ライターが関心を持つ DEVICE_OBJECT 構造のメンバーを示しています。 これらのメンバーについて詳しくは、「デバイス オブジェクトの作成」、「デバイス オブジェクトの初期化」、「デバイス オブジェクトのプロパティ」をご覧ください。