gpt4 book ai didi

c# - 从事件跟踪 ETW 文件日志 C# 中的 FileObject 或 FileKey 获取 FileName

转载 作者:行者123 更新时间:2023-11-30 23:09:04 24 4
gpt4 key购买 nike

我一直在寻找一种解决方案,通过事件跟踪 (ETW) session 中的特定进程获取所有读/写/打开/关闭文件(我将处理来自实时 session 的数据)。我编写这段代码并获取该操作中的所有事件,但我无法在事件中获取 FileNamePath。只有 FileObjectFileKey,...
这是我获取事件的代码:

        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
什么是 FileObjectFileKey
我可以从 FileObjectFileKey 获取 FileName 吗?

最佳答案

有了这段代码,可以得到我想要的一切。

 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 :)。

关于c# - 从事件跟踪 ETW 文件日志 C# 中的 FileObject 或 FileKey 获取 FileName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46060945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com