次の方法で共有


ブロックを登録するための IRP_MN_REGINFO と IRP_MN_REGINFO_EX の処理

Windows 98 および Windows 2000 では、ドライバーが WMI クラスを登録できるよう、IRP_MN_REGINFO 要求がドライバーに送信されます。 Windows XP 以降では、システムが代わりに IRP_MN_REGINFO_EX 要求を送信します。 ほとんどのドライバーは、WmiSystemControl を使用してコールバック ルーチンを提供することにより、これらの要求を処理できます。 詳しくは、「WMI ライブラリを使用したブロックの登録」をご覧ください。

ドライバーは、IRP_MN_REGINFO または IRP_MN_REGINFO_EX 要求を処理し、動的インスタンス名を使用するブロック、またはドライバー定義の静的インスタンス名のリストを使用するブロックを登録する必要があります。WmiSystemControl を呼び出して、このようなブロックを登録することはできません。 ドライバーは必要に応じてこの要求を処理し、PDO またはドライバー定義の基本名文字列に基づいて静的インスタンス名を使用するブロックを登録できます。

この場合、ドライバーは次の操作を行います。

  1. 以下を指定する Parameters.WMI.BufferWMIREGINFO 構造を入力します。

    • 別のドライバーに代わって提供されたデータを含む、ドライバーによって提供されるすべての登録データのバイト数。

    • ドライバーのレジストリ パス。

    • ドライバーの MOF リソースの名前。

    • 登録するブロックの数。

    • WMIREGGUID 構造の配列 (ブロックごとに 1 つ)。

  2. ブロックごとに、ドライバーは以下を指定する WMIREGGUID 構造を格納します。

    • ブロックを表す GUID。

    • インスタンス名とブロックの他の特性に関する情報 (ブロックの収集コストが高いかどうかなど) を提供するフラグ。 詳細については、「WMI 登録フラグ」を参照してください。

    ブロックが静的インスタンス名に登録されている場合、ドライバーは、ブロックの静的インスタンス名データを指定するため、次のいずれかのメンバーを設定します。

    • ドライバーが、WMIREG_FLAG_INSTANCE_LIST で Flags を設定する場合、静的インスタンス名の文字列のリストへのオフセットに InstanceNameList を設定します。 WMI は、後続の要求のインスタンスをこの一覧へのインデックスによって指定します。

    • ドライバーが、WMIREG_FLAG_INSTANCE_BASENAME で Flags を設定している場合は、ベース名の文字列へのオフセットに BaseNameOffset を設定します。 WMI はこの文字列を使用して、ブロックの静的インスタンス名を生成します。

    • ドライバーは、WMIREG_FLAG_INSTANCE_PDO を使用して Flags を設定する場合、ドライバーの AddDevice ルーチンに渡される PDO に Pdo を設定します。 WMI は PDO のデバイス インスタンス パスを使用して、ブロックの静的インスタンス名を生成します。 IRP_MN_REGINFO_EX 要求を処理する場合、ドライバーは Pdo で渡された物理デバイス オブジェクトで ObReferenceObject ルーチンを呼び出す必要があります。 (システムは、自動的に ObDereferenceObject を呼び出してオブジェクトを逆参照します。ドライバーがこれを行ってはいけません)。

    ドライバーは、インスタンス名の文字列またはベース名の文字列を、InstanceNameList または BaseName で示されるオフセットにそれぞれ書き込みます。

  3. ドライバーが別のドライバーの代わりに (おそらく、ミニクラス ドライバーの代わりにクラス ドライバーとして) ブロックを登録している場合、ドライバーは別の WMIREGINFO 構造と WMIREGGUID 構造のリストに他のドライバーのブロックの登録情報を入力し、最初の WMIREGINFONextWmiRegInfo を最初の WMIREGINFO の先頭から 2 番目の WMIREGINFO 構造の先頭までのオフセット (バイト単位) に設定します。