在 Windows 事件跟踪 (ETW) 中,TraceEventSession 不会从记事本中捕获读取事件

Posted

技术标签:

【中文标题】在 Windows 事件跟踪 (ETW) 中,TraceEventSession 不会从记事本中捕获读取事件【英文标题】:In Event Tracing for Windows (ETW), TraceEventSession don't catch read event from notepad 【发布时间】:2020-05-23 22:40:54 【问题描述】:

我使用点击过滤器:

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

我使用的是 Windows 10。

【问题讨论】:

@Clint E 是磁盘盘符。我按磁盘字母制作过滤器。 不过,当我创建记事本文件并打开文件时,我看到了发生的事件。只是我已将查询设置为查找以E 开头的文件名。我很确定它也可以与 C 驱动器中的 FileIO 一起使用 @Clint U 有 Windows 10? 是的,没错 are you saying that when you use notepad to open a file in E Drive Kernel_FileIORead does not trigger, but when you open with notepad++ Kernel_FileIORead triggers ? 是的。 Notepad++ 火灾事件 【参考方案1】:

像这样为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:\复制问题

通过记事本、wordpad 在E:\ 中打开一个txt 文件对其进行了测试通过MSWord 在E:\ drive 中打开一个word 文件对其进行了测试

附言

如果你想按进程过滤,那么你可以使用 obj.ProcessName == "notepad"

参考文献

强烈推荐通过 GIT 的 doc

【讨论】:

以上是关于在 Windows 事件跟踪 (ETW) 中,TraceEventSession 不会从记事本中捕获读取事件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ETW 编写自定义堆栈跟踪

安全漏洞一内核漏洞利用

未从实时 ETW 消费者接收 Microsoft-Windows-Kernel-Process 事件

ETW 提供者的频道名称

如何查看 CLR ETW 事件

使用 ETW 的 Windows 用户模式进程系统调用跟踪