Verwenden der Schicht 2-Filterung
Die Filterung der Ebene 2 wird in Windows 8 und höheren Versionen von Windows unterstützt.
Dieses WFP-Feature ermöglicht das Filtern nach Feldern des MAC-Headers der Ebene 2. Diese Ebenen werden paketbezogen für alle Pakete aufgerufen, die vom Hostcomputer gesendet oder empfangen werden. Die Ebenen werden vor der Paketassembly im eingehenden Pfad und nach der Paketfragmentierung im ausgehenden Pfad aufgerufen. Auf diese Ebenen wird über einen NDIS-Treiber für leichte Filter (LWF) zugegriffen.
Hinweis
Eine Legende sollte keine Pakete auf einer Ebene einfügen, wenn sie nicht bereits über einen entsprechenden Filter auf dieser Ebene verfügt. Die Einschleusung der NET_BUFFER_LIST Strukturen sollte mit der Filterzugabe und -entfernung koordiniert werden, sodass die Einspritzung nur durchgeführt wird, wenn der Filter in der entsprechenden Schicht vorhanden ist. Darüber hinaus sollten Anbieter keine Filter entfernen, die zu anderen Anbietern gehören.
Dieser Abschnitt schließt folgende Themen ein:
- Einfügen von MAC-Frames
- Klassifizieren verketteter Netzwerkpufferlisten
- WFP Layer 2 Ebenen und Felder
Einfügen von MAC-Frames
Ein Rückruftreiber ruft die FwpsInjectMacReceiveAsync0-Funktion auf, um einen zuvor absorbierten MAC-Frame (oder einen Klon des Frames) wieder in den eingehenden Datenpfad der Ebene 2 zurückzuwerfen, von dem er abgefangen wurde, oder um einen erfundenen MAC-Frame in den eingehenden Datenpfad einzuschleusen.
Ein Rückruftreiber ruft die FwpsInjectMacSendAsync0-Funktion auf, um einen zuvor absorbierten MAC-Frame (oder einen Klon des Frames) wieder in den ausgehenden Datenpfad der Ebene 2 zurückzuwerfen, von dem er abgefangen wurde, oder um einen erfundenen MAC-Frame in den ausgehenden Datenpfad einzuschleusen.
Der netBufferLists-Parameter kann eine NET_BUFFER_LIST Kette sein. Die Vervollständigungsfunktion kann jedoch jeweils mehrmals aufgerufen werden, um ein Segment (oder ein einzelnes NET_BUFFER_LIST) der Kette abzuschließen.
Eingefügte Frames können erneut klassifiziert werden, wenn die Pakete demselben Filter entsprechen wie ursprünglich klassifiziert. Daher müssen wie bei Legenden auf IP-Ebenen auch Legenden der Ebene 2 vor unendlicher Paketüberprüfung geschützt werden, indem sie FwpsQueryPacketInjectionState0 aufrufen.
Außerdem müssen Sie über Legenden auf der Ebene verfügen, auf der Sie einfügen. Andernfalls wird Ihre eingefügte NET_BUFFER_LIST nicht mit Ihrer Vervollständigungsfunktion abgeschlossen, und die NET_BUFFER_LIST geht weiter nach oben. In diesem Fall ist das Verhalten nicht definiert, da NDIS versucht, die eingefügte NET_BUFFER_LIST an die nächste Komponente im Stapel zu übergeben.
Das element NET_BUFFER_LISTStatus enthält das status Ergebnis der Stapeleinschleusung. Das status Ergebnis der Stapeleinschleusung ist das status, das der Stapel in den NET_BUFFER_LIST einfügt, nachdem eine WFP-Einschleusungsfunktion STATUS_SUCCESS zurückgibt. Sie sollten das makro NT_SUCCESS verwenden, um die status der Stapeleinschleusung im Statuselement zu überprüfen. Wenn der StatuswertSTATUS_SUCCESS ist, war die Einschleusung ohne weitere Informationen erfolgreich. Statusmemberwerte, die größer als STATUS_SUCCESS bedeuten, dass die Einschleusung erfolgreich war, aber es gibt möglicherweise weitere Informationen zur Injektion, die berücksichtigt werden sollten. Statusmemberwerte, die kleiner als STATUS_SUCCESS sind, bedeuten, dass die Einschleusung aus dem im Statuselement angegebenen Grund fehlgeschlagen ist.
Klassifizieren verketteter Netzwerkpufferlisten
Standardmäßig kann ein Legendentreiber Netzwerkpufferlisten nur einzeln klassifizieren. Ein Legendentreiber kann jedoch NET_BUFFER_LIST Ketten für eine bessere Leistung klassifizieren, wenn er beides ausführt:
- Gibt das FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY-Flag im Flags-Element der FWPS_CALLOUT2-Struktur an.
- Registriert eine klassifizierenFn2-Funktion , die NET_BUFFER_LIST Ketten klassifizieren kann.
Warnung
Wenn ein Legendentreiber jedoch das flag FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY festgelegt hat, kann er die folgenden Funktionen nicht verwenden, um NET_BUFFER_LISTs zu ändern.
- FwpsReferenceNetBufferList0
- FwpsDereferenceNetBufferList0
- FwpsAllocateCloneNetBufferList0
- FwpsFreeCloneNetBufferList0
Mit diesem Flagsatz gibt FwpsAllocateCloneNetBufferList0 immer einen INVALID_PARAMETER Fehler zurück. Dies kann unerwartet dazu führen, dass ein 3-Drittanbieter-Callouttreiber die Referenzanzahl von NET_BUFFER_LISTs nicht verwaltet, wodurch Sende- und Empfangsvorgänge beendet werden.
WFP Layer 2 Ebenen und Felder
Zu den Laufzeitfilterungsebenenbezeichnern für die Filterung virtueller Switches gehören:
FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET
FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET
FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE
FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE
Zu den Datenfeldbezeichnern für die Filterung virtueller Switches gehören:
FWPS_FIELDS_INBOUND_MAC_FRAME_ETHERNET
FWPS_FIELDS_OUTBOUND_MAC_FRAME_ETHERNET