このセクションでは、情報プロバイダーとしてカーネル モード ドライバーが情報コンシューマーに情報を提供するために使用できる WDM (Windows 2000 以降でサポート) への WMI 拡張機能について説明します。 通常、ドライバーは、ドライバーの構成とリソースの使用状況を判断するためにコンシューマーが使用する情報を提供します。 ユーザー モード API は、WDM への WMI 拡張機能に加えて、WMI イベント情報のプロバイダーまたはコンシューマーをサポートしています。詳細については、Windows SDK を参照してください。
イベント トレース ロガーは、最大 32 個のインスタンスをサポートします。 インスタンスの 1 つは、カーネルをトレースするために予約されています。 ロガーは、高いイベント レートのトレースをサポートします。
トレース イベントは、他の WMI イベントと同じ方法で定義されます。 WMI イベントは MOF ファイルで説明されています。 WMI イベントの説明の詳細については、「 WMI データおよびイベント ブロックの MOF 構文」を参照してください。
カーネル モード ドライバーのログ情報が既存の WMI インフラストラクチャに統合されるプロセス。 トレース イベントをログに記録するために、ドライバーは次の処理を行います。
IoWMIRegistrationControl を呼び出して WMI プロバイダーとして登録します。
ドライバーが WMI にイベントを登録するときに渡される WMIREGGUID 構造体の Flags メンバーにWMIREG_FLAG_TRACED_GUIDを設定して、イベントをトレース可能としてマークします。
ドライバーが WMI にイベントを登録するときに渡される WMIREGGUID 構造体の Flags メンバーにWMIREG_FLAG_TRACE_CONTROL_GUIDを設定することで、トレース イベントのセットを全体的に有効または無効にするコントロール イベントとして 1 つのイベントを指定します。
GUID がトレース コントロール GUID と一致するイベントを有効にする要求を WMI から受信すると、ドライバーはロガーにハンドルを格納する必要があります。 この値は、イベントを記述するときに必要になります。 このハンドルの使用方法については、手順 6 を参照してください。 ロガー ハンドル値は、ENABLE イベント要求のパラメーターの一部である WMI バッファーのWNODE_HEADER部分の HistoricalContext メンバーに含まれています。
トレース イベントを WMI イベント コンシューマーに送信するか、WMI イベント ロガーのみを対象とするかを決定します。 これにより、 EVENT_TRACE_HEADER 構造体のメモリの取得場所が決まります。 このメモリは最終的に IoWMIWriteEvent に渡されます。
イベントがログ イベントのみの場合、メモリは WMI によって削除されません。 この場合、ドライバーはスタック上のバッファーを渡すか、この目的のために割り当てられたバッファーを再利用する必要があります。 パフォーマンス上の理由から、ドライバーはメモリを割り当てたり解放したりする不要な呼び出しを最小限に抑える必要があります。 この推奨事項に準拠しないと、ログ ファイルに含まれるタイミング情報の整合性が損なわれます。
イベントをロガーと WMI イベント コンシューマーの両方に送信する場合は、非ページ プールからメモリを割り当てる必要があります。 この場合、イベントはロガーに送信され、WMI に転送され、イベントの通知を要求した WMI イベント コンシューマーに送信されます。 その後、イベントのメモリは、 IoWMIWriteEvent の動作に従って WMI によって解放されます。
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.Level、 および Class.Version。
最後に、EVENT_TRACE_HEADERをWNODE_HEADERにキャストし、Wnode の HistoricalContext 値を、上記の手順 4 で保存したロガー ハンドルに設定します。
EVENT_TRACE_HEADER構造体へのポインターを使用して IoWMIWriteEvent を呼び出します。
ドライバーは、ドライバーが IRP_MN_DISABLE_EVENTS要求を 介してイベント ログを無効にする通知を受け取るまで、コントロール GUID に関連付けられているトレース イベントのログ記録を続行する必要があります。