Die größere Frage ist, wie Echtzeit-ETW-Netzwerkstack-Ereignisse im Allgemeinen zu konsumieren sind, aber ich bin besonders an dem Microsoft-Windows-NDIS-PacketCapture-Anbieter interessiert. Alle anderen Netzwerk-Stack-Provider funktionieren teilweise, aber das NDIS-PacketCapture (NDIS-PC) funktioniert überhaupt nicht. Das ist wahrscheinlich die einfachste Frage, die ich hier stellen kann.
Ich benutze den folgenden Code als Basis und ändere sehr wenig, damit er in Echtzeit funktioniert: Ссылка
Die Änderungen, die ich vorgenommen habe, sind:
Rufen Sie StartTrace auf, um die NDIS-PC-Sitzung zu starten, bevor Sie etwas tun sonst. Setzen Sie in der Eigenschaft struct EVENT_TRACE_PROPERTIES die Einstellung LogFileMode = EVENT_TRACE_REAL_TIME_MODE, LogFileNameOffset = 0, und Wnode.Guid = etwas zufälliges GUID, das ich erfunden habe.
Aufruf von status = EnableTraceEx2 (hSession, & amp; Current_Guid, EVENT_CONTROL_CODE_ENABLE_PROVIDER, TRACE_LEVEL_VERBOSE, 0, 0, 0, NULL); wo hSession ist die Sitzung gestartet mit StartTrace und und Current_Guid ist
{0x2ED6006E, 0x4729,0x4609, {0xB4,0x23,0x3E, 0xE7,0xBC, 0xD6,0x78,0xEF}};
Dann wird OpenTrace mit LoggerName = eine breite Zeichenfolge aufgerufen, LogFileName = NULL und LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
Rufen Sie abschließend ProcessTrace auf dem Trace-Handle auf, das gerade geöffnet wurde oben.
Erneut alles andere wie im MSDN-Beispiel
Mit dem gleichen Code mit einer einzigen Änderung des Providers zu etwas anderem wie Microsoft-Windows-Winsock-AFD oder Microsoft-Windows-TCPIP ruft mich Anrufe in der Recall-Callback, den ich definiert habe (Ich kann die Eigenschaften immer noch nicht abrufen, aber ich werde noch nicht weiter darauf eingehen, um dieses Problem so einfach wie möglich zu halten). Wenn ich NDIS-PC benutze, erhalte ich 0 Rückrufe. Ich habe versucht, manuell mit ControlTrace ohne Erfolg zu entleeren. Ich habe auch versucht, "EventCallback" anstelle von "EventRecordCallback" ohne Erfolg zu definieren.
Ich habe ALLE an diesem Prozess beteiligten Datenstrukturen betrachtet und zwischen den einzelnen Anbietern verglichen und sie sahen alle korrekt und gleich aus. Ich habe alle Rückgabewerte von Funktionen und zurückgegebenen Datenstrukturen betrachtet und sie sehen auch zwischen den Anbietern, die ich ausprobiert habe, gleich aus.
Ich habe die Sitzungseigenschaften durch Aufrufen von "logman" Meine Trace-Sitzung 04 "-ets" angesehen und es sieht für NDIS-PC und TCPIP identisch aus:
C: \ windows \ system32 & gt; logman "Meine Trace-Sitzung 04" -
Name: Meine Trace-Sitzung 04 Status:
Laufender Root-Pfad:% systemdrive% \ PerfLogs \ Admin-Segment:
Aus Zeitpläne: EinName: Meine Trace-Sitzung 04 \ Meine Trace-Sitzung 04 Typ:
Trace Append: Aus Rundschreiben: Aus Überschreiben:
Aus Puffergröße: 64 Puffer verloren: 0 Puffer geschrieben: 0 Puffer Flush Timer: 1 Uhr Typ: Leistung Datei-Modus: EchtzeitAnbieter: Name: Microsoft-Windows-NDIS-PacketCapture Anbieter Guid: {2ED6006E-4729-4609-B423-3EE7BCD678EF} Stufe:
5 (Gewinn: Verbose) KeywordsAlle: 0x0 KeywordsAny:
0xffffffffffffffff (Ethernet802.3, WirelessWAN, Tunnel, Nativ e802.11, PacketStart, PacketEnd, UT: SendPath, UT: ReceivePath, UT: L3ConnectPath, UT: L2C onnectPath, ut: ClosePath, ut: Authentifizierung, ut: Konfiguration, ut: Global, ut: Gelöscht, ut: PiiPresent, ut: Paket, ut: Adresse, ut: StdTemplateHint, ut: StateTransition, Gewinn: Res ponseTime, Microsoft-Windows-NDIS-PaketCapture / 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,0x400000000000000,0x80000 00000000,0x10000000000000,0x20000000000000,0x40000000000000,0x80000000000000,0x1 00000000000000,0x200000000000000,0x400000000000000,0x800000000000000,0x100000000 0000000,0x2000000000000000,0x4000000000000000) Eigenschaften: 0 Filtertyp: 0Der Befehl wurde erfolgreich ausgeführt.
Ich habe auch versucht, die Sitzungen manuell zu starten, indem ich logman benutze und es einfach im Code öffne, um zu verarbeiten, aber das hat auch nicht für mich funktioniert. Ich habe auch versucht, nur in eine ETL-Datei zu schreiben, und das funktioniert auch nicht. Es gibt viel mehr Dinge, die ich ausprobiert habe, aber nichts funktioniert.
Ich habe alles im Internet verschlungen, was mit Echtzeit-ETW-Verbrauch (MSDN, Google-Suche, Stackoverflow usw.) zu tun hatte, und ich habe kein einziges vollständiges Beispiel eines Echtzeit-ETW-Ereignisses gesehen Verbrauch .Alle Beispiele zeigen den Ereignisverbrauch aus einer ETL-Datei oder das Exportieren von aufgezeichneten Ereignissen in eine ETL-Datei. Dann werden nur einige Parameteränderungen vorgenommen, damit die Echtzeit-Verbrauchsfunktion funktioniert. Ich glaube, dass die Codeänderungen, die ich oben zusammengefasst habe, diese Änderungen widerspiegeln.
Ich bin auf Win7 Ultimate mit VS2010 SP1 erstellen 32-Bit-Konsolen-App. Ich habe auch versucht, 64bit App ohne Verbesserung zu erstellen.
Follwing zwei Beiträge sind relevant, aber machte keinen Unterschied für mich, wenn ich versuchte / durchgesetzt. Im Echtzeitmodus kopiert der Code den Sitzungsnamen an das Ende der Eigenschaftsstruktur, und der Offset der Protokolldatei muss auf jeden Fall 0 sein. Ich glaube nicht, dass ich irgendwelche Ausrichtungsprobleme habe, da alle anderen Anbieter gut funktionieren:
Windows ETW: Kernel-Consumer empfängt kein EventCallback oder BufferCallback-Ereignisse Windows ETW: StartTrace fehlgeschlagen mit Fehler 87 (ERROR_INVALID_PARAMETER)
Ich habe das Gefühl, dass mir etwas Kleines und Triviales fehlt und das sollte nur funktionieren. Ich würde mich über jede Hilfe freuen.
Wenn Sie sich ansehen, was die "netsh trace" -Befehle intern tun, sehen Sie, dass sie einen NDIS-Filtertreiber an die verschiedenen Netzwerkschnittstellen anhängen. Nur wenn dieser Filter angehängt und aktiviert ist, erhalten Sie Ereignisse von diesem Anbieter. Die Details dieser Einrichtung sind nicht dokumentiert und können sich ändern. Die gesamte Logik der Netsh-Trace-Befehle ist in der nettrace.dll implementiert, die Sie mit Hilfe der öffentlichen Symbole von Microsoft zurückentwickeln können. Insbesondere weist die Klasse CInboxCapture einen Code auf, der bestimmt, ob der Treiber gestartet wurde, bindet ihn an geeignete Netzwerkschnittstellen und startet ihn. Wenn Sie den Capturing-Filtertreiber wie nettrace.dll starten, erhalten Sie Ihre Paketerfassungsereignisse.
Viel Glück.
Anstatt netsh trace start usw. auszuführen, könntest du Folgendes versuchen:
%Vor%Wenn Sie netsh trace usw. ausführen, wird dies für Sie tun, und ich denke, das ist der fehlende Teil hier, dass der leichte Filtertreiber, der in ndis injiziert wird, um Pakete zu erfassen (dh der etw Provider), nicht läuft und Ereignisse ausgibt .
Wenn Sie fertig sind, können Sie es stoppen mit:
%Vor%Tags und Links windows network-programming etw