Как получать события ETW в реальном времени от поставщика Microsoft-Windows-NDIS-PacketCapture?

Более широкий вопрос заключается в том, как в целом использовать события сетевого стека ETW в реальном времени, но меня особенно интересует поставщик Microsoft-Windows-NDIS-PacketCapture .Все остальные поставщики сетевых стеков работают частично, но NDIS-PacketCapture (NDIS-PC) не работает вообще, так что это, вероятно, самый простой вопрос, который я могу здесь задать.

Я использую следующий код в качестве основы и очень немного изменен, чтобы он работал в реальном времени: http://msdn.microsoft.com/en-us/library/windows/desktop/ee441325 (v = vs.85) .aspx

Внесенные мной изменения:

  1. Вызов StartTrace для запуска сеанс NDIS-PC перед выполнением каких-либо действий еще. В структуре свойства EVENT_TRACE_PROPERTIES установка LogFileMode = EVENT_TRACE_REAL_TIME_MODE, LogFileNameOffset = 0, и Wnode.Guid = какой-то случайный GUID, который я придумал.

  2. Статус вызова = EnableTraceEx2 (hSession, & Current_Guid, EVENT_CONTROL_CODE_ENABLE_PROVIDER, TRACE_LEVEL_VERBOSE, 0, 0, 0, НУЛЕВОЙ); где hSession - это сеанс, запущенный с помощью StartTrace и и Current_Guid -

    {0x2ED6006E, 0x4729,0x4609, {0xB4,0x23,0x3E, 0xE7,0xBC, 0xD6,0x78,0xEF}};

  3. Затем вызов OpenTrace с LoggerName = некоторой широкой строкой, LogFileName = NULL и LogFileMode = EVENT_TRACE_REAL_TIME_MODE;

  4. Наконец, вызовите ProcessTrace для только что открытого дескриптора трассировки выше.

  5. Опять же, оставив все остальное так же, как в примере MSDN

Использование идентичного кода с одной сменой поставщика на что-нибудь еще, например Microsoft-Windows-Winsock-AFD или Microsoft-Windows- TCPIP заставляет меня вызывать в обратный вызов записи, который я определил (однако я все еще не могу получить свойства, но я не буду углубляться в дальнейшие шаги, чтобы эта проблема была как можно более простой). Когда я использую NDIS-PC, я получаю 0 обратных вызовов.Я безуспешно пытался промыть вручную с помощью ControlTrace. Я также безуспешно пытался определить «EventCallback» вместо «EventRecordCallback».

Я просмотрел ВСЕ структуры данных, задействованные в этом процессе, и сравнил их у каждого провайдера, и все они выглядели одинаково и правильно. Я просмотрел все значения, возвращаемые функциями и возвращаемыми структурами данных, и они также выглядят одинаково между поставщиками, которые я пробовал.

Я просмотрел свойства сеанса, вызвав "logman" My Trace Session 04 "-ets", и он выглядит идентично для NDIS-PC и TCPIP:

C: \ windows \ system32> logman "My Trace Session 04 "-ets

Имя: Состояние моего сеанса трассировки 04:
Рабочий корневой путь:% systemdrive% \ PerfLogs \ Admin Segment:
График отключения: Вкл.

Имя: Мой сеанс трассировки 04 \ Мой сеанс трассировки 04 Тип:
Добавить трассировку: Выкл. Циркуляр: Выкл. Перезапись:
Выкл. Размер буфера: 64 Потерянных буфера: 0 Записанных буферов: 0 Таймер очистки буфера: 1 Тип часов: Производительный файловый режим: В реальном времени

Провайдер: Имя: Microsoft-Windows-NDIS-PacketCapture Руководство поставщика: {2ED6006E-4729-4609-B423-3EE7BCD678EF} Уровень:
5 (победа: подробный) Ключевые словаВсе: 0x0 Ключевые словаЛюбые:
0xffffffffffffffff (Ethernet802.3, WirelessWAN, туннель, Nativ e802.11, PacketStart, PacketEnd, ut: SendPath, ut: ReceivePath, ut: L3ConnectPath, ut: L2C onnectPath, ut: ClosePath, ut: аутентификация, ut: конфигурация, ut: глобальный, ut: удален, ut: PiiPresent, ut: Packet, ut: Address, ut: StdTemplateHint, ut: StateTransition, win: Res ponseTime, Microsoft-Windows-NDIS-PacketCapture / Diagnostic, 0x2,0x4,0x8,0x10,0x20, 0x40,0x80,0x100,0x400,0x800,0x1000,0x2000,0x4000,0x20000,0x40000,0x80000,0x10000 0,0x200000,0x400000,0x800000,0x1000000,0x2000000,0x4000000,0x8000000,0x10000000, 0x20000000,0x400000000000,0x800000000000,0x2000000000000,0x4000000000000,0x80000 00000000,0x10000000000000,0x20000000000000,0x40000000000000,0x80000000000000,0x1 00000000000000,0x200000000000000,0x400000000000000,0x800000000000000,0x100000000 0000000,0x2000000000000000,0x4000000000000000) Свойства: 0 Тип фильтра: 0

Команда успешно завершена.

Я также пробовал запускать сеансы вручную с помощью logman и просто открывать его в коде для обработки, но у меня это тоже не сработало. Я также пытался просто записать в файл ETL, и это тоже не сработало. Я пробовал еще много вещей, но ничего не работает.

Я проглотил в Интернете все, что имело отношение к использованию ETW в реальном времени (MSDN, поиск Google, Stackoverflow и т. Д.), И я не видел ни одного полного примера события ETW в реальном времени. потребление . Во всех примерах показано потребление событий из файла ETL или экспорт записанных событий в файл ETL, а затем просто предлагается внести несколько изменений в параметры, чтобы обеспечить работу потребления в реальном времени. Я считаю, что приведенные выше изменения кода отражают эти изменения.

Я использую Win7 Ultimate, использую VS2010 SP1 и создаю 32-битное консольное приложение. Я также пробовал создать 64-битное приложение без каких-либо улучшений.

Два сообщения Follwing имеют отношение к делу, но не имеют для меня никакого значения, когда я пытался / принудительно. В режиме реального времени код копирует имя сеанса в конец структуры свойств, и смещение файла журнала в любом случае должно быть равно 0. Я не думаю, что у меня есть какие-либо проблемы с выравниванием, поскольку все другие поставщики работают нормально:

Windows ETW: потребитель ядра не получает событий EventCallback или BufferCallback Windows ETW: StartTrace завершается с ошибкой 87 (ERROR_INVALID_PARAMETER)

I чувствую, что мне не хватает чего-то маленького и тривиального, и это должно просто работать. Буду признателен за любую помощь.

9
задан Community 23 May 2017 в 12:24
поделиться