Netværksprogrammering - Sådan forbruges real-time ETW-begivenheder fra Microsoft-Windows-NDIS-PacketCapture-udbyderen?

Indlæg af Hanne Mølgaard Plasc

Problem



Det største spørgsmål er, hvordan man bruger realtids ETW-netværksstakkhændelser generelt, men jeg er især interesseret i Microsoft-Windows-NDIS-PacketCapture-udbyderen . Alle andre netværksstakkeleverandører arbejder delvist, men NDIS -PacketCapture (NDIS-PC) virker ikke overhovedet, så dette er nok det enkleste spørgsmål, jeg kan spørge her.


Jeg bruger følgende kode som base og ændret meget lidt, så den kan fungere i realtid:
http://msdn.microsoft.com/en-us/library/windows/desktop/ee441325(v=vs.85).aspx[3]


Ændringer jeg har lavet er:



  1. Ring StartTrace for at starte NDIS-PC-sessionen, før du gør noget
    andet. I ejendomsstrukturen EVENT\_TRACE\_PROPERTIES, indstilles
    LogFileMode=EVENT\_TRACE\_REAL\_TIME\_MODE, LogFileNameOffset=0,
    og Wnode.Guid=noget tilfældigt GUID, jeg lavede op.

  2. Opkaldsstatus=EnableTraceEx2 (hSession, &Current\_Guid,
    EVENT\_CONTROL\_CODE\_ENABLE\_PROVIDER, TRACE\_LEVEL\_VERBOSE, 0, 0, 0,
        NUL); hvor hSession er sessionen startet med StartTrace og
        og Current\_Guid er


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

  3. Så kalder OpenTrace med LoggerName=nogle brede strenge,
    LogFileName=NULL og LogFileMode=EVENT\_TRACE\_REAL\_TIME\_MODE;

  4. Ring til ProcessTrace på det sporhåndtag, der lige blev åbnet
    over.

  5. Igen forlader alt andet det samme som i MSDN-eksemplet



Brug den samme kode med en enkelt ændring af udbyderen til noget andet som Microsoft-Windows-Winsock-AFD eller Microsoft-Windows-TCPIP får mig til at ringe til i rekord tilbagekaldelsen Jeg er defineret (Jeg kan dog stadig ikke hente egenskaberne, men jeg vil ikke dvæle mere endnu for at holde denne prob så enkel som jeg kan). Når jeg bruger NDIS-PC, får jeg 0 tilbagekald. Jeg ' Jeg har forsøgt at skylle manuelt med ControlTrace uden succes. Jeg har også forsøgt at definere 'EventCallback' i stedet for 'EventRecordCallback' uden succes.


Jeg har set på alle datastrukturer, der er involveret i denne proces, og sammenlignet mellem hver udbyder, og de så alle rigtigt ud. De har set alle returværdier fra funktioner og returnerede datastrukturer, og de ser også ens ud mellem udbyderne I 'har prøvet.


Jeg har set på sessionsegenskaberne ved at kalde 'logman' My Trace Session 04 '-ets', og det ser ud til at være identisk med NDIS-PC og TCPIP:



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

  
  Navn: Min Trace Session 04 Status:

  Running Root Path:\% systemdrive\% \ PerfLogs \ Admin Segment:

  Off Schedules: On

  
  Navn: Min sporingssession 04 \ Min sporingssession 04 Type:

  Trace Append: Off Circular: Off Overskriv:

  Off Buffer Størrelse: 64 Buffere tabt: 0 Buffere skrevet:
  0 Buffer Flush Timer: 1 Urtype: Ydelse Fil Mode:
  Realtid

  
  Udbyder: Navn: Microsoft-Windows-NDIS-PacketCapture
  Leverandørvejledning: {2ED6006E-4729-4609-B423-3EE7BCD678EF} Niveau:

  5 (vinde: Verbose) NøgleordAlle: 0x0 NøgleordAny:

  0xffffffffffffffff (Ethernet802.3, WirelessWAN, Tunnel, Nativ
  e802.11, PacketStart, PacketEnd, ut: SendPath, ut: ReceivePath, ut: L3ConnectPath, ut: L2C
  onnectPath, ut: ClosePath, ut: Authentication, ut: Konfiguration, ut: Global, ut: Faldt,
  ut: PiiPresent, ut: Packet, ut: Adresse, ut: StdTemplateHint, ut: StateTransition, vinde: 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) Egenskaber: 0
  Filter Type: 0

  
  Kommandoen blev gennemført med succes.



Jeg har også forsøgt at starte sessionerne manuelt ved hjælp af logman og bare åbne den i kode for at behandle, men det fungerede heller ikke for mig. Jeg har også forsøgt at skrive til en ETL-fil, og det virker heller ikke. Der er mange flere ting jeg har prøvet, men intet virker.


Jeg har fortæret alt på internettet, der havde med ETW-forbrug i realtid (MSDN, Google-søgning, Stackoverflow osv.) Og jeg haven ikke set et enkelt komplet eksempel på real-time ETW-begivenhedskonsumtioner . Alle eksempler viser begivenhedsforbruget fra en ETL-fil eller eksporterer optagede hændelser til en ETL-fil, og siger bare at foretage et par parameterændringer for at få realtidsforbrug til at fungere. Jeg mener, at de kodeændringer jeg opsummerede ovenfor afspejler disse ændringer.


Jeg er på Win7 Ultimate ved hjælp af VS2010 SP1 skabe 32bit konsol app. Jeg har også forsøgt at skabe 64bit app uden forbedring.


Follwing to stillinger er relevante, men gjorde ikke nogen forskel for mig, da jeg prøvede/håndhævede. I realtidstilstand kopierer koden sessionnavnet til slutningen af ​​ejendommen struct og logfil-offset skal alligevel være 0. tror ikke jeg har nogen justeringsproblemer, da alle andre udbydere fungerer fint:


Windows ETW: Kernel forbruger modtager ingen EventCallback eller BufferCallback events
Windows ETW: StartTrace mangler fejl 87 (ERROR\_INVALID\_PARAMETER)


Jeg føler, at jeg mangler noget lille og trivielt, og det skal bare arbejde. Jeg værdsætter nogen hjælp.

Bedste reference


Hvis du ser på, hvad 'netsh trace' -kommandoerne gør internt, ser du, at de vedhæfter en NDIS-letvægtsfilterdriver til de forskellige netværksgrænseflader. Kun med dette filter vedhæftet og aktiveret får du hændelser fra denne udbyder. er ikke-dokumenterede og kan ændres. Alle logikerne i netsh-sporkommandoerne er implementeret i netrace.dll, som du kan omdanne med hjælp fra Microsofts offentlige symboler. Specifikt har CInboxCapture-klassen en kode, der bestemmer om driveren er startet, binder den til passende netværksgrænseflader og starter den. Hvis du starter filfangdriveren, hvordan nettrace.dll gør, får du dine pakkeopsamlingshændelser.


Held og lykke.

Andre referencer 1


For hvad det er værd, fandt jeg et eksempel på en realtid ETW forbruger (eksemplet er for IIS webserver): http://blogs.iis.net/eokim/archive/2009/05/15/consume -iis-ETW-tracing.aspx [6]

Andre referencer 2


Her er en kommentar til c ++ eksempel applikation, der demonstrerer samtidige real-time ETW-sessioner til pakkefangst og kernehændelser.


https://github.com/packetzero/etwrealtime[7]

Andre referencer 3


I stedet for at køre netsh spor starter osv. Kan du prøve dette:


net start ndiscap


Når du kører netsh spor osv., Vil det gøre det for dig, og jeg tror, ​​at det er den manglende del her, at den lette filterdriver, der indsprøjtes i ndis for at indfange pakker (dvs. etw-udbyderen) ikke kører og udsender hændelser.


Når du er færdig kan du stoppe med at bruge:


net stop ndiscap