鷲ノ巣

C# とか PowerShell とか。当ブログの記事は(特に公開直後は)頻繁に改定される場合があることをご了承ください。

コントローラーを作る

前回の予告通りコントローラーを作ります。
例によってコードは GitHub を参照してください。

復習

ETW の構成要素は 4 つありました。
役割のおさらいをしましょう。

前回作ったプロバイダーは、イベントを発行する役割です。
そのイベントを記録する場所がセッションで、コントローラーはセッションを作成して管理する役割です。
発行されたイベントを読み取るのがコンシューマーで、これは次回作ります。

前回はコントローラーとして Windows 標準のツールである logman を使いました。
今回は logman の代わりに自作のコントローラーを使います。

プロバイダーは前回作ったものを、コンシューマーは前回同様 tracerpt を使うことにします。

コントローラーの解説

コードを見ながら読んでください。
# Gist だけでなく GitHub のコードもブログに埋め込めればいいんですけどね…

コントローラーの処理手順はこんな感じになります。

  1. EVENT_TRACE_PROPERTIES 構造体を初期化
  2. StartTrace 関数でトレースを開始
  3. EnableTraceEx 関数でセッションに対してプロバイダーを有効化
  4. プロバイダーがイベントを発行するのを待つ
  5. EnableTraceEx 関数でプロバイダーを無効化
  6. StopTrace 関数でセッションを終了

EVENT_TRACE_PROPERTIES 構造体の内容は細かく制御することもできますが、例のように、だいたい既定値でも動きます。

注意すべき点は 2 点。

  • 記録するファイルのパス等を EVENT_TRACE_PROPERTIES 構造体の後ろに付加するため、EVENT_TRACE_PROPERTIES 型の変数を単に宣言するのではなく、必要なサイズを計算して領域を確保していること。
    • malloc や new で動的にメモリを確保する場合は開放を忘れないように。
  • 前回作ったプロバイダーからのイベントのみを受け入れるため、プロバイダーの ID が必要なので、前回マニフェストコンパイルして得たヘッダファイルをインクルードしていること。

サンプルを動かしてみる場合は、

  1. コマンド プロンプトを開いて Controller1.exe を実行
  2. 別のコマンド プロンプトを開いて Provider0.exe を実行
  3. Controller1.exe の方で何かキーを押して終了
  4. Controller1.etl というファイルが出来るので、tracerpt を使って解析

という流れになります。

次回予告

コンシューマーを作ります。

今はまだまだ、プロバイダーもコントローラーもコンシューマーも単純極まりないものです。
次回で構成要素が一通り揃いますので、それからだんだんと複雑にして行きます。

何かわからないことがあったらお気軽にコメントしてください。