Как использовать события 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
Изменения, которые я сделал:
Вызовите StartTrace, чтобы начать сеанс NDIS-PC, прежде чем делать что-либо еще. В структуре свойств EVENT_TRACE_PROPERTIES, установив LogFileMode = EVENT_TRACE_REAL_TIME_MODE, LogFileNameOffset = 0 и Wnode.Guid = какой-то случайный GUID, который я составил.
Состояние вызова = 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}};
Затем вызывается OpenTrace с LoggerName = какой-то широкой строкой, LogFileName = NULL и LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
Наконец, вызовите ProcessTrace для только что открытого дескриптора трассировки.
Опять же, оставляя все остальное таким же, как в примере 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 "Моя трассировка сессия 04" -ets
Имя: My Trace Session 04 Статус:
Запуск корневого пути: %systemdrive%\PerfLogs\Admin Сегмент:
Выкл. Расписания: Вкл.Имя: My Trace Session 04\My Trace Session 04 Тип:
Trace Append: Off Circular: Off Перезаписать:
Выкл. Размер буфера: 64 Потерянных буферов: 0 Записано буферов: 0 Таймер очистки буфера: 1 Тип часов: Производительность Режим файла: В реальном времениПоставщик: Имя: Microsoft-Windows-NDIS-PacketCapture Guid: {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:Global,ut:Dropped, 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,0x8000000xx00000000000000000000000000000000000000000000000 0x4000000000000,0x8000000000000,0x10000000000000,0x20000000000000,0x40000000000000,0x80000000000000,0x1 00000000000000,0x200000000000000,0x40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Команда выполнена успешно.
Я также попытался запустить сеанс вручную с помощью logman и просто открыть его в коде для обработки, но у меня это тоже не сработало. Я также пытался просто записать в файл ETL, и это тоже не работает. Есть еще много вещей, которые я пробовал, но ничего не работает.
Я сожрал все, что связано с Интернетом, в связи с потреблением ETW в реальном времени (MSDN, поиск в Google, Stackru и т. Д.), И я не видел ни одного полного примера потребления событий ETW в реальном времени. Во всех примерах показано потребление событий из файла ETL или экспорт записанных событий в файл ETL, а затем просто сказано сделать несколько изменений параметров, чтобы заставить потребление в реальном времени работать. Я считаю, что изменения кода, которые я обобщил выше, отражают эти изменения.
Я нахожусь на Win7 Ultimate с использованием VS2010 SP1, создающим 32-битное консольное приложение. Я также попытался создать 64-битное приложение без каких-либо улучшений.
Два следующих поста актуальны, но для меня это не имело никакого значения, когда я пытался / исполнялся. В режиме реального времени код копирует имя сеанса в конец структуры свойств, и смещение файла журнала должно быть равно 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 в реальном времени для захвата пакетов и событий ядра.
Вместо запуска netsh trace start и т. Д. Вы можете попробовать это:
net start ndiscap
При запуске netsh trace и т. Д. Он сделает это за вас, и я думаю, что здесь не хватает того, что облегченный драйвер фильтра, который вводится в ndis для захвата пакетов (т.е. провайдер etw), не запускает и не генерирует события.
Когда вы закончите, вы можете остановить его, используя:
net stop ndiscap