次の方法で共有


WMI インスタンス名の定義

WMI ブロックのインスタンスには、特定の物理デバイスまたはソフトウェア コンポーネントによって提供されるデータが含まれています。 ブロックの GUID がブロックを一意に識別するのと同様に、インスタンスの名前はブロックのそのインスタンスを一意に識別します。 WMI クライアント アプリケーションでは、インスタンス名を使用して、データ ブロックで返された情報を、データを提供したデバイスまたはコンポーネントに関連付けます。 WMI では、インスタンス名を使用して、要求の送信先となるデバイスを決定します。 ドライバーは、インスタンス名を定義するときに PDO を使用することを強くお勧めします。

ドライバーは、次の 2 つの方法のいずれかでブロックのインスタンス名を定義できます。

  • ドライバーは、ブロックを登録するときに WMI に静的インスタンス名の一覧を渡します。

    ブロックが登録された後、ドライバーと WMI の両方で、この一覧のインデックスでインスタンス名を指定します。 静的インスタンス名は、ドライバーの PDO のデバイス インスタンス ID、またはドライバー定義のベース名に基づいた名前を付けることができます。または、ドライバーはインスタンス名文字列の一覧を定義できます。 静的インスタンス名は、ドライバーがブロックを再登録して明示的に変更するまで保持されます。

  • ドライバーは、インスタンスが 作成されると動的なインスタンス名 を生成します。

    ドライバーは、ブロックの登録時に、ブロックの動的なインスタンス名を生成することを示します。 ブロックが登録されると、ドライバーと WMI の両方で動的インスタンス名が Parameters.WMI.Buffer のバッファー 内の文字列として渡されます。

ドライバーが動的なインスタンス名を生成するのは、実行時にデータ ブロックのインスタンスまたはインスタンス名の数が頻繁に変化する場合に限る必要があります。 たとえば、ドライバーでは、プロセス ID または TCP/IP 接続の IP アドレスをインスタンス名として使用できます。 このようなインスタンス名は動的である必要があります。静的なインスタンス名を使用した場合、変更が発生するたびにドライバーが IoWMIRegistrationControl を呼び出してインスタンスの数と名前を更新する必要があるため、かなりのオーバーヘッドが発生します。

ほとんどの場合、静的インスタンス名は、次の理由から動的インスタンス名よりも優れています。

  • 静的インスタンス名は、動的インスタンス名と異なり、ドライバーが WMI 要求に対してインスタンス名の文字列を返す必要がないため、ドライバーのパフォーマンスが向上します。

  • WMI は登録時に静的インスタンス名の競合を検出し、必要に応じてインスタンス名を自動的に変更できるため、ブロックを登録するドライバーの数に関係なく、すべてのインスタンス名が特定のブロックに対して一意になります。

    WMI は動的インスタンス名のインスタンス名の競合を検出できないため、ドライバーは IoWMIAllocateInstanceIds を使用して一意の名前を生成する必要があります。

  • ドライバーは、名前がドライバーの PDO またはドライバー定義の基本名に基づいている限り、WMI ライブラリ ルーチンを使用して、静的インスタンス名を使用するブロックの IRP を処理できます。

    動的インスタンス名を使用するデータ ブロックについては、ドライバーが IRP の処理に WMI ライブラリ ルーチンを使用することはできません。

ドライバーは、ブロックの登録時に WMIREGGUID または WMIGUIDREGINFO 構造体で WMIREG_FLAG_XXX を設定またはクリアすることによって、ブロックが静的または動的なインスタンス名と静的インスタンス名の種類を使用するかどうかを示します。 詳細については、「WMI データ プロバイダーとしての登録」を参照してください。