2017-09-05 7 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(); 
      } 
     } 

나는 내 에이전트를 실행하고이 같은 이벤트를 얻을 : 단지 FileObjectFileKey ...
이 이벤트 얻을 내 코드가

<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"/> 

어떻게 FileName를 얻을 수를 그 이 사건에 영향을 줬어?
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

you'r 솔루션으로, 나는 이벤트가 없습니다! –

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 :) 대신이 파일을 사용할 수 있습니다.