2012-02-27 10 views
8

Największe pytanie brzmi, jak w ogóle konsumować zdarzenia związane ze stosami sieci ETW w czasie rzeczywistym, ale szczególnie interesuje mnie dostawca Microsoft-Windows-NDIS-PacketCapture. Wszyscy inni dostawcy stosów sieci częściowo działają, ale NDIS-PacketCapture (NDIS-PC) nie działa w ogóle, więc jest to prawdopodobnie najprostsze pytanie, które mogę zadać tutaj.Jak konsumować zdarzenia ETW w czasie rzeczywistym od dostawcy Microsoft-Windows-NDIS-PacketCapture?

Używam następujący kod w postaci zasady i modyfikowane niewiele go do pracy w czasie rzeczywistym: http://msdn.microsoft.com/en-us/library/windows/desktop/ee441325(v=vs.85).aspx

Zmiany Zrobiłem to:

  1. połączeń StartTrace Aby rozpocząć sesję NDIS-PC przed wykonaniem czegokolwiek innego, . W strukturze EVENT_TRACE_PROPERTIES, ustawienie LogFileMode = EVENT_TRACE_REAL_TIME_MODE, LogFileNameOffset = 0, i Wnode.Guid = coś losowego identyfikatora GUID, który wymyśliłem.

  2. stan połączenia = EnableTraceEx2 (hSession, & Current_Guid, EVENT_CONTROL_CODE_ENABLE_PROVIDER, TRACE_LEVEL_VERBOSE, 0, 0, 0, NULL); gdzie hSession jest sesja rozpoczęła pomocą StartTrace i i Current_Guid jest

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

  3. Następnie wywołanie OpenTrace z LoggerName = jakiś szeroki ciąg, LogFileName = NULL i LogFileMode = EVENT_TRACE_REAL_TIME_MODE;

  4. Wreszcie wywołaj ProcessTrace na uchwycie śledzenia, który właśnie został otwarty powyżej.

  5. Znowu, pozostawiając wszystko inne takie same jak podane w przykładzie MSDN

Korzystanie identyczny kod z pojedynczej zmiany dostawcy do niczego innego, takich jak Microsoft-Windows-Winsock-AFD lub Microsoft-Windows-TCPIP dzwoni do mnie pod numer do rekordowego wywołania zwrotnego, które zdefiniowałem (jednak nadal nie jestem w stanie odzyskać właściwości, ale nie będę dalej zagłębiał się, aby ten problem był tak prosty, jak to tylko możliwe) . Kiedy używam NDIS-PC, otrzymuję 0 wywołań zwrotnych. Próbowałem spłukiwać ręcznie przy użyciu ControlTrace bez powodzenia. Próbowałem również zdefiniować "EventCallback" zamiast "EventRecordCallback" bez powodzenia.

Przyjrzałem się wszystkim strukturom danych zaangażowanym w ten proces i porównanym między poszczególnymi dostawcami, a wszystkie one wyglądały poprawnie i tak samo. Przyjrzałem się wszystkim wartościom zwracanym z funkcji i zwróconym strukturom danych, a także wyglądają tak samo w przypadku dostawców, których próbowałem.

Szukałem na właściwości sesji poprzez wywołanie "logman "Mój Ślad Session 04" -ets" i wygląda identycznie dla NDIS-PC i TCPIP:

C: \ windows \ system32> LogMan "Mój Ślad Session 04" -ets

Nazwa: My Śledzenie sesji 04 status:
Running ścieżka główna:% systemdrive% \ PerfLogs \ Admin Segment:
Off Harmonogramy: Na

Nazwa: Moja Śledzenie sesji 04 \ M y Śledzenie sesji 04 Typ:
nazwiska Dołącz: Off Circular: Off Zastąp:
Off Rozmiar bufora: 64 Zderzaki przegrane: 0 Zderzaki napisane: 0 Buffer Flush Timer: 1 Zegar Typ: Performance Mode Plik: czasie rzeczywistym

Provider: Nazwa: Microsoft-Windows-NDIS-PacketCapture Provider GUID: {2ED6006E-4729-4609-B423-3EE7BCD678EF} Level:
5 (wygrana: Verbose) KeywordsAll: 0x0 KeywordsAny:
0xffffffffffffffff (Ethernet802. 3, WirelessWAN, Tunnel, Nativ e802.11, PacketStart, PacketEnd, ut: SendPath, ut: ReceivePath, ut: L3ConnectPath, ut: L 2C onnectPath, ut: ClosePath, ut: Authentication, ut: Konfiguracja, ut: Global, ut: Dropped, ut: PiiPresent, ut: Packet, ut: Adres, ut: StdTemplateHint, ut: StateTransition, wygrana: Res ponseTime , Microsoft-Windows-NDIS-PacketCapture/Diagnostic, 0x2,0x4,0x8,0x10,0x20, 0x40,0x80,0 x 100,0 x 400,0 x 800,0 x 1000,0 x 2000 0 x 4000 x x 100 x 0,0000,0 x 80000,0 x 10000 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) Właściwości: 0 Typ filtra: 0

Komenda zakończyła się pomyślnie.

Próbowałem również uruchomić sesje ręcznie za pomocą logmana i po prostu otworzyć go w kodzie do przetworzenia, ale to też nie zadziałało. Próbowałem również po prostu pisać do pliku ETL i to też nie działa. Jest o wiele więcej rzeczy, których próbowałem, ale nic nie działa.

Zjadłem wszystko na stronach internetowych, które miały związek z rzeczywistą konsumpcją ETW (MSDN, wyszukiwarka Google, Stackoverflow, itp.) I I nie widziałem jednego pełnego przykładu konsumpcji zdarzeń ETW w czasie rzeczywistym. Wszystkie przykłady pokazują zużycie zdarzeń z pliku ETL lub eksportują zarejestrowane zdarzenia do pliku ETL, a następnie po prostu informują o wprowadzeniu kilku zmian parametrów w celu uzyskania pracy w czasie rzeczywistym. Uważam, że zmiany w kodzie, które podsumowałem powyżej, odzwierciedlają te zmiany.

Jestem na Win7 Ultimate przy użyciu VS2010 SP1, tworząc 32-bitową aplikację konsolową. Próbowałem też tworzyć aplikację 64-bitową bez poprawy.

Follwing dwa posty są istotne, ale nie zrobiły dla mnie żadnej różnicy, gdy próbowałem/egzekwowałem. W trybie czasu rzeczywistego kod kopiuje nazwę sesji na koniec struktury właściwości, a offset pliku dziennika musi być równy 0.Nie sądzę, że mam jakieś problemy wyrównania jak wszyscy inni dostawcy działać dobrze:

Windows ETW: Kernel consumer receives no EventCallback or BufferCallback events

czuję się jakbym brakuje coś małe i błahe i to powinno tylko praca. Byłbym wdzięczny za każdą pomoc.

Odpowiedz

8

Jeśli przyjrzysz się, co robią komendy "netsh trace", zobaczysz, że dołączają lekki sterownik filtra NDIS do różnych interfejsów sieciowych. Tylko z tym załączonym i aktywowanym filtrem otrzymasz informacje o wydarzeniach od tego dostawcy. Szczegóły tego obiektu są nieudokumentowane i mogą ulec zmianie. Cała logika komend śledzących netsh jest zaimplementowana w nettrace.dll, który można odwrócić inżynier przy pomocy publicznych symboli Microsoft. W szczególności klasa CInboxCapture ma kod, który określa, czy sterownik został uruchomiony, wiąże go z odpowiednimi interfejsami sieciowymi i uruchamia go. Jeśli uruchomisz filtr filtru przechwytującego tak, jak zrobi to nettrace.dll, dostaniesz zdarzenia przechwytywania pakietów.

Powodzenia.

+0

Cześć, mam zweryfikowane przez uruchomienie „netsh przechwytywanie rozpoczęcia trace = yes”, to kolejny mój program. Teraz odbieram wydarzenia NDIS-PC! Jednak w mojej funkcji EventRecordCallback wywołanie TdhGetEventInformation na przekazanej strukturze PEVENT_RECORD kończy się niepowodzeniem za każdym razem z ERROR_NOT_FOUND ... Piszę o tym wszystkim, ale natknąłem się na limit znaków w komentarzach, co oznacza, że ​​powinienem utworzyć nowy post na ten temat. Dzięki za pomoc! –

+0

Właśnie to wymyśliłem dzięki temu wpisowi: http://social.msdn.microsoft.com/Forums/en-US/etw/thread/473ac036-b4a6-464a-9b49-96e11b88c01c/ –

+0

Więcej pomysłów na temat this (Brak wywołań zwrotnych zdarzeń podczas korzystania z Microsoft-NDIS-PacketCapture Provider) Próbuję użyć tego kawałka kodu https://blogs.msdn.microsoft.com/vancem/2013/03/09/using-traceevent-to-mine -informacje-w-os-zarejestrowanych-etw-dostawcach /. Próbowałeś uruchomić netsh trace na zewnątrz, ale nadal nie masz wyjścia? –

0

Zamiast biegać rozpocząć netsh ślad itp można spróbować to:

net start ndiscap 

Po uruchomieniu netsh ślad itp to zrobi to za ciebie, i myślę, że brakująca część tutaj , że lekki sterownik filtra, który jest wstrzykiwany do ndis w celu przechwytywania pakietów (np. dostawca etw) nie działa i emituje zdarzenia.

Po zakończeniu można go zatrzymać przy użyciu:

net stop ndiscap 
Powiązane problemy