IRP_MN_QUERY_ID

バス ドライバーは、子デバイス (子 PDO) の BusQueryDeviceID の要求を処理する必要があります。 バス ドライバーは、子デバイスの BusQueryHardwareIDBusQueryCompatibleIDBusQueryInstanceID の要求を処理することができます。

Windows 7 以降では、バス ドライバーは、子 PDO の BusQueryContainerID の要求も処理する必要があります。

これらの識別子 (ID) の詳細については、「デバイス識別文字列」を参照してください。

注: ファンクション ドライバーとフィルター ドライバーは、この IRP を処理しません。

0x13

主要なコード

IRP_MJ_PNP

送信時

PnP マネージャーは、デバイスが列挙されるときに、この IRP を送信します。 ドライバーは、デバイスの 1 つのインスタンス ID を取得するために、この IRP を送信する場合があります。

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

入力パラメーター

IO_STACK_LOCATION 構造体の Parameters.QueryId.IdType メンバーは、要求された ID の種類を指定します。 指定できる値は、BusQueryDeviceID、BusQueryHardwareID、BusQueryCompatibleID、BusQueryInstanceID、BusQueryContainerID です。 ID の種類、BusQueryDeviceSerialNumber が予約されています。

出力パラメーター

I/O 状態ブロックで返されます。

I/O 状態ブロック

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

成功した場合、ドライバーは Irp->IoStatus.Information を、要求されたリレーション情報を指す WCHAR ポインターに設定します。 エラーが発生すると、ドライバーは Irp->IoStatus.Information を 0 に設定します。

操作

ドライバーは、この IRP に応答して ID を返す場合、ID を格納するための WCHAR 構造体をページ プールから割り当てます。 不要になると、PnP マネージャーは構造体を解放します。

ドライバーは次の値のいずれかを返します。

  • BusQueryDeviceID、BusQueryInstanceID、または BusQueryContainerID 要求に応答する REG_SZ 文字列。

  • BusQueryHardwareID または BusQueryCompatibleID 要求に応答する REG_MULTI_SZ 文字列。

無効な文字を含む ID がドライバーから返された場合、システムはバグ チェックを実行します。 次の値を持つ文字は、この IRP の ID では無効です。

  • 0x20 (' ') 以下

  • 0x7F より大きい

  • 0x2C (',') と等しい

ドライバーは、ID の次の長さの制限に準拠する必要があります。

  • ドライバーがこの IRP で返す各ハードウェア ID または互換性のある ID の長さは、MAX_DEVICE_ID_LEN 文字未満にする必要があります。 現在、この定数の値は sdk\inc\cfgmgr32.h で定義されている 200 です。

  • ドライバーがこの IRP で返すコンテナー ID は、グローバル一意識別子 (GUID) として書式設定する必要があります。また、null 終端文字を含む MAX_GUID_STRING_LEN 文字にする必要があります。

  • バス ドライバーが子デバイス用にグローバルに一意のインスタンス ID を提供 (つまり、ドライバーがDEVICE_CAPABILITIES.UniqueID を設定) する場合、デバイス ID とインスタンス ID の組み合わせは (MAX_DEVICE_ID_LEN - 1) 文字未満にする必要があります。 オペレーティング システムでは、パス区切りに追加の文字が必要です。

  • バス ドライバーが子デバイスにグローバルに一意のインスタンス ID を提供しない場合、デバイス ID とインスタンス ID の組み合わせは (MAX_DEVICE_ID_LEN - 28) 未満である必要があります。 この式の値は現在 172 です。

バス ドライバーは、デバイスが列挙された直後に、子デバイスのこの IRP を処理するように準備する必要があります。

BusQueryDeviceID と BusQueryInstanceID の指定

バス ドライバーが BusQueryDeviceID と BusQueryInstanceID に提供する値を使用すると、オペレーティング システムはデバイスをコンピューター上の他のデバイスと区別することができます。 オペレーティング システムは、IRP_MN_QUERY_ID IRP で返されるデバイス ID とインスタンス ID、および IRP_MN_QUERY_CAPABILITIES IRP で返される一意の ID フィールドを使用して、デバイスのレジストリ情報を検索します。

BusQueryDeviceID の場合、バス ドライバーはデバイスのデバイス ID を提供します。 デバイス ID には、列挙子の名前と、製造元、デバイス、リビジョン、パッケージャー、パッケージ製品を識別する文字列を組み込んだ、デバイスの可能な限り最も具体的な説明が含まれている必要があります。 たとえば、PCI バス ドライバーは PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx 形式のデバイス ID で応答し、上記の 5 つの項目すべてをエンコードします。 ただし、デバイス ID には、2 つの同一のデバイスを区別するのに十分な情報が含まれないようにします。 この情報は、インスタンス ID でエンコードされている必要があります。

BusQueryInstanceID の場合、バス ドライバーは、デバイスの インスタンス ID を含む文字列を指定する必要があります。 セットアップ ドライバーとバス ドライバーでは、インスタンス ID と他の情報を使用して、コンピューター上の 2 つの同一デバイスを区別します。 インスタンス ID は、コンピューター全体で一意であるか、デバイスの親バス上で一意です。

インスタンス ID がバスでのみ一意である場合、バス ドライバーは BusQueryInstanceID の文字列を指定しますが、デバイスの IRP_MN_QUERY_CAPABILITIES 要求に応答して FALSEUniqueID 値も指定します。 UniqueIDFALSE の場合、PnP マネージャーは、デバイスの親に関する情報を追加することでインスタンス ID を拡張し、ID をコンピューター上で一意にします。 この場合、バス ドライバーは、デバイスのインスタンス ID をグローバルに一意にするための追加の手順を実行しません。適切な機能情報を返すだけで、オペレーティング システムがその処理を行います。

バス ドライバーは、シリアル番号など、各子デバイスのグローバルに一意の ID を指定できる場合、バス ドライバーは、BusQueryInstanceID の文字列を指定し、各デバイスの IRP_MN_QUERY_CAPABILITIES 要求に応答して TRUEUniqueID 値を指定します。

BusQueryHardwareID と BusQueryCompatibleID の指定

バス ドライバーが BusQueryHardwareID と BusQueryCompatibleID に指定する値を使用すると、セットアップでバスの子デバイスに適したドライバーを見つけることができます。

バス ドライバーは、デバイスを記述する ID の REG_MULTI_SZ リストを使用して、これらの各要求に応答します。 ID のリストの最大長 (リストを終了する 2 つの NULL 文字を含む) は、REGSTR_VAL_MAX_HCID_LEN です。

複数のハードウェア ID や複数の互換性のある ID を返す場合、バス ドライバーは、デバイスにとって最適なドライバーを選択しやすくするために、最も固有から最も一般的なものの順に ID を一覧表示する必要があります。 ハードウェア ID の一覧の最初のエントリは、デバイスに最も固有の記述であり、そのため、通常はデバイス ID と同じです。

セットアップでは、一致する可能性のある INF ファイルに記載されている ID に対して ID の照合を行います。 セットアップでは、最初にハードウェア ID の一覧をスキャンしてから、次に、互換性のある ID の一覧をスキャンします。 前のエントリは、デバイスのより具体的な記述として扱われ、後のエントリはデバイスに対してより一般的な (したがって最適ではない) 一致として扱われます。 ハードウェア ID の一覧に一致するものが見つからない場合は、互換性のある ID の一覧に進む前に、セットアップでユーザーは、インストール メディアの入力を求められる場合があります。

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

BusQueryContainerID の指定

Windows 7 以降では、バス ドライバーは、デバイスのコンテナー ID を含む BusQueryContainerID の文字列を指定する必要があります。 コンテナー ID を使用すると、オペレーティング システムは、1 つのリムーバブル物理デバイスから、すべての機能デバイスをグループ化することができます。 たとえば、リムーバブル多機能デバイスのすべての機能デバイスは、同じコンテナー ID を持っています。 複数のコンテナー内の複数のディスクにまたがる可能性があるが、どのコンテナーにも属していないボリューム デバイスなど、特殊なケースでのコンテナー ID のレポートの詳細については、「コンテナー ID の概要」を参照してください。

リムーバブル物理デバイスは、バス ドライバーが IRP_MN_QUERY_CAPABILITIES 要求に応答して TRUEリムーバブル機能を指定する、子デバイスとして定義されます。 リムーバブル値の詳細については、「DEVICE_CAPABILITIES」を参照してください。

バス ドライバーは、デバイスが提供するバス固有の一意の ID に基づいてコンテナー ID を作成します。 詳細については、「コンテナー ID の生成方法」を参照してください。

ドライバーは、IRP 要求に失敗し、次のいずれかが true の場合は、IoStatus.Status を STATUS_NOT_SUPPORTED に設定する必要があります。

  • デバイスは、バス ドライバーがコンテナー ID の生成に使用できるバス固有の一意の ID をサポートしていません。

  • バス ドライバーは、デバイスの IRP_MN_QUERY_CAPABILITIES 要求に応じて、FALSEリムーバブル機能を以前に指定しました。

この IRP の送信

通常、PnP マネージャーのみがこの IRP を送信します。

デバイスのハードウェア ID または互換性のある ID を取得するには、この IRP を送信する代わりに IoGetDeviceProperty を呼び出します。

ドライバーは、デバイスの 1 つのインスタンス ID を取得するために、この IRP を送信する場合があります。 たとえば、機能が独立して動作しない多機能 PnP ISA デバイスを考えてみましょう。 PnP マネージャーは、個別のデバイスとして関数を列挙しますが、このようなデバイスのドライバーは、1 つ以上の関数を関連付けるために必要な場合があります。 PnP ISA は一意のインスタンス ID を保証するため、このような多機能デバイスのドライバーは、インスタンス ID を使用して、同じデバイス上に存在する関数を検索することができます。 このようなデバイスのドライバーは、デバイスが PnP ISA デバイスであることを確認するために、IoGetDeviceProperty を呼び出すことによって、デバイスの列挙子名も取得する必要があります。

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

  • IRP の次の I/O スタックの場所に値を設定します。MajorFunctionIRP_MJ_PNP に設定し、MinorFunction を IRP_MN_QUERY_ID に設定し、Parameters.QueryId.IdTypeBusQueryInstanceID に設定します。

  • IoStatus.Status を STATUS_NOT_SUPPORTED に設定します。

ドライバーは、クエリ ID IRP の送信に加えて、IoGetDeviceProperty を呼び出してデバイスの DevicePropertyEnumeratorName を取得する必要があります。

IRP が完了し、ドライバーでの ID の処理が終了したら、ドライバーは、クエリ IRP を処理したドライバーから返された ID 構造体を解放する必要があります。

要件

ヘッダー

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

関連項目

デバイスの識別用文字列

IoGetDeviceProperty