我一直在寻找一个解决方案,可以从事件跟踪(ETW)会话中获取特定进程的所有读/写/打开/关闭文件的信息(我将处理实时会话的数据)。
我编写了下面这段代码,它可以获取操作中的所有事件,但无法获取事件中的FileName
或Path
。只有 FileObject
和 FileKey
...
下面是获取事件的代码:
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="0xffffe00146c43210"
FileKey="0xffffc0019d3f8140" IssuingThreadId="24668"
IOSize="7" IOFlags="0" ExtraFlags="0"/>
在这个事件中,我如何获取受影响的FileName
?
FileObject
或FileKey
是什么?
我能从FileObject
或FileKey
获取FileName
吗?