2012-02-27 3 views
8

La domanda più grande è come consumare gli eventi di stack di rete ETW in tempo reale in generale, ma sono particolarmente interessato al provider Microsoft-Windows-NDIS-PacketCapture. Tutti gli altri provider di stack di rete funzionano parzialmente, ma NDIS-PacketCapture (NDIS-PC) non funziona affatto, quindi questa è probabilmente la domanda più semplice che posso porre qui.Come consumare eventi ETW in tempo reale dal fornitore Microsoft-Windows-NDIS-PacketCapture?

Sto utilizzando il seguente codice come la base e modificato molto poco per farlo funzionare in tempo reale: http://msdn.microsoft.com/en-us/library/windows/desktop/ee441325(v=vs.85).aspx

modifiche che ho apportato sono:

  1. chiamata StartTrace per avviare la sessione NDIS-PC prima di fare qualsiasi cosa altro. Nella proprietà struct EVENT_TRACE_PROPERTIES, impostazione LogFileMode = EVENT_TRACE_REAL_TIME_MODE, LogFileNameOffset = 0, e Wnode.Guid = qualcosa di GUID casuale che ho inventato.

  2. stato Calling = EnableTraceEx2 (hSession, & Current_Guid, EVENT_CONTROL_CODE_ENABLE_PROVIDER, TRACE_LEVEL_VERBOSE, 0, 0, 0, NULL); dove hSession è la sessione ha iniziato a utilizzare StartTrace e e Current_Guid è

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

  3. quindi chiamando OpenTrace con LoggerName = qualche stringa ampia, LogFileName = NULL, e LogFileMode = EVENT_TRACE_REAL_TIME_MODE;

  4. Infine chiamare ProcessTrace sull'impugnatura di traccia appena aperta precedente.

  5. Ancora una volta, lasciando tutto il resto lo stesso come previsto nell'esempio MSDN

Utilizzando il codice identico con una singola modifica del provider a qualsiasi altra cosa, ad esempio Microsoft-Windows-Winsock-AFD o Microsoft-Windows-TCPIP mi chiama al numero nel callback del record che avevo definito (Tuttavia, non sono ancora in grado di recuperare le proprietà ma non approfondirò ulteriormente per mantenere questo problema il più semplice possibile) . Quando utilizzo NDIS-PC, ottengo 0 richiami. Ho provato a lavare manualmente utilizzando ControlTrace senza alcun successo. Ho anche provato a definire "EventCallback" invece di "EventRecordCallback" senza successo.

Ho esaminato TUTTE le strutture dati coinvolte in questo processo e confrontato tra ciascun fornitore e sembravano tutti uguali e corretti. Ho esaminato tutti i valori restituiti da funzioni e strutture dati restituite e hanno anche lo stesso aspetto tra i provider che ho provato.

Ho guardato le proprietà della sessione chiamando "-ets "" logman" La mia sessione di analisi 04 e sembra identico per NDIS-PC e TCPIP:

C: \ windows \ system32> logman "La mia sessione di analisi 04" -ets

Nome: La mia sessione di analisi 04 Stato:
Esecuzione Root Path:% systemdrive% \ PerfLogs \ Segmento Admin:
Spento Orari: On

Nome: La mia sessione di analisi 04 \ M y sessione di analisi 04 Tipo:
Trace Aggiungi: Spento circolare: Spento sovrascrittura:
Off Dimensione buffer: 64 Buffer perduto: 0 Buffer scritto: 0 Buffer Timer Flush: 1 Orologio Tipo: Modalità Performance File: in tempo reale

Provider: Nome: Microsoft-Windows-NDIS-PacketCapture Provider Guid: {2ED6006E-4729-4609-B423-3EE7BCD678EF} Livello:
5 (win: 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: Configuration, ut: Global, ut: Dropped, ut: PiiPresent, ut: Packet, ut: Indirizzo, 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,0x8000000,0x10000000, 0x20000000,0x400000000000,0x800000000000,0x2000000000000,0x4000000000000,0x80000 00000000,0x10000000000000,0x20000000000000,0x40000000000000,0x80000000000000,0x1 00000000000000,0x200000000000000,0x400000000000000,0x800000000000000,0x100000000 0000000 , 0x2000000000000000,0x4000000000000000) Proprietà: 0 Tipo filtro: 0

Il comando è stato completato correttamente.

Ho anche provato ad avviare manualmente le sessioni utilizzando logman e semplicemente aprendolo nel codice per elaborare ma non ha funzionato neanche per me. Ho anche provato a scrivere su un file ETL e anche questo non funziona. Ci sono molte altre cose che ho provato ma non funziona nulla.

Ho divorato tutto sugli Internet che avevano a che fare con il consumo di ETW in tempo reale (MSDN, ricerca Google, StackOverflow, ecc.) E I non ho visto un singolo esempio completo di consumi di eventi ETW in tempo reale. Tutti gli esempi mostrano il consumo di eventi da un file ETL o l'esportazione di eventi registrati in un file ETL, quindi dice semplicemente di apportare alcune modifiche ai parametri per ottenere il consumo in tempo reale. Credo che le modifiche al codice che ho sintetizzato sopra riflettano tali cambiamenti.

Sono su Win7 Ultimate utilizzando VS2010 SP1 creando l'app per console a 32 bit. Ho anche provato a creare app a 64 bit senza miglioramenti.

I due post seguenti sono pertinenti ma non hanno fatto alcuna differenza per me quando ho provato/eseguito. In modalità in tempo reale, il codice copia il nome della sessione alla fine della struttura della proprietà e l'offset del file di registro deve essere uguale a 0.Io non credo di avere problemi di allineamento, come tutti gli altri fornitori funzionano bene:

Windows ETW: Kernel consumer receives no EventCallback or BufferCallback events

Mi sento come se mi manca qualcosa di piccolo e banale e questo dovrebbe solo lavoro. Apprezzerei qualsiasi aiuto.

risposta

8

Se si esamina ciò che i comandi "netsh trace" fanno internamente, si vedrà che collegano un driver di filtro leggero NDIS alle varie interfacce di rete. Solo con questo filtro allegato e attivato otterrai eventi da questo provider. I dettagli di questa struttura sono privi di documenti e soggetti a modifiche. Tutta la logica dei comandi di traccia netsh è implementata in nettrace.dll che è possibile decodificare con l'assistenza dei simboli pubblici di Microsoft. In particolare, la classe CInboxCapture ha un codice che determina se il driver è stato avviato, lo associa a interfacce di rete appropriate e lo avvia. Se avvii il driver del filtro di acquisizione come fa nettrace.dll, otterrai gli eventi di cattura dei pacchetti.

Buona fortuna.

+0

Ciao, ho verificato questo eseguendo "cattura inizio traccia netsh = yes" quindi eseguire il mio programma. Ora sto ricevendo eventi NDIS-PC! Tuttavia, nella mia funzione EventRecordCallback, la chiamata TdhGetEventInformation sulla struttura PEVENT_RECORD passata non riesce ogni volta con ERROR_NOT_FOUND ... Sono stato scritto tutto, ma mi sono imbattuto nel limite dei caratteri sui commenti, il che significa che dovrei creare un nuovo post su di esso. Grazie per l'aiuto! –

+0

Ho appena capito tutto questo grazie a questo post: http://social.msdn.microsoft.com/Forums/en-US/etw/thread/473ac036-b4a6-464a-9b49-96e11b88c01c/ –

+0

Altre idee su questo (nessuna richiamata di eventi quando si utilizza Microsoft-NDIS-PacketCapture Provider) Sto cercando di utilizzare questo pezzo di codice https://blogs.msdn.microsoft.com/vancem/2013/03/09/using-traceevent-to-mine -Informazioni-in-os-registrati-ETW-fornitori /. Provato a iniziare la traccia netsh esternamente ma ancora nessun output? –

0

Ecco un commentato C++ applicazione di esempio che dimostra le sessioni ETW simultanea in tempo reale per l'acquisizione di pacchetti e gli eventi del kernel.

https://github.com/packetzero/etwrealtime

0

Invece di correre inizio traccia netsh ecc si potrebbe provare questo:

net start ndiscap 

Durante l'esecuzione traccia netsh ecc lo farà questo per voi, e penso che sia la parte mancante qui , che il driver di filtro leggero che viene iniettato in ndis per acquisire pacchetti (cioè il provider etw) non è in esecuzione e che emette eventi.

Quando hai finito puoi fermarla con:

net stop ndiscap