在 Windows (ETW) 的事件跟踪中,TraceEventSession 不捕获来自记事本的读取事件
In Event Tracing for Windows (ETW), TraceEventSession don't catch read event from notepad
我使用点击过滤器:
session.EnableKernelProvider(KernelTraceEventParser.Keywords.DiskFileIO |
KernelTraceEventParser.Keywords.FileIOInit |
KernelTraceEventParser.Keywords.FileIO);
我订阅了 DiskIORead
和 FileIORead
事件。
如果我通过记事本打开文件,则不会发生该事件。
但是,如果我通过记事本++打开文件,就会出现这种情况。
UPD:
完整代码:
class Program
{
static void Main(string[] args)
{
using(var session=new TraceEventSession("Test"))
{
session.EnableKernelProvider(KernelTraceEventParser.Keywords.DiskFileIO |
KernelTraceEventParser.Keywords.FileIOInit |
KernelTraceEventParser.Keywords.FileIO);
session.Source.Kernel.FileIORead += Kernel_FileIORead;
session.Source.Kernel.DiskIORead += Kernel_DiskIORead;
session.Source.Process();
}
}
private static void Kernel_FileIORead(Microsoft.Diagnostics.Tracing.Parsers.Kernel.FileIOReadWriteTraceData obj)
{
if (obj.FileName.ToUpper().StartsWith(@"E"))
{
Console.WriteLine("2:" + obj.FileName);
}
}
private static void Kernel_DiskIORead(Microsoft.Diagnostics.Tracing.Parsers.Kernel.DiskIOTraceData obj)
{
if (obj.FileName.ToUpper().StartsWith(@"E"))
{
Console.WriteLine("2:"+obj.FileName);
}
}
}
我用Windows10.
像这样
为 FileIOQueryInfo
添加 Source
session.Source.Kernel.FileIOQueryInfo += Kernel_FileIOQuery;
事件处理器
private static void Kernel_FileIOQuery(FileIOInfoTraceData obj)
{
if (obj.FileName.ToUpper().StartsWith(@"E"))
{
Console.WriteLine("queryInfo:" + obj.FileName);
}
}
注意:分区复制的问题E:\
通过记事本、写字板在 E:\
中打开一个 txt 文件进行了测试。
通过 MSWord
在 E:\ drive
中打开一个 word 文件进行了测试
PS
如果你想按进程过滤那么你可以使用 obj.ProcessName == "notepad"
参考资料
强烈建议从 GIT
中阅读此 doc
我使用点击过滤器:
session.EnableKernelProvider(KernelTraceEventParser.Keywords.DiskFileIO |
KernelTraceEventParser.Keywords.FileIOInit |
KernelTraceEventParser.Keywords.FileIO);
我订阅了 DiskIORead
和 FileIORead
事件。
如果我通过记事本打开文件,则不会发生该事件。
但是,如果我通过记事本++打开文件,就会出现这种情况。
UPD:
完整代码:
class Program
{
static void Main(string[] args)
{
using(var session=new TraceEventSession("Test"))
{
session.EnableKernelProvider(KernelTraceEventParser.Keywords.DiskFileIO |
KernelTraceEventParser.Keywords.FileIOInit |
KernelTraceEventParser.Keywords.FileIO);
session.Source.Kernel.FileIORead += Kernel_FileIORead;
session.Source.Kernel.DiskIORead += Kernel_DiskIORead;
session.Source.Process();
}
}
private static void Kernel_FileIORead(Microsoft.Diagnostics.Tracing.Parsers.Kernel.FileIOReadWriteTraceData obj)
{
if (obj.FileName.ToUpper().StartsWith(@"E"))
{
Console.WriteLine("2:" + obj.FileName);
}
}
private static void Kernel_DiskIORead(Microsoft.Diagnostics.Tracing.Parsers.Kernel.DiskIOTraceData obj)
{
if (obj.FileName.ToUpper().StartsWith(@"E"))
{
Console.WriteLine("2:"+obj.FileName);
}
}
}
我用Windows10.
像这样
为FileIOQueryInfo
添加 Source
session.Source.Kernel.FileIOQueryInfo += Kernel_FileIOQuery;
事件处理器
private static void Kernel_FileIOQuery(FileIOInfoTraceData obj)
{
if (obj.FileName.ToUpper().StartsWith(@"E"))
{
Console.WriteLine("queryInfo:" + obj.FileName);
}
}
注意:分区复制的问题E:\
通过记事本、写字板在 E:\
中打开一个 txt 文件进行了测试。
通过 MSWord
E:\ drive
中打开一个 word 文件进行了测试
PS
如果你想按进程过滤那么你可以使用 obj.ProcessName == "notepad"
参考资料
强烈建议从 GIT
中阅读此 doc