2017-09-05 14 views
1

イベントトレース(ETW)セッションから特定のプロセスによってすべての読み取り/書き込み/開く/閉じるファイルを取得するソリューションを探しています。リアルタイムセッションからのデータを処理する)。 このコードを書いてその操作ですべてのイベントを取得しますが、イベントではFileNameまたはPathを取得できません。イベントトレースETWファイルログのFileObjectまたはFileKeyからFileNameを取得します。C#

 var sessionName = "ETWEventSession"; 
     using (var session = new TraceEventSession(sessionName, null)) 
     { 
     session.StopOnDispose = true; 
      using (var source = new ETWTraceEventSource(sessionName, TraceEventSourceType.Session)) 
      { 
       Action<TraceEvent> logAction = delegate(TraceEvent data) 
       { 
        Console.WriteLine(log); 
       }; 
       var registerParser = new RegisteredTraceEventParser(source); 
       registerParser.All += logAction; 
       var fileProviderGuid = TraceEventSession.GetProviderByName("Microsoft-Windows-Kernel-File"); 


       session.EnableProvider(fileProviderGuid, TraceEventLevel.Informational, 0x0200); 

       source.Process(); 
      } 
     } 

私は私のエージェントを実行して、このようなイベントを取得:

どのように私は FileName得ることができます
<Event MSec="0.0000" PID="11376" PName="" TID="24668" 
EventName="Write" ProviderName="Microsoft-Windows-Kernel-File" 
ByteOffset="102386" Irp="0xffffe00148e8c478" FileObject="0xffffe00146c" 
FileKey="0xffffc0019d3f8140" IssuingThreadId="24668" 
IOSize="7" IOFlags="0" ExtraFlags="0"/> 


は...、ただFileObjectFileKeyが、これはイベントを取得するために私のコードですこのイベントに影響を受けていますか?
FileObjectまたはFileKeyとは何ですか?
FileNameFileObjectまたはFileKeyから取得できますか?ここでは、PIDまたはProcessNameのあたりにフィルタリングし、ここにあなたがdata.FileNameでファイル名を取得することができます

var kernel = session.Source.Kernel; 
kernel.FileIORead += HandleFileIoReadWrite; 
kernel.FileIOWrite += HandleFileIoReadWrite; 

private void HandleFileIoReadWrite(FileIOReadWriteTraceData data) 
{ 
    if (data.ProcessID == pid) // (data.ProcessName.Contains("foo")) 
    { 
      Console.WriteLine(data.FileName); 
    } 
} 

+1

このケースについてのリンクを参照してください。http://bcl.codeplex.com/discussions/274260 – lsalamon

+1

@Isalamonありがとうございます。役に立つリンクと私はそこから質問の答えとそれからアイデアを得る。私は答えを共有します。 –

+1

こちらもご覧ください:https://stackoverflow.com/a/26259197/47733 – lsalamon

答えて

0

は、すでにあなたが購読session.Sourceでカーネルのパーサがあります。処理したいFileIOイベントを登録します。

+0

あなたの解決策では、私はイベントを得ることはありません! –

1

このコードでは、私が望むものすべてを手に入れることができます。

var KernelSession = new TraceEventSession(KernelTraceEventParser.KernelSessionName, null); 
     var KernelSource = new ETWTraceEventSource(KernelTraceEventParser.KernelSessionName, TraceEventSourceType.Session); 
     var KernelParser = new KernelTraceEventParser(KernelSource); 
     KernelSession.StopOnDispose = true; 

     KernelSession.EnableKernelProvider(
      KernelTraceEventParser.Keywords.DiskFileIO | 
      KernelTraceEventParser.Keywords.FileIOInit | 
      KernelTraceEventParser.Keywords.Thread | 
      KernelTraceEventParser.Keywords.FileIO 
      ); 
     KernelParser.All += GetLog; 

     KernelSource.Process(); 

    } 

    private static void GetLog(TraceEvent obj) 
    { 
     var log = obj.ToString(); 
     if (log.Contains(@"E:\Final\ETW"))//&& !log.Contains("FileIo/Create") 
     { 
      Console.WriteLine(log); 
     } 
    } 

ShareAccessイベントのプロパティでは、ReadWriteイベントを見つけることができます。各イベントにはFileNameがあります。また、ファイルイベントのディレクトリを制限し、FileSystemWatcher :)の代わりにこれを使用することもできます。

関連する問題