2017-09-05 130 views
1

我一直在尋找一種解決方案,通過事件跟蹤(ETW)會話中的特定進程獲取所有讀/寫/打開/關閉文件處理來自實時會話的數據)。 我編寫了這段代碼並獲得了該操作中的所有事件,但我無法在事件中獲得FileNamePath。有剛FileObjectFileKey ...
這是我的代碼,以獲取事件:從FileObject或FileKey獲取FileName在事件跟蹤ETW文件日誌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(); 
      } 
     } 

我跑我的經紀人,並得到這樣的活動:

<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說受此事件影響?
什麼是FileObjectFileKey
我可以從FileObjectFileKey得到FileName嗎?

+1

看到這個鏈接約相同的情況下:http://bcl.codeplex.com/discussions/274260 – lsalamon

+1

謝謝你@Isalamon。有用的鏈接,我從中得到的想法和問題的答案。我會分享答案。 –

+1

也看到這一個:https://stackoverflow.com/a/26259197/47733 – lsalamon

回答

0

已經有一個內核分析器在session.Source您訂閱:

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); 
    } 
} 

每個PID或Processname這裏過濾,在這裏你可以在data.FileName得到的文件名。訂閱您想要處理的任何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屬性,你可以找到讀寫事件。每個事件都有FileName。你也可以限制文件事件的目錄,並使用它而不是FileSystemWatcher :)。