IRP_MN_QUERY_CAPABILITIES

PnP マネージャーは、デバイスをロックできるかや、取り出すことができるかどうかなど、デバイスの機能を取得するために、この IRP を送信します。

ファンクション ドライバーとフィルター ドライバーは、バス ドライバーでサポートされている機能を変更した場合に、この要求を処理できます。 バス ドライバーは、子デバイスに対してこの要求を処理する必要があります。

0x09

主要なコード

IRP_MJ_PNP

送信時

PnP マネージャーは、デバイスが列挙された直後に、デバイスのバス ドライバーにこの IRP を送信します。 PnP マネージャーは、デバイスのすべてのドライバーがデバイスを起動した後に、この IRP をもう一度送信します。 ドライバーは、デバイスの機能を取得するために、この IRP を送信できます。

PnP マネージャーとドライバーは、任意のスレッド コンテキストの中で、IRQL PASSIVE_LEVEL でこの IRP を送信します。

入力パラメーター

IO_STACK_LOCATION 構造体の Parameters.DeviceCapabilities.Capabilities メンバーは、デバイスの機能に関する情報を含む DEVICE_CAPABILITIES 構造体を指します。

出力パラメーター

Parameters.DeviceCapabilities.Capabilities は、IRP を処理するドライバーによって行われた変更を反映する DEVICE_CAPABILITIES 構造体を指します。

I/O 状態ブロック

ドライバーは、Irp->IoStatus.Status を STATUS_SUCCESS に設定するか、STATUS_UNSUCCESSFUL などの適切なエラー状態に設定します。

ファンクションまたはフィルター ドライバーは、この IRP を処理しない場合、IoSkipCurrentIrpStackLocation を呼び出し、IRP を次のドライバーに渡します。 このようなドライバーは Irp->IoStatus.Status を変更することも、IRP を完了することもしてはなりません。

バス ドライバーが、Irp->IoStatus.Status を設定し、IRP を完了します。

操作

デバイスが列挙されたら、そのファンクション ドライバーやフィルター ドライバーがデバイスに読み込まれる前に、PnP マネージャーは、デバイスの親バス ドライバーに IRP_MN_QUERY_CAPABILITIES 要求を送信します。 バス ドライバーは、DEVICE_CAPABILITIES 構造体に関連する値を設定し、PnP マネージャーに返す必要があります。

デバイス スタックが構築され、ドライバーがデバイスを起動した後、PnP マネージャーは、最初にデバイス スタックの最上位にあるドライバーによって処理され、次にスタック内の各下位ドライバーによって処理されるように、この IRP を再度送信します。 ファンクション ドライバーとフィルター ドライバーは、IoCompletion ルーチンを設定し、デバイス スタックを上へと戻る途中でこの IRP を処理することができます。

ドライバーは、次の下位ドライバーに IRP を渡す前に機能を追加する必要があります。

ドライバーは、下位のすべてのドライバーが IRP で終了した後、機能を削除する必要があります。 通常、ドライバーは他のドライバーによって設定されている機能を削除しませんが、特定の構成のデバイスの機能に関する特別な情報がある場合は、その機能が削除される場合があります。 下位ドライバーが完了するまで IRP の処理を延期する方法については、「プラグ アンド プレイ」を参照してください。

デバイスが列挙され、そのドライバーが読み込まれた後は、その機能が変更されないようにする必要があります。 デバイスが削除されて再列挙されると、デバイスの機能が変更される可能性があります。

IRP_MN_QUERY_CAPABILITIES IRP を処理する場合、デバイスの電源ポリシー マネージャーであるドライバーは、IoCompletion ルーチンを設定し、IRP がデバイス スタックを上へと戻る途中で、S-to-D 電源状態マッピングなどのデバイスの電源機能をコピーする必要があります。 子デバイスの電源機能を特定するために、親バス ドライバーは別のクエリ機能 IRP を作成し、その親ドライバーに IRP を送信します。 詳細については、「デバイスの電源機能のレポート」を参照してください。

ドライバーがこの IRP を処理する場合は、DEVICE_CAPABILITIESバージョンの値をチェックする必要があります。 その値がドライバーがサポートするバージョンでない場合、ドライバーは IRP に失敗する必要があります。 バージョンがサポートされている場合、ドライバーは [サイズ] フィールドをチェックする必要があります。 ドライバーは、入力として受信した機能構造の境界内にあるフィールドのみを設定する必要があります。

この IRP を処理するドライバーは、いくつかの DEVICE_CAPABILITIES フィールドを設定できますが、[サイズ][バージョン] のフィールドを設定してはなりません。 これらのフィールドは、IRP を送信したコンポーネントによってのみ設定されます。

プラグ アンド プレイのマイナー IRP の処理に関する一般的な規則については、「プラグ アンド プレイ」を参照してください。

この IRP の送信

バス ドライバーは、その子デバイスのいずれかの IRP_MN_QUERY_CAPABILITIES 要求を処理するときに、親デバイス スタックにこの IRP を送信します。 また、ドライバーは、デバイスのいずれかのデバイス機能を取得するために、この IRP を送信することもできます。 スタック内の 1 つのドライバーには、デバイスの機能情報の一部のみが含まれます。デバイス スタックに IRP を送信することで、フィルター ドライバーによる変更などを含む、全体像を収集することができます。

IRP の送信の詳細については、「IRP の処理」を参照してください。 次の手順は、特にこの IRP に適用されます。

  • ページ プールから DEVICE_CAPABILITIES 構造体を割り当て、これを、RtlZeroMemory を呼び出すことで 0 に初期化します。 Sizesizeof(DEVICE_CAPABILITIES) に、Version を 1 に、Address および UINumber を -1 に初期化します。

  • IRP の次の I/O スタックの位置の値を設定します。MajorFunctionIRP_MJ_PNP に、MinorFunctionIRP_MN_QUERY_CAPABILITIES に、Parameters.DeviceCapabilities を割り当てられた DEVICE_CAPABILITIES 構造体へのポインターに設定します。

  • IoStatus.Status を STATUS_NOT_SUPPORTED に初期化します。

  • IRP と DEVICE_CAPABILITIES 構造体が不要になったら、これらの割り当てを解除します。

要件

ヘッダー

Wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)

関連項目

DEVICE_CAPABILITIES