ネイティブ プラグインを使用するアプリケーションがあります。これらのプラグインには独自のバイナリ形式があります。各プラグインは、DLL をプロセスの空間にマッピングするのと同様の方法を使用して、実行時にロードされます。つまり、各プラグインには独自の, のようなImageBase
セクションがあり、従来の DLL と同じ方法で処理されます。唯一の違いは、プラグインのバイナリ形式 (ファイルではない) と、プラグインをプロセス空間にマップするローダー コードです。.text
.data
PE
このコマンドラインでトレースを実行すると、ETW が発生することがわかりました。
xperf -on latency -stackwalk profile -buffersize 1024 -minbuffers 300 -start tracea1 -on Microsoft-Windows-Win32k:::'stack'
トレース キャプチャ中にプロセス環境を再構築するために使用できるイベントを発行します。つまり、「プロセスの追加」、「プロセスへのスレッドの追加」、「プロセスへの DLL モジュールの追加」などのイベントを発行し、そのようなツールxperfview
がシステム内のプロセスの状態の仮想環境を構築し、情報を構築できるようにします。現在のプロセスツリーのように。これらのイベントは、たとえば、トレース前またはトレース中に読み込まれる各 DLL に関する情報を提供するImageLoadイベントです。
もちろん、私のプラグインではこれらのImageLoad
イベントは生成されません。これは、技術的には DLL ではないためです (つまり、機能は同じですが、DLL と同じ機能によって読み込まれるわけではありません)。これが、 のようなツールがxperfview
プロセス空間での存在を認識しない理由です。
私がやりたいことは、プラグイン ローダー コードに独自の EventWrite を記述し、ImageLoad
必要な情報を含むこれらのイベントを発行してxperfview
、 および同様のツールがプラグインを通常の DLL として解釈できるようにすることです。ImageBase
、ProcessId
、ImageSize
などの必要な情報を入力します。
MSNT_SystemTrace
これを行うには、イベントの所有者であるイベント プロバイダーを登録しImageLoad
、次のような構造でイベントを構築する必要があることを理解しています。
<Data Name="ImageBase">0x7FEFDBD0000</Data>
<Data Name="ImageSize">0x12D000</Data>
<Data Name="ProcessId"> 548</Data>
...
<Data Name="Reserved0"> 0</Data>
<Data Name="DefaultBase">0x7FEFDBD0000</Data>
そしてイベントを発行します。
問題は、このプロバイダーが既に存在するため、論理的なERROR_ACCESS_DENIED
別の を登録しようとしたときに得られることです。MSNT_SystemTrace
しかし、それは私が質問をすることを余儀なくさせます.私がやろうとしていることはETWでサポートされていますか?