在 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);

我订阅了 DiskIOReadFileIORead 事件。

如果我通过记事本打开文件,则不会发生该事件。

但是,如果我通过记事本++打开文件,就会出现这种情况。

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