WMI イベント トレース

このセクションでは、情報プロバイダーとしてカーネル モード ドライバーが情報コンシューマーに情報を提供するために使用できる WDM (Windows 2000 以降でサポート) への WMI 拡張機能について説明します。 通常、ドライバーは、コンシューマーがドライバーの構成とリソースの使用状況を判断するために使用する情報を提供します。 ユーザー モード API は、WDM への WMI 拡張機能に加えて、WMI イベント情報のプロバイダーまたはコンシューマーをサポートしています。詳細については、「Windows SDK」を参照してください。

イベント トレース ロガーは、最大 32 個のインスタンスをサポートします。 インスタンスの 1 つは、カーネルをトレースするために予約されています。 ロガーは、高いイベント レートのトレースをサポートします。

トレース イベントは、他の WMI イベントと同じ方法で定義されます。 WMI イベントは MOF ファイルで説明されています。 WMI イベントの説明の詳細については、「 WMI データおよびイベント ブロックの MOF 構文」を参照してください。

カーネル モード ドライバーのログ情報が既存の WMI インフラストラクチャに統合されるプロセス。 トレース イベントをログに記録するために、ドライバーは次の処理を行います。

  1. IoWMIRegistrationControlを呼び出して WMI プロバイダーとして登録します。

  2. ドライバーが WMI にイベントを登録するときに渡される WMIREGGUID 構造体の Flags メンバーに WMIREGGUID を設定して、イベントをトレース可能としてマークします。

  3. ドライバーが WMI にイベントを登録するときに渡される Flags メンバー ( WMIREGGUI 構造体 )にWMIREG_FLAG_TRACE_CONTROL_GUIDを設定することで、トレース イベントのセットをまとめて有効または無効にする制御 イベントとして 1 つのイベントを指定します。

  4. GUID がトレース 制御 GUID と一致するイベントを有効にする要求を WMI から受信すると、ドライバーはロガーにハンドルを格納する必要があります。 この値は、イベントを記述するときに必要になります。 このハンドルの使用方法については、「手順 6」を参照してください。 ロガー ハンドル値は、イベント有効化要求のパラメーターの一部である WMI バッファーの HistoricalContext メンバー ( WNODE_HEADER 部分 ) に含まれます。

  5. トレース イベントを WMI イベント コンシューマーに送信するか、WMI イベント ロガーのみを対象とするかを決定します。 これにより、 EVENT_TRACE_HEADER 構造体のメモリの取得場所が決まります。 このメモリは最終的に IoWMIWriteEventに渡されます。

    イベントがログ イベントのみの場合、メモリは WMI によって削除されません。 この場合、ドライバーはスタック上のバッファーを渡すか、この目的のために割り当てられたバッファーを再利用する必要があります。 パフォーマンス上の理由から、ドライバーはメモリを割り当てたり解放したりする不要な呼び出しを最小限に抑える必要があります。 この推奨事項に準拠しないと、ログ ファイルに含まれるタイミング情報の整合性が損なわれます。

    イベントをロガーと WMI イベント コンシューマーの両方に送信する場合は、メモリを非ページ プールから割り当てる必要があります。 この場合、イベントはロガーに送信され、WMI に転送され、イベントの通知を要求した WMI イベント コンシューマーに送信されます。 その後、イベントのメモリは、 IoWMIWriteEvent の動作に従って WMI によって解放されます。

  6. EVENT_TRACE_HEADER のメモリとドライバー イベント データがある場合は、セキュリティで保護された後、次の情報を設定する必要があります。

    Size メンバーに sizeof(EVENT_TRACE_HEADER) と、 EVENT_TRACE_HEADERの末尾に追加される追加のドライバー イベント データのサイズを設定します。

    Flags メンバーを WNODE_FLAG_TRACED_GUID に設定して、イベントをロガーに送信します。 イベントを WMI イベント コンシューマーにも送信する場合は、WNODE_FLAG_LOG_WNODEを設定します。 WNODE_FLAG_LOG_WNODE設定する場合は、WNODE_FLAG_TRACED_GUIDを設定する必要はありません。 両方が設定されている場合、WNODE_FLAG_TRACED_GUIDが優先され、イベントは WMI イベント コンシューマーに送信されません。

    Guid または GuidPtr メンバーを設定します。 GuidPtrを使用する場合は、 Flags メンバー にWNODE_FLAG_U Standard Edition_GUID_PTRを設定します。

    必要に応じて、 TimeStamp の値を指定します。 ドライバーが TimeStamp 値を指定しない場合、ロガーはこれを入力します。 ドライバーがロガーにタイム スタンプを設定したくない場合は、 Flags メンバーにWNODE_FLAG_U Standard Edition_TIMESTAMP設定する必要があります。

    次の EVENT_TRACE_HEADER メンバーのうち、ドライバーにとって意味のあるいずれかを設定します。 Class.TypeClass.Level および Class.Version

    最後に、 EVENT_TRACE_HEADERWNODE_HEADER にキャストし、 HistoricalContext 値 ( Wnode )を、上記の手順 4 で保存したロガー ハンドルに設定します。

  7. IoWMIWriteEventEVENT_TRACE_HEADER 構造体へのポインターを使用して呼び出します。

ドライバーは、 IRP_MN_DISABLE_EVENTS 要求を介してイベント ログを無効にする通知を受け取るまで、コントロール GUID に関連付けられているトレース イベントのログ記録を続行する必要があります。