ETW в реальном времени с TX - PullRequest
1 голос
/ 03 июня 2019

Я некоторое время работал с ETW через библиотеку событий Trace, и сейчас я смотрю на библиотеку TX.

Однако, несмотря на чтение документов и загрузку примеров, я изо всех сил пытаюсь начать. Все примеры ETW вращаются вокруг чтения файлов etl, а это не то, что я пытаюсь сделать. Я не могу найти пример для начала сеанса и получения данных.

Например, код LINQPad запускает сеансы и подписывается на определенное событие (Process Freeze) с использованием библиотеки событий Trace

var sessionName = "My ETW Session";
var providerName = "Microsoft-Windows-Kernel-Process";
using (var session = new TraceEventSession(sessionName))
{
    session.EnableProvider(providerName, TraceEventLevel.Verbose, 0x00000200);
    var parser = new RegisteredTraceEventParser(session.Source);

    parser
        .Observe(providerName, "ProcessFreeze/Start")
        .Select(te => new
        {
            ProcessID = te.ProcessID,
            FrozenProcessID = te.PayloadByName("FrozenProcessID"),
            CreateTime = te.PayloadByName("CreateTime"),
            ThreadID = te.ThreadID,
            te.TimeStamp,
            Raw = te.ToString(),                
        })
        .DumpLatest();

    session.Source.Process();
}

Как можно сделать эквивалент в TX? Нужно ли мне извлекать манифест для Microsoft-Windows-Kernel-Process и использовать его для генерации классов? Как начать сеанс с необходимыми параметрами и подписаться на него?

Edit: Я добился некоторого успеха в получении некоторых данных, подписавшись на сеанс, только что созданный с этим

var etwTraceSessionObservable = EtwObservable.FromSession(sessionName);
etwTraceSessionObservable.DumpLatest();

Хотя он не содержит много полезных данных. Я думаю, что хочу использовать AddRealTimeSession для объекта воспроизведения.

...