IoWMIWriteEvent イベントでのイベントの送信
ドライバーは、 IoWMIWriteEvent を呼び出して、任意のイベントを送信できます。 イベントは、1 つの項目、1 つのインスタンス、またはデータ ブロックのすべてのインスタンスで構成でき、動的インスタンス名を使用できます。
WMI によって割り当てられ、部分的に初期化されるクエリまたは変更要求で渡される WNODE_XXX 構造とは異なり、ドライバーはイベントを含む WNODE_XXX 構造のすべてのメンバーを割り当てて初期化する必要があります。
ドライバーは、WMI がイベントを有効にするために IRP_MN_ENABLE_EVENTS 要求を送信した後にのみ、イベントを送信しなければなりません。 その後、イベントのトリガー条件が発生すると、ドライバーは次の処理を行います:
イベントに必要な WNODE_XXX 構造(変数データの領域がある場合)を格納するために、非ページ プールからバッファリングを割り当てます。
イベントによっては、ドライバーはイベントのために WNODE_SINGLE_ITEM, a WNODE_SINGLE_INSTANCE または WNODE_ALL_DATA を割り当てる場合があります。 WNODE_XXX と変数データのサイズは、レジストリで定義された上限である1Kを超えてはなりません。
WnodeHeader.Flagsを含む WNODE_XXX 構造のすべてのメンバーを初期化します:
ドライバーは WNODE_FLAG_EVENT_ITEM フラグを設定し、構造がイベントであることを示します。
WNODE_XXX 構造のタイプを示すために、ドライバーは以下のフラグのいずれかを設定します。
WNODE_FLAG_ALL_DATA
WNODE_FLAG_SINGLE_INSTANCE
WNODE_FLAG_SINGLE_ITEM
ドライバーは、ブロックが静的インスタンス名を使用するか動的インスタンス名を使用するかを示すために、以下のフラグを設定またはクリアします。
WNODE_FLAG_STATIC_INSTANCE_NAMES
WNODE_FLAG_PDO_INSTANCE_NAMES
ドライバーはイベントに応じて追加のフラグを設定するかもしれません。
WNODE_XXX へのポインタを PWNODE_EVENT_ITEM にキャストします。
ポインターを使用して IoWMIWriteEvent を呼び出します。
IoWMIWriteEvent が正常に完了すると、WMIはイベント用にドライバーが割り当てたメモリを解放します。
IoWMIWriteEvent が戻った後、ドライバーはイベントのトリガー条件の監視を再開し、WMIが IRP_MN_DISABLE_EVENTS 要求を送信してそのイベントを無効にするまで、トリガー条件が発生するたびにイベントを送信します。
イベントのサイズがレジストリで定義された最大値 1K を超える場合 (推奨されません)、ドライバーは、イベントの GUID、サイズ、およびインスタンスインデックス (静的インスタンス名の場合) または名前 (動的インスタンス名の場合) を指定する WNODE_EVENT_REFERENCE を初期化して IoWmiWriteEvent を呼び出す必要があります。 WMI は、 WNODE_EVENT_REFERENCE 内の情報を使用してイベントのクエリを実行します。
ドライバーは、WMI ライブラリルーチン WmiFireEventを呼び出すことで、動的インスタンス名を使用せず、単一のインスタンスで構成されるイベントを送信できます。 ドライバーは、 WmiFireEvent 呼び出しのために WNODE_XXX 構造を割り当てて初期化する必要はありません。 WMI は、ドライバーのイベントデータを WNODE_SINGLE_INSTANCE にパッケージし、データコンシューマに配信します。 WmiFireEventでのイベント送信の詳細については、 Sending an Event with WmiFireEventでのイベント送信を参照してください。