より大きな問題は、リアルタイムの ETW ネットワーク スタック イベントを一般的にどのように使用するかということですが、私は特にMicrosoft-Windows-NDIS-PacketCapture provider に興味があります。他のすべてのネットワーク スタック プロバイダーは部分的に機能しますが、NDIS-PacketCapture (NDIS-PC) はまったく機能しないため、これはおそらくここで尋ねることができる最も簡単な質問です。
次のコードをベースとして使用しており、リアルタイムで動作するようにほとんど変更していません: http://msdn.microsoft.com/en-us/library/windows/desktop/ee441325(v=vs.85) .aspx
私が行った変更は次のとおりです。
StartTrace を呼び出して、他の処理を行う前に NDIS-PC セッションを開始します。プロパティ struct EVENT_TRACE_PROPERTIES で、LogFileMode = EVENT_TRACE_REAL_TIME_MODE、LogFileNameOffset = 0、Wnode.Guid = 何かランダムな GUID を設定します。
呼び出しステータス = EnableTraceEx2(hSession, &Current_Guid, EVENT_CONTROL_CODE_ENABLE_PROVIDER, TRACE_LEVEL_VERBOSE, 0, 0, 0, NULL); ここで、hSession は StartTrace を使用して開始されたセッションであり、Current_Guid は
{0x2ED6006E,0x4729,0x4609,{0xB4,0x23,0x3E,0xE7,0xBC,0xD6,0x78,0xEF}};
次に、LoggerName = ワイド文字列、LogFileName = NULL、および LogFileMode = EVENT_TRACE_REAL_TIME_MODE で OpenTrace を呼び出します。
最後に、先ほど開いたトレース ハンドルで ProcessTrace を呼び出します。
繰り返しますが、他のすべては MSDN の例で提供されているものと同じままにしておきます
プロバイダーを Microsoft-Windows-Winsock-AFD や Microsoft-Windows-TCPIP などの別のものに1 回変更するだけで同じコードを使用すると、定義したレコード コールバックが呼び出されます (ただし、まだできません)。プロパティを取得しますが、この問題をできるだけ単純にするために、これ以上掘り下げることはしません)。NDIS-PC を使用すると、0 コールバックが発生します。ControlTrace を使用して手動でフラッシュしようとしましたが、成功しませんでした。また、「EventRecordCallback」の代わりに「EventCallback」を定義しようとしましたが、成功しませんでした。
このプロセスに関係するすべてのデータ構造を調べて、各プロバイダーを比較したところ、それらはすべて正しく同じに見えました。関数からのすべての戻り値と返されたデータ構造を調べましたが、試したプロバイダー間でも同じように見えます。
「logman "My Trace Session 04" -ets」を呼び出してセッション プロパティを調べたところ、NDIS-PC と TCPIP で同じように見えます。
C:\windows\system32>logman "マイ トレース セッション 04" -ets
名前: マイ トレース セッション 04 状態:
実行中 ルート パス: %systemdrive%\PerfLogs\Admin セグメント:
オフ スケジュール: オン名前: My Trace Session 04\My Trace Session 04 タイプ:
トレース 追加: オフ 循環: オフ 上書き:
オフ バッファー サイズ: 64 失われたバッファー: 0 書き込まれたバッファー: 0 バッファー フラッシュ タイマー: 1 クロック タイプ: パフォーマンス ファイル モード: リアルタイムプロバイダー: 名前: Microsoft-Windows-NDIS-PacketCapture プロバイダー GUID: {2ED6006E-4729-4609-B423-3EE7BCD678EF} レベル:
5 (win:Verbose) KeywordsAll: 0x0 KeywordsAny:
0xffffffffffffffff (Ethernet802.3,WirelessWAN,Tunnel,Nativ e802.11,PacketStart,PacketEnd,ut:SendPath,ut:ReceivePath,ut:L3ConnectPath,ut:L2C onnectPath,ut:ClosePath,ut:Authentication,ut:Configuration,ut: Global,ut:Dropped, ut:PiiPresent,ut:Packet,ut:Address,ut:StdTemplateHint,ut:StateTransition,win:ResponseTime,Microsoft-Windows-NDIS-PacketCapture/Diagnostic,0x2,0x4,0x8,0x10,0x20 , 0x40,0x80,0x100,0x400,0x800,0x1000,0x2000,0x4000,0x20000,0x40000,0x80000,0x10000 0,0x200000,0x400000,0x800000,0x1000000,0x2000000,0x4000000,0x8000000,0x10000000, 0x20000000,0x400000000000,0x800000000000,0x2000000000000, 0x4000000000000,0x80000 00000000,0x10000000000000,0x20000000000000,0x40000000000000,0x80000000000000,0x1 00000000000000,0x200000000000000,0x400000000000000,0x800000000000000,0x100000000 0000000,0x2000000000000000,0x4000000000000000) プロパティ: 0 フィルター タイプ: 0コマンドは正常に完了しました。
また、logman を使用して手動でセッションを開始し、コードで開いて処理しようとしましたが、それもうまくいきませんでした。また、ETLファイルに書き込もうとしましたが、それも機能しません。私が試したことは他にもたくさんありますが、何も機能していません。
リアルタイム ETW 消費に関係するインターネット上のすべてのもの (MSDN、Google 検索、Stackoverflow など) を調べましたが、リアルタイム ETW イベント消費の完全な例を 1 つも見たことがありません。すべての例は、ETL ファイルからのイベントの使用、または記録されたイベントの ETL ファイルへのエクスポートを示しており、リアルタイムの使用を機能させるためにいくつかのパラメーターを変更することを示しています。上記で要約したコードの変更は、それらの変更を反映していると思います。
私は VS2010 SP1 を使用して 32 ビット コンソール アプリを作成している Win7 Ultimate を使用しています。また、改善なしで64ビットアプリを作成しようとしました。
次の 2 つの投稿は関連性がありますが、試したり実施したりしても何の違いもありませんでした。リアルタイム モードでは、コードはセッション名をプロパティ構造体の末尾にコピーしますが、ログ ファイルのオフセットはとにかく 0 にする必要があります。他のすべてのプロバイダーは問題なく動作するため、アライメントの問題はないと思います。
Windows ETW: カーネル コンシューマーが EventCallback または BufferCallback イベントを受信しない Windows ETW: StartTrace がエラー 87 (ERROR_INVALID_PARAMETER) で失敗する
小さくて些細なことを見逃しているような気がしますが、これでうまくいくはずです。助けていただければ幸いです。