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:
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.
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}};
quindi chiamando OpenTrace con LoggerName = qualche stringa ampia, LogFileName = NULL, e LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
Infine chiamare ProcessTrace sull'impugnatura di traccia appena aperta precedente.
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: OnNome: 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 realeProvider: 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: 0Il 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.
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! –
Ho appena capito tutto questo grazie a questo post: http://social.msdn.microsoft.com/Forums/en-US/etw/thread/473ac036-b4a6-464a-9b49-96e11b88c01c/ –
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? –