IRP_MN_QUERY_CAPABILITIES
PnP マネージャーは、デバイスをロックできるかや、取り出すことができるかどうかなど、デバイスの機能を取得するために、この IRP を送信します。
ファンクション ドライバーとフィルター ドライバーは、バス ドライバーでサポートされている機能を変更した場合に、この要求を処理できます。 バス ドライバーは、子デバイスに対してこの要求を処理する必要があります。
値
0x09
主要なコード
送信時
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 Version 値を確認する必要があります。 その値がドライバーがサポートするバージョンでない場合、ドライバーは IRP に失敗する必要があります。 バージョンがサポートされている場合、ドライバーは [サイズ] フィールドをチェックする必要があります。 ドライバーは、入力として受信した機能構造の境界内にあるフィールドのみを設定する必要があります。
この IRP を処理するドライバーは、いくつかの DEVICE_CAPABILITIES フィールドを設定できますが、[サイズ] と [バージョン] のフィールドを設定してはなりません。 これらのフィールドは、IRP を送信したコンポーネントによってのみ設定されます。
プラグ アンド プレイのマイナー IRP の処理に関する一般的な規則については、「プラグ アンド プレイ」を参照してください。
この IRP の送信
バス ドライバーは、その子デバイスのいずれかの IRP_MN_QUERY_CAPABILITIES 要求を処理するときに、親デバイス スタックにこの IRP を送信します。 また、ドライバーは、デバイスのいずれかのデバイス機能を取得するために、この IRP を送信することもできます。 スタック内の 1 つのドライバーには、デバイスの機能情報の一部のみが含まれます。デバイス スタックに IRP を送信することで、フィルター ドライバーによる変更などを含む、全体像を収集することができます。
IRP の送信の詳細については、「IRP の処理」を参照してください。 次の手順は、特にこの IRP に適用されます。
ページ プールから DEVICE_CAPABILITIES 構造体を割り当て、これを、RtlZeroMemory を呼び出すことで 0 に初期化します。 Size を sizeof(DEVICE_CAPABILITIES) に、Version を 1 に、Address および UINumber を -1 に初期化します。
IRP の次の I/O スタックの位置の値を設定します。MajorFunction を IRP_MJ_PNP に、MinorFunction を IRP_MN_QUERY_CAPABILITIES に、Parameters.DeviceCapabilities を割り当てられた DEVICE_CAPABILITIES 構造体へのポインターに設定します。
IoStatus.Status を STATUS_NOT_SUPPORTED に初期化します。
IRP と DEVICE_CAPABILITIES 構造体が不要になったら、これらの割り当てを解除します。
要件
ヘッダー |
Wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |