c# - 如何使用 TraceProcessor 读取 FileVersionTraceData?
问题描述
我想尝试新的 ETW 处理TraceProcessor库。到目前为止,我在将 ETW 事件从 Traceevent 映射到新库时遇到问题。例如,我想使用 Microsoft.Windows.EventTracing.Processing.All 从 FileVersionTraceData 事件中转储数据。为此,我需要添加一些 trace.Usexxxxx ,其中定义了许多 Use 子句,但它们没有告诉我它们实际上会返回哪些事件。我追求的 ETW 事件包含字段
- 图片尺寸
- 时间日期戳
- 构建时间
- 原始文件名
- 文件描述
- 文件版本
- 二进制文件版本
- 语言
- 产品名称
- 公司名称
- 产品版本
- 文件编号
- 程序 ID
什么是相应的 Use 子句,它在新世界中的类型名称是什么?
事件由提供者 KernelTraceControl 的 TraceEvent 映射到 FileVersionTraceData,FileVersion 为 0x40:
internal static readonly Guid ImageIDTaskGuid = new Guid(unchecked((int)0xB3E675D7), 0x2554, 0x4f18, 0x83, 0x0B, 0x27, 0x62, 0x73, 0x25, 0x60, 0xDE);
public static readonly string ProviderName = "KernelTraceControl";
public static readonly Guid ProviderGuid = new Guid(0x28ad2447, 0x105b, 0x4fe2, 0x95, 0x99, 0xe5, 0x9b, 0x2a, 0xa9, 0xa6, 0x34);
public const int DBGID_LOG_TYPE_FILEVERSION = 0x40;
source.RegisterEventTemplate(new FileVersionTraceData(value, 0xFFFF, 0, "ImageID", ImageIDTaskGuid, DBGID_LOG_TYPE_FILEVERSION, "FileVersion", ProviderGuid, ProviderName));
解决方案
(我是 Microsoft 的开发人员,我在 TraceProcessor 库上工作。)
在我们的文档 ( https://aka.ms/TraceProcessing ) 中,我们列出了各种trace.Use*()
调用以及每个调用都可以访问的相应数据。
我不是 TraceEvent 方面的专家,但我在他们的 repo 中搜索了 FileVersionTraceData,在我看来它映射到 TraceProcessor 库中的IImage
类型。跟踪期间加载到进程地址空间的图像列表显示在IProcess
type中,可通过trace.UseProcesses()
调用访问。
例如,您可以执行以下操作:
using Microsoft.Windows.EventTracing;
using Microsoft.Windows.EventTracing.Processes;
using System;
using System.Globalization;
class Program
{
static void Main(string[] args)
{
if (args.Length != 1)
{
Console.Error.WriteLine("Usage: ListImages.exe <trace.etl>");
return;
}
string tracePath = args[0];
using (ITraceProcessor trace = TraceProcessor.Create(tracePath))
{
IPendingResult<IProcessDataSource> pendingProcessData = trace.UseProcesses();
trace.Process();
IProcessDataSource processData = pendingProcessData.Result;
foreach (IProcess process in processData.Processes)
{
foreach (IImage image in process.Images)
{
DataSize ImageSize = image.Size;
long TimeDataStamp = image.Timestamp;
string OrigFileName = image.OriginalFileName;
string FileDescription = image.FileDescription;
string FileVersion = image.FileVersion;
Version BinFileVersion = image.FileVersionNumber;
CultureInfo VerLanguage = image.Locale;
string ProductName = image.ProductName;
string CompanyName = image.CompanyName;
string ProductVersion = image.ProductVersion;
string FileId = image.CompatibilityFileId;
string ProgramId = image.CompatibilityProgramId;
}
}
}
}
}
我使用您问题中的字段名称作为变量名称来显示映射。我没有看到 BuildTime 数据,但如果我找到了,我会回复。
推荐阅读
- excel - 打开有或没有配额的excel文件路径之间的差异
- c++ - 拆分循环依赖的 CRTP 类标头时与函数调用不匹配
- arrays - 在沙发库中搜索不区分大小写的数组
- javascript - 如何在 MongoDB 中查找包含搜索数组的一个或多个元素的文档?
- python - Seaborn relplot:零大小数组到没有标识的缩减操作最小值
- python-3.x - 如何在 python 脚本的特定分支中的 github-actions 中定义测试运行?
- jenkins - 多个并行阶段,詹金斯在每个阶段检查源代码
- java - 如何分享我新开发的实用软件?
- mysql - 我可以在没有定义子句的情况下生成 mysql 触发器吗?
- c - 与 const 缓冲区的接口,但实现需要非常量缓冲区