WDM デバイス オブジェクトが作成される場合

このセクションでは、各種類のデバイス オブジェクトと、それぞれの作成時のメンションについて説明します。

次の図は、デバイス スタックに接続できるデバイス オブジェクトの種類を示しています。これは、デバイスの I/O 要求を処理するドライバーを表しています。

diagram illustrating possible device object layers for a device.

この図の下部からスタートします。

  • バス ドライバーは、そのバスで列挙する各デバイスの PDO を作成します。

    バス ドライバーは、デバイスを列挙するときに、子デバイスの PDO を作成します。 バス ドライバーは、PnP マネージャーからの IRP_MN_QUERY_DEVICE_RELATIONS 要求 ( BusRelationsに対し) に応答してデバイスを列挙します。 バス ドライバーは、バス ドライバーが最後に BusRelations のクエリ関係要求に応答した後にデバイスがバスに追加された場合 (または、マシンの起動後の最初のクエリ関係要求である場合) に、子デバイスの PDO を作成します。

    PDO は、デバイスをバス ドライバーだけでなく、電源マネージャー、PnP マネージャー、I/O マネージャーなどの他のカーネル モード システム コンポーネントに対してもデバイスを表します。

    デバイスの他のドライバーは PDO の上にデバイス オブジェクトをアタッチしますが、PDO は常にデバイス スタックの一番下にあります。

  • オプションのバス フィルター ドライバーは、フィルター処理するデバイスごとにフィルター DO を作成します。

    PnP マネージャーは、BusRelations の一覧で新しいデバイスを 検出すると、デバイスのバス フィルター ドライバーがあるかどうかを判断します。 その場合、PnP マネージャーは、このような各ドライバーに対して、それが読み込まれたことを確認し (必要に応じて DriverEntry を呼び出します)、ドライバーの AddDevice ルーチンを呼び出します。 バス フィルター ドライバーがこのデバイスの操作をフィルター処理する場合、フィルター ドライバーはデバイス オブジェクトを作成し、その AddDevice ルーチンでデバイス スタックにアタッチします。 複数のバス フィルター ドライバーが存在し、このデバイスに関連する場合、このような各フィルター ドライバーは、独自のデバイス オブジェクトを作成してアタッチします。

  • オプションの下位レベルのフィルター ドライバーは、フィルター処理するデバイスごとにフィルター DO を作成します。

    このデバイスに対してオプションの下位レベルのフィルター ドライバーが存在する場合、PnP マネージャーは、バス ドライバーとバス フィルター ドライバーの後にこのようなドライバーが読み込まれるようにします。 PnP マネージャーは、フィルター ドライバーの AddDevice ルーチンを呼び出します。 AddDevice ルーチンでは、下位レベルのフィルター ドライバーは、デバイスのフィルター DO を作成し、デバイス スタックにアタッチします。 複数の下位レベルのフィルター ドライバーが存在する場合、このようなドライバーはそれぞれ独自のフィルター DO を作成してアタッチします。

  • ファンクション ドライバーは、デバイスの FDO を作成します。

    PnP マネージャーは、デバイスのファンクション ドライバーが読み込まれ、ファンクション ドライバーの AddDevice ルーチンを呼び出します。 ファンクション ドライバーは、FDO を作成し、デバイス スタックにアタッチします。

  • オプションの上位レベルのフィルター ドライバーは、フィルター処理するデバイスごとにフィルター DO を作成します。

    デバイスに対してオプションの上位レベルのフィルター ドライバーが存在する場合、PnP マネージャーは、ファンクションドライバーの後に読み込まれ、その AddDevice ルーチンを呼び出します。 このようなフィルター ドライバーはそれぞれ、そのデバイス オブジェクトをデバイス スタックにアタッチします。

要約すると、デバイス スタックには、特定のデバイスへの I/O の処理に関係する各ドライバーのデバイス オブジェクトが含まれています。 親バス ドライバーには PDO があり、ファンクションドライバーには FDO があり、オプションの各フィルター ドライバーにはフィルター DO があります。

すべてのデバイス、バス アダプター/コントローラー デバイス、および非バス デバイスには、デバイス スタックに PDO と FDO があることに注意してください。 バス アダプター/コントローラーの PDO は、親バスのバス ドライバーによって作成されます。 たとえば、SCSI アダプターが PCI バスに接続する場合、PCI バス ドライバーは、SCSI アダプターの PDO を作成します。

デバイスが未加工モードで使用されている場合、ファンクション ドライバーまたはフィルター ドライバーはありません (FDO またはフィルター DO はありません)。 親バス ドライバー用の PDO と、0 個以上のバス フィルター DO だけがあります。

デバイス オブジェクトの作成とアタッチを担当するドライバー ルーチンについては、「 デバイス オブジェクトの作成 」を参照してください。

デバイス スタックといくつかの追加情報は、デバイスの devnode を構成します。 PnP マネージャーメインデバイスの開発ノードに、デバイスが起動されているかどうか、どのドライバー (ある場合) がデバイス上の変更を通知するために登録したかなどの情報が含まれます。 カーネル デバッガー コマンド !devnode は、devnode に関する情報を表示します。