Как читать FileVersionTraceData с помощью TraceProcessor? - PullRequest
1 голос
/ 27 февраля 2020

Я хотел попробовать новую библиотеку обработки ETW TraceProcessor . Пока у меня проблемы с отображением событий ETW из Tracevent в новую библиотеку. Я хочу, например, чтобы выгрузить данные из событий FileVersionTraceData с помощью Microsoft. Windows .EventTracing.Processing.All. Для этого мне нужно добавить несколько trace.Usexxxxx, где определено много предложений Use, но они не сообщают мне, какие события они на самом деле будут возвращать. Событие ETW, за которым я следую, содержит поля

  • ImageSize
  • TimeDateStamp
  • BuildTime
  • OrigFileName
  • FileDescription
  • FileVersion
  • BinFileVersion
  • VerLanguage
  • ProductName
  • CompanyName
  • ProductVersion
  • FileId
  • ProgramId

каким было бы соответствующее предложение Use и каково его имя в новом мире?

Событие сопоставляется с FileVersionTraceData с помощью TraceEvent от поставщика KernelTraceControl с 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));

1 Ответ

2 голосов
/ 28 февраля 2020

(я разработчик в Microsoft и работаю над библиотекой TraceProcessor.)

В наших документах (https://aka.ms/TraceProcessing) у нас есть список различных вызовов trace.Use*() и соответствующих данных, доступных для каждого из них.

Я не эксперт по TraceEvent, но я искал FileVersionTraceData в своем репо , и он мне кажется, что он соответствует типу IImage в библиотеке TraceProcessor. Список изображений, загруженных в адресное пространство процесса во время трассировки, появляется в IProcess типе , который доступен через вызов 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, но я отвечу, если найду их.

...