WMI イベントの送信

ドライバーは、WMI イベントを使用して、アプリケーションにポーリングや IRP の送信を要求せずに、 ユーザモードのアプリケーションにイベントを通知できます。 ドライバーは、エラーロギングの代わりとしてではなく、例外的な状態を WMI クライアントに通知するために WMI イベントを使用する必要があります。 ドライバーは、Wmicore.mof でそのデバイスタイプ用に定義された標準イベントブロックをサポートすべきであり、デバイス固有の通知をサポートするために、追加のカスタムイベントブロックを定義して登録する場合があります。

イベント ブロックは、抽象基底クラス WMIEvent から派生した単なるデータブロックです。 イベントブロックは、データブロックと同じデータを含むことも、空であることもできます。つまり、イベントブロックはドライバー定義のデータ項目を含む必要はありません。 イベントブロックがデータを含む場合 WNODE_XXX とデータの合計サイズは、レジストリで定義された制限である1キロバイトを超えないようにする必要があります。 一般に、イベントが小さいほどシステムパフォーマンスが向上し、タイムリーな通知が行われます。 ブロックの定義については、 WMI データおよびイベント ブロックの MOF 構文 および WMI データおよびイベント ブロックの設計 を参照してください。

ドライバーは、ブロックの WMIREGGUID 構造に設定された WMIREG_FLAG_EVENT_ONLY_GUID で対応するイベントブロックを登録することによって、イベントのサポートを示します。 ブロックの登録については、 Registering as a WMI Data Providerを参照してください。

WMIクライアントユーザーがイベントの通知を要求すると、WMIは IRP_MN_ENABLE_EVENTS 要求をドライバに送信し、イベントのドライバー決定トリガ条件の監視を開始するようドライバーに警告します。 次に、トリガー条件が発生すると、ドライバーはイベントを WMI に送信し、WMI は、そのイベントを登録したすべてのデータコンシューマに配信します。

ドライバーは、以下のいずれかの方法で WMI にイベントを送信します:

  • カーネルモードのWMIライブラリルーチン WmiFireEvent を呼び出します。 ドライバーは、 WmiFireEvent を呼び出して、動的インスタンス名を使用せず、単一の基本名文字列またはPDOのデバイスインスタンスIDをベースとする静的インスタンス名を使用するイベントのみを送信できます。 さらに、イベントは 1 つのインスタンスである必要があります。つまり、ドライバーは WmiFireEvent を呼び出して、単一の項目または複数のインスタンスで構成されるイベントを送信することはできません。 詳細は、 Sending an Event with WmiFireEventを参照してください。

  • ドライバーが割り当てて初期化した WNODE_XXX 構造へのポインタを持つカーネルモードルーチン IoWMIWriteEvent を呼び出します。 詳細は、 Sending an Event with IoWMIWriteEventを参照してください。