Windows ETW: потребитель ядра не получает событий EventCallback или BufferCallback

я пытаюсь прослушать события ядра ETW.

За исключением того, что ProcessTrace сразу же неоднократно возвращается, и обратный вызов не вызывается, даже несмотря на то, что файл etl присутствует и растет.


Если я изменю ведение журнала с Файловый на Журнал в реальном времени:

  • Шаг 1 — OpenTrace изменений для поддержки реального времени:

    logFile.ProcessTraceMode := PROCESS_TRACE_MODE_REAL_TIME;
    
  • Шаг 2. StartTrace изменения для поддержки реального времени:

    sessionProperties.LogFileMode := EVENT_TRACE_REAL_TIME_MODE;
    

В этом случае ProcessTrace никогда не возвращается, но ни EventCallback, ни BufferCallback никогда не вызываются.

Что я делаю неправильно?


Обновление: Мои функции обратного вызова:

function BufferCallback(Logfile: PEVENT_TRACE_LOGFILE): LongWord; stdcall;
begin
   ShowMessage('BufferCallback');
   Result := 1; //return true to keep processing rows
end;

procedure RealtimeEventCallback(pEvent: PEVENT_TRACE); stdcall;
begin
   ShowMessage('EventCallback');
   nEvents := nEvents+1;
end;

person Ian Boyd    schedule 29.01.2012    source источник
comment
По моему опыту (по крайней мере, при трассировке в реальном времени) OpenTrace() всегда завершается успешно, даже если сеанс не существует. Только когда вы вызываете ProcessTrace(), происходит сбой с ошибкой ERROR_WMI_INSTANCE_NOT_FOUND. Я не знаю, как ведет себя провайдер ядра, но с пользовательскими провайдерами реального времени вам нужно использовать StartTrace() перед OpenTrace(). Я предполагаю, что то же самое верно и при отслеживании событий в файле.   -  person Luke    schedule 30.01.2012


Ответы (2)


я нашел проблему.

Заголовки, которые я использовал, не были выровнены по четырем словам.

На языке Delphi использовалось ключевое слово packed.

person Ian Boyd    schedule 12.02.2012

Вы не можете указать и LoggerName, и LogFileName. Если вы указываете LoggerName, LogFileName должно быть нулевым. См. эту ссылку.

person Carey Gregory    schedule 29.01.2012