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 メンバーにWMIREG_FLAG_TRACED_GUIDを設定して、イベントをトレース可能としてマークします。

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

  4. GUID がトレース コントロール GUID と一致するイベントを有効にするために WMI から要求を受け取ると、ドライバーはロガーにハンドルを格納する必要があります。 この値は、イベントの作成時に必要になります。 このハンドルの使用方法については、手順 6 を参照してください。 ロガー ハンドル値は、ENABLE イベント要求のパラメーターの一部である WMI バッファーのWNODE_HEADER部分の HistoricalContext メンバーに含まれています。

  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_USE_GUID_PTRを設定します。

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

    ドライバーに意味のあるEVENT_TRACE_HEADERメンバーを設定します。Class.Type、Class.LevelClass.Version

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

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

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