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();
}
}
나는 내 에이전트를 실행하고이 같은 이벤트를 얻을 : 단지 FileObject
및 FileKey
...
이 이벤트 얻을 내 코드가
<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
은 무엇입니까?
FileName
을 FileObject
또는 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);
}
}
:
같은 케이스와 관련된 링크를 참조하십시오 : http://bcl.codeplex.com/discussions/274260 – lsalamon
@Isalamon. 유용한 링크와 그 안에서 아이디어의 질문에 대답을 얻을. 나는 대답을 나눌 것이다. –
도 참조하십시오. https://stackoverflow.com/a/26259197/47733 – lsalamon