Как использовать события 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, прежде чем что-либо делать еще. В свойстве struct 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, NULL); где 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 с-АФД или Microsoft-ОС Windows-tcpip на заставляет меня называет в обратный вызов записи, который я определил (однако я все еще не могу получить свойства, но я не буду копайте дальше, чтобы сохранить эту проблему так просто, как я могу). Когда я использую NDIS-PC, я получаю 0 обратных вызовов. Я попытался смыть вручную с помощью ControlTrace без каких-либо успехов. Я также попытался определить "EventCallback" вместо "EventRecordCallback" без успеха.

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

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

C:windowssystem32>logman "My Trace Session 04" - ets

Имя: Мой Сеанс Трассировки 04 Статус:
Запуск корневого пути: %systemdrive%PerfLogsAdmin сегмент:
Off Расписания: On

Имя: Мой Сеанс Трассировки 04Мой Сеанс Трассировки 04 Тип:
Trace Append: Off Circular: Off Overwrite:
Выкл. Размер Буфера: 64 Потерянных Буфера: 0 Записанных Буферов: 0 Buffer Flush Timer: 1 Тип Часов: Режим Работы С Файлами: В реальном времени

поставщик: имя: Microsoft-Windows-NDIS-PacketCapture Идентификатор Guid поставщика: {2ED6006E-4729-4609-B423-3EE7BCD678EF} уровень:
Пять (win: Verbose) KeywordsAll: 0x0 KeywordsAny:
0xffffffffffffffffff (Ethernet802.3, WirelessWAN, Тоннель, Nativ e802.11, PacketStart, PacketEnd, ut:SendPath, ut: ReceivePath, ut:L3ConnectPath, ut:L2C onnectPath, ut: ClosePath, ut: аутентификация, ut: конфигурация, ut: глобальный, ut:отброшен, Юта:PiiPresent,Юта:пакет,Юта:адрес,ут:StdTemplateHint,ут:StateTransition,выиграть:РЭС ponseTime,Microsoft-ОС Windows-Инд-PacketCapture/диагностики,0х2,признаки 0x4,0x8,0х10,0х20, 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, 0x40000000000000000000) свойства: 0 Фильтр Тип: 0

команда выполнена успешно.

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

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

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

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

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

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

4 ответов


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

удачи.


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


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

https://github.com/packetzero/etwrealtime


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

net start ndiscap

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

когда вы закончите, вы можете остановить его с помощью:

net stop ndiscap