前回の予告通りコントローラーを作ります。
例によってコードは GitHub を参照してください。
復習
ETW の構成要素は 4 つありました。
役割のおさらいをしましょう。
前回作ったプロバイダーは、イベントを発行する役割です。
そのイベントを記録する場所がセッションで、コントローラーはセッションを作成して管理する役割です。
発行されたイベントを読み取るのがコンシューマーで、これは次回作ります。
前回はコントローラーとして Windows 標準のツールである logman を使いました。
今回は logman の代わりに自作のコントローラーを使います。
プロバイダーは前回作ったものを、コンシューマーは前回同様 tracerpt を使うことにします。
コントローラーの解説
コードを見ながら読んでください。
# Gist だけでなく GitHub のコードもブログに埋め込めればいいんですけどね…
コントローラーの処理手順はこんな感じになります。
- EVENT_TRACE_PROPERTIES 構造体を初期化
- StartTrace 関数でトレースを開始
- EnableTraceEx 関数でセッションに対してプロバイダーを有効化
- プロバイダーがイベントを発行するのを待つ
- EnableTraceEx 関数でプロバイダーを無効化
- StopTrace 関数でセッションを終了
EVENT_TRACE_PROPERTIES 構造体の内容は細かく制御することもできますが、例のように、だいたい既定値でも動きます。
注意すべき点は 2 点。
- 記録するファイルのパス等を EVENT_TRACE_PROPERTIES 構造体の後ろに付加するため、EVENT_TRACE_PROPERTIES 型の変数を単に宣言するのではなく、必要なサイズを計算して領域を確保していること。
- malloc や new で動的にメモリを確保する場合は開放を忘れないように。
- 前回作ったプロバイダーからのイベントのみを受け入れるため、プロバイダーの ID が必要なので、前回マニフェストをコンパイルして得たヘッダファイルをインクルードしていること。
サンプルを動かしてみる場合は、
- コマンド プロンプトを開いて Controller1.exe を実行
- 別のコマンド プロンプトを開いて Provider0.exe を実行
- Controller1.exe の方で何かキーを押して終了
- Controller1.etl というファイルが出来るので、tracerpt を使って解析
という流れになります。
次回予告
コンシューマーを作ります。
今はまだまだ、プロバイダーもコントローラーもコンシューマーも単純極まりないものです。
次回で構成要素が一通り揃いますので、それからだんだんと複雑にして行きます。
何かわからないことがあったらお気軽にコメントしてください。