Как использовать события ETW в реальном времени от поставщика Microsoft-Windows-NDIS-PacketCapture? - PullRequest
9 голосов
/ 27 февраля 2012

Большой вопрос - как использовать события сетевого стека 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, прежде чем делать что-либо еще.В собственности STRUCT EVENT_TRACE_PROPERTIES, установка LOGFILEMODE = EVENT_TRACE_REAL_TIME_MODE, LogFileNameOffset = 0, и Wnode.Guid = что-то случайное GUID я сделал.

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

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

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

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

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

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

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

Имя: MyTrace Session 04 Статус:
Запуск корневого пути:% systemdrive% \ PerfLogs \ Admin Сегмент:
Off Расписания: On

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

Поставщик: Имя:Microsoft-Windows-NDIS-PacketCapture Guid: {2ED6006E-4729-4609-B423-3EE7BCD678EF} Уровень:
5 (win: Verbose) Ключевые словаAll: 0x0 Ключевые словаAny:
0xffffffffffffffff (Ethernet802.3, WirelessWAN, Tunnel,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,0x8000,0x4000,0x20000,0x40000,0x80000,0x10000 0,0x200000,0x400000,0x800000,0x1000000,0x2000000,0x4000000,0x8000000,0x10000000, 0x20000000,0x400000000000,0x800000000000,0x2000000000000,0x000000000000000000,0x10000000000000,0x20000000000000,0x40000000000000,0x80000000000000,0x1 00000000000000,0x200000000000000,0x400000000000000,0x800000000000000,0x100000000 0000000,0x2000000000000000,0x4000000000000000) Свойства: 0 Тип фильтра:. 0

1060 * Команда успешно завершена
1062 *

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

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

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 28 февраля 2012

Если вы посмотрите, что внутренне делают команды «netsh trace», вы увидите, что они подключают драйвер облегченного фильтра NDIS к различным сетевым интерфейсам. Только при подключенном и активированном фильтре вы будете получать события от этого провайдера. Детали этого объекта не документированы и могут быть изменены. Вся логика команд трассировки netsh реализована в nettrace.dll, который вы можете перепроектировать с помощью открытых символов Microsoft. В частности, класс CInboxCapture имеет код, который определяет, был ли драйвер запущен, связывает его с соответствующими сетевыми интерфейсами и запускает его. Если вы запустите драйвер фильтра захвата, как это делает nettrace.dll, вы получите события захвата пакета.

Удачи.

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

Для чего он стоит, я нашел один пример потребителя ETW в реальном времени (пример для веб-сервера IIS): http://blogs.iis.net/eokim/archive/2009/05/15/consume-iis-etw-tracing.aspx

1 голос
/ 12 июля 2017

Вот пример приложения c ++ с комментариями, которое демонстрирует одновременные сеансы ETW в реальном времени для захвата пакетов и событий ядра.

https://github.com/packetzero/etwrealtime

0 голосов
/ 14 августа 2017

Вместо запуска netsh trace start и т. Д. Вы можете попробовать это:

net start ndiscap

При запуске netsh trace и т. Д. Он сделает это за вас, и я думаю, что здесь не хватает того, что облегченный драйвер фильтра, который вводится в ndis для захвата пакетов (то есть провайдер etw), не запускает и не генерирует события .

Когда вы закончите, вы можете остановить его, используя:

net stop ndiscap
...