从事件跟踪 ETW 文件日志 C# 中的 FileObject 或 FileKey 获取 FileName
Get FileName from FileObject or FileKey in event trace ETW file log C#
我一直在寻找一种解决方案,通过特定进程从事件跟踪 (ETW) 会话中获取所有 Read/Write/Open/Close 文件(我将处理来自实时会话的数据)。
我编写此代码并获取该操作中的所有事件,但我无法在事件中获取 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
吗?
您订阅的 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 或进程名进行过滤,您可以在此处获取 data.FileName
处的文件名。订阅您要处理的任何 FileIO 事件。
有了这段代码,可以得到我想要的一切。
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
:)。
我一直在寻找一种解决方案,通过特定进程从事件跟踪 (ETW) 会话中获取所有 Read/Write/Open/Close 文件(我将处理来自实时会话的数据)。
我编写此代码并获取该操作中的所有事件,但我无法在事件中获取 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
吗?
您订阅的 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 或进程名进行过滤,您可以在此处获取 data.FileName
处的文件名。订阅您要处理的任何 FileIO 事件。
有了这段代码,可以得到我想要的一切。
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
:)。