通过事件跟踪 (ETW) 会话中的特定进程获取 created/modified/deleted 个文件
Get created/modified/deleted files by a specific process from an event tracing (ETW) session
我一直在寻找一种解决方案,以通过特定进程从事件跟踪 (ETW) 会话中获取所有 created/modified 和已删除的文件(我将处理来自 etl 文件的数据,而不是来自真实的 -时间会话)。
显然,完成此操作的最简单解决方案是从 FileIo_Name class and map them to the corresponding DiskIo_TypeGroup1 事件中获取 FileCreate 和 FileDelete 事件。但是,此解决方案对我不起作用,因为我没有收到相应 FileDelete 事件的任何 DiskIo_TypeGroup1 事件,所以我无法获取进程 ID。也不是所有的 FileCreate 事件都有关联的 DiskIo_TypeGroup1 事件(我认为这发生在空的创建文件或只发生在打开的文件上).
注意:我需要 DiskIo_TypeGroup1 映射,因为 FileIo_Name 事件没有 ThreadId 和 ProcessId 成员已填充 - 它们被设置为 (ULONG)-1。另外,在不知道 "file write size" 的情况下,我无法决定刚刚打开或修改了哪些文件。 DiskIo_TypeGroup1 也没有 ThreadId 和 ProcessId(在事件头中,在较新的 OS's) 成员已填充,但它具有 IssuingThreadId 结构成员,我可以从中获取 ProcessId 映射到 Thread_TypeGroup1 class 事件。
所以我研究了 FileIo_Create class 如何帮助我,并指出我可以获得 CreateOptions 成员可以有以下标志:(FILE_SUPERSEDE, FILE_CREATE, FILE_OPEN, FILE_OPEN_IF, FILE_OVERWRITE, FILE_OVERWRITE_IF)。但最初的问题仍然存在。如何检查文件是否是从头开始创建的而不是刚刚打开的(例如 FILE_SUPERSEDE)?
也许我可以使用 FileIo_ReadWrite class 来获取 Write 事件。喜欢用DiskIo_TypeGroup1class。那么,如果将某些内容写入文件,那么我可以假设该文件是创建的还是修改的?
要查找已删除的文件,我认为 FileIo_Info class 和 Delete 事件是解决方案.猜猜我可以接收到 Delete 事件并将它们映射到 FileIo_Name 以获取文件名。
注:FileIo_Create、FileIo_Info、FileIo_ReadWrite 包含有关进程 ID 的信息。
我的推测对吗?我的问题的最佳解决方案是什么?
我将分享我实施的解决方案如下:
创建的文件:
- 我已将所有 FileIo_Create 事件存储为待处理的创建操作并等待接收关联的 FileIo_OpEnd决定文件是否被打开、创建、覆盖或被 ExtraInfo 结构成员取代。
修改的文件:
- 我将来自 FileIo_ReadWrite 的每个 Write 事件和每个 SetInfo[= 的文件标记为脏52=] 事件 InfoClass->FileEndOfFileInformation 和 InfoClass->FileValidDataLengthInformation 来自 FileIo_Info .最后在来自 FileIo_SimpleOp 的 Cleanup 事件上验证文件是否被标记为脏并存储为已修改。
已删除文件:
- 如果使用 CreateOptions->FILE_DELETE_ON_CLOSE 标志从 FileIo_Create[=50= 打开,我将文件标记为已删除] 或者 Delete 来自 FileIo_Info 的事件出现。最后,在来自 FileIo_SimpleOp 的 Cleanup 事件中,将文件存储为已删除。
进程 ID 和文件名也是从 FileIo_Create 事件中获得的,更准确地说是从 OpenPath 结构成员和ProcessId 事件 header 成员。
我一直在寻找一种解决方案,以通过特定进程从事件跟踪 (ETW) 会话中获取所有 created/modified 和已删除的文件(我将处理来自 etl 文件的数据,而不是来自真实的 -时间会话)。
显然,完成此操作的最简单解决方案是从 FileIo_Name class and map them to the corresponding DiskIo_TypeGroup1 事件中获取 FileCreate 和 FileDelete 事件。但是,此解决方案对我不起作用,因为我没有收到相应 FileDelete 事件的任何 DiskIo_TypeGroup1 事件,所以我无法获取进程 ID。也不是所有的 FileCreate 事件都有关联的 DiskIo_TypeGroup1 事件(我认为这发生在空的创建文件或只发生在打开的文件上).
注意:我需要 DiskIo_TypeGroup1 映射,因为 FileIo_Name 事件没有 ThreadId 和 ProcessId 成员已填充 - 它们被设置为 (ULONG)-1。另外,在不知道 "file write size" 的情况下,我无法决定刚刚打开或修改了哪些文件。 DiskIo_TypeGroup1 也没有 ThreadId 和 ProcessId(在事件头中,在较新的 OS's) 成员已填充,但它具有 IssuingThreadId 结构成员,我可以从中获取 ProcessId 映射到 Thread_TypeGroup1 class 事件。
所以我研究了 FileIo_Create class 如何帮助我,并指出我可以获得 CreateOptions 成员可以有以下标志:(FILE_SUPERSEDE, FILE_CREATE, FILE_OPEN, FILE_OPEN_IF, FILE_OVERWRITE, FILE_OVERWRITE_IF)。但最初的问题仍然存在。如何检查文件是否是从头开始创建的而不是刚刚打开的(例如 FILE_SUPERSEDE)?
也许我可以使用 FileIo_ReadWrite class 来获取 Write 事件。喜欢用DiskIo_TypeGroup1class。那么,如果将某些内容写入文件,那么我可以假设该文件是创建的还是修改的?
要查找已删除的文件,我认为 FileIo_Info class 和 Delete 事件是解决方案.猜猜我可以接收到 Delete 事件并将它们映射到 FileIo_Name 以获取文件名。
注:FileIo_Create、FileIo_Info、FileIo_ReadWrite 包含有关进程 ID 的信息。
我的推测对吗?我的问题的最佳解决方案是什么?
我将分享我实施的解决方案如下:
创建的文件:
- 我已将所有 FileIo_Create 事件存储为待处理的创建操作并等待接收关联的 FileIo_OpEnd决定文件是否被打开、创建、覆盖或被 ExtraInfo 结构成员取代。
修改的文件:
- 我将来自 FileIo_ReadWrite 的每个 Write 事件和每个 SetInfo[= 的文件标记为脏52=] 事件 InfoClass->FileEndOfFileInformation 和 InfoClass->FileValidDataLengthInformation 来自 FileIo_Info .最后在来自 FileIo_SimpleOp 的 Cleanup 事件上验证文件是否被标记为脏并存储为已修改。
已删除文件:
- 如果使用 CreateOptions->FILE_DELETE_ON_CLOSE 标志从 FileIo_Create[=50= 打开,我将文件标记为已删除] 或者 Delete 来自 FileIo_Info 的事件出现。最后,在来自 FileIo_SimpleOp 的 Cleanup 事件中,将文件存储为已删除。
进程 ID 和文件名也是从 FileIo_Create 事件中获得的,更准确地说是从 OpenPath 结构成员和ProcessId 事件 header 成员。