Streamprüfung
Inlinestreamprüfung
Inlinestreammodifizierer können Streamdaten bearbeiten, indem sie einen Teil der angegebenen Daten zulassen oder blockieren, indem sie den Wert des countBytesEnforced-Members der FWPS_STREAM_CALLOUT_IO_PACKET0-Struktur festlegen, wenn sie FWP_ACTION_PERMIT oder FWP_ACTION_BLOCK aus der Notierungsfunktion klassifizierenFn zurückgeben. Sie können auch die Funktion FwpsStreamInjectAsync0 aufrufen, um dem Stream neue Inhalte hinzuzufügen. Dieser Inhalt kann neu sein oder blockierte Daten ersetzen.
Um ein Muster in der Mitte eines angegebenen Segments zu ersetzen (z. B. n Bytes gefolgt von einem Muster von p Bytes gefolgt von m Bytes), führt die Legende die folgenden Schritte aus:
Die klassifizierenFn-Funktion der Legende wird mithilfe von n + p + m Bytes aufgerufen.
Die Legende gibt FWP_ACTION_PERMIT zurück, wobei der CountBytesEnforced-Member auf n festgelegt ist.
Die Funktion klassifizierenFn der Legende wird mit p + m Bytes erneut aufgerufen. WFP ruft klassifizierenFn erneut auf, wenn countBytesEnforced kleiner als der angegebene Betrag ist.
Über die klassifizierenFn-Funktion ruft das Callout die Funktion FwpsStreamInjectAsync0 auf, um das Ersatzmuster p' einzuschleusen. Die Legende gibt dann FWP_ACTION_BLOCK zurück, wobei countBytesEnforced auf p festgelegt ist.
Die Funktion klassifizierenFn der Legende wird mit m bytes erneut aufgerufen.
Die Legende gibt FWP_ACTION_PERMIT zurück, wobei countBytesEnforced auf m festgelegt ist.
Wenn die angegebenen Daten für die Beschriftung nicht ausreichen, um eine Überprüfungsentscheidung zu treffen, kann der streamAction-Member der FWPS_STREAM_CALLOUT_IO_PACKET0-Struktur auf FWPS_STREAM_ACTION_NEED_MORE_DATA und den countBytesRequired-Member auf die minimale Menge festlegen, die WFP sammeln soll, bevor die Daten erneut angezeigt werden. Wenn streamAction festgelegt ist, sollte die Legende FWP_ACTION_NONE aus der klassifizierenFn-Funktion zurückgeben.
WFP kann bis zu 8 MB Streamdaten sammeln, wenn FWPS_STREAM_ACTION_NEED_MORE_DATA festgelegt ist. WFP legt das FWPS_CLASSIFY_OUT_FLAG_BUFFER_LIMIT_REACHED-Flag fest, wenn die Funktion klassifizierenFn der Legende aufgerufen wird und der Pufferraum erschöpft ist. Wenn das letztere Flag festgelegt ist, muss die Legende die angegebenen Daten vollständig akzeptieren. Eine Legende darf nicht FWPS_STREAM_ACTION_NEED_MORE_DATA zurückgeben, wenn das FWPS_CLASSIFY_OUT_FLAG_NO_MORE_DATA-Flag festgelegt ist.
Um ein Streammuster aus einem flachen Puffer zu scannen, stellt WFP die Hilfsprogrammfunktion FwpsCopyStreamDataToBuffer0 bereit, die angegebene Datenstromdaten in einen zusammenhängenden Puffer kopieren kann.
Out-of-Band-Streamprüfung
Für die Out-of-Band-Überprüfung oder -Änderung würde eine Stream-Legende das ähnliche Muster wie die Paketüberprüfungs-Legende aufweisen: Sie würde zuerst alle angegebenen Datenstromsegmente für die verzögerte Verarbeitung klonen und dann diese Segmente blockieren. Die überprüften oder geänderten Daten werden später wieder in den Datenstrom eingefügt. Bei der Out-of-Band-Einschleusung von Daten muss die Legende FWP_ACTION_BLOCK für alle angegebenen Segmente zurückgeben, um die Integrität des resultierenden Datenstroms zu gewährleisten. Ein Out-of-Band-Inspektionsmodul darf nicht willkürlich eine FIN (die keine weiteren Daten des Absenders angibt) in einen ausgehenden Datenstrom einfügen. Wenn das Modul die Verbindung beenden muss, muss seine KlassifizierungFn-Calloutfunktion den streamAction-Member der FWPS_STREAM_CALLOUT_IO_PACKET0-Struktur auf FWPS_STREAM_ACTION_DROP_CONNECTION festlegen.
Hinweis Es ist ein Vertragsverstoß für Legenden, von Out-of-Band zu Inline zu wechseln, und kann zu unerwartetem Verhalten führen. Stellen Sie sicher, dass Out-of-Band-Legenden jedes der angegebenen Kriterien erfüllen.
Da Datenstromdaten als NET_BUFFER_LIST Kette angegeben werden können, stellt FWP die Hilfsprogrammfunktionen FwpsCloneStreamData0 und FwpsDiscardClonedStreamData0 bereit, die auf Netzwerkpufferlistenketten ausgeführt werden.
WFP unterstützt auch die Streamdatendrosselung für die eingehende Richtung. Wenn eine Legende mit der eingehenden Datenrate nicht Schritt halten kann, kann sie FWPS_STREAM_ACTION_DEFER zurückgeben, um den Stream anzuhalten. Der Stream kann dann durch Aufrufen der Funktion FwpsStreamContinue0 "fortgesetzt" werden. Das Zurückstellen eines Datenstroms mit dieser Funktion führt dazu, dass der TCP/IP-Stapel die ACK-Verarbeitung eingehender Daten beendet. Dadurch wird das gleitende TCP-Fenster in Richtung 0 verringert.
Für Out-of-Band-Stream-Inspektions-Legenden darf FwpsStreamContinue0 nicht aufgerufen werden, während die FwpsStreamInjectAsync0-Funktion aufgerufen wird.
Eingefügte Streamdaten werden für die Legende nicht erneut angegeben, aber sie werden für das Streamen von Legenden aus untergeordneten Untergeordneten mit geringerem Gewicht zur Verfügung gestellt.
Das Windows-Filterplattform-Streambearbeitungsbeispiel im Repository für Windows-Treiberbeispiele auf GitHub zeigt, wie Inline- und Out-of-Band-Bearbeitung auf Streamebene ausgeführt wird.
Hinweis Windows Server 2008 und höher unterstützen das Entfernen eines Streamfilters während der folgenden Prozesse nicht:
Die Legende führt eine Out-of-Band-Paketeinschleusung durch.
Die Legende fordert weitere Daten an, indem das streamAction-Element der FWPS_STREAM_CALLOUT_IO_PACKET0-Struktur auf FWPS_STREAM_ACTION_NEED_MORE_DATA festgelegt wird.
Die Legende verschiebt einen Stream, indem der streamAction-Member der FWPS_STREAM_CALLOUT_IO_PACKET0-Struktur auf FWPS_STREAM_ACTION_DEFER festgelegt wird.
Dynamische Streamprüfung
Windows 7 und höher unterstützen dynamische Streamüberprüfungen. Eine dynamische Streamüberprüfung wird für einen vorhandenen Datenfluss ausgeführt, anstatt einen neuen Datenstrom zu erstellen und zu zerreißen. Ein Legendentreiber, der dynamische Datenstromüberprüfungen durchführen kann, sollte das FWP_CALLOUT_FLAG_ALLOW_MID_STREAM_INSPECTION-Flag im Flags-Member der FWPS_CALLOUT1 - oder FWPS_CALLOUT2-Struktur festlegen.
Vermeiden unnötiger Inspektionen
Um Streamüberprüfungen nur für Verbindungen durchzuführen, an denen der Treiber interessiert ist, kann eine Legende das FWP_CALLOUT_FLAG_CONDITIONAL_ON_FLOW-Flag im Flags-Member der FWPS_CALLOUT0-Struktur festlegen. Diese Beschriftung wird bei allen anderen Verbindungen ignoriert. Die Leistung wird verbessert, und der Treiber muss keine unnötigen Zustandsdaten verwalten.
Wasserfallmodell auf Streamebene
Die Streamschicht in WFP folgt einem strengen Wasserfallmodell. Das heißt, eine Beschriftung in dieser Ebene darf ein Datenstromsegment nur überprüfen, wenn die vorherige Legende (falls vorhanden) dies explizit zugelassen hat. Wenn eine Legende ein angegebenes Segment blockiert, wird dieses Segment dauerhaft aus dem Stream entfernt, und es dürfen keine Legenden überprüft werden.
Außerdem:
- Jede Nicht-Überprüfungs-Legende auf der Streamebene muss dem actionType-Member des Parameters klassifizierenOut explizit einen Wert zuweisen, unabhängig davon, welcher Wert zuvor in diesem Parameter festgelegt wurde.
- Das FWPS_RIGHT_ACTION_WRITE-Flag im Rechtemember des parameters klassifizierenOut hat keine Bedeutung in der WFP-Streamebene. Legenden auf dieser Ebene sollten nicht überprüfen, ob dieses Flag vorhanden ist. Legenden können den angegebenen layerData-Parameter unabhängig vom Wert von klassifizierenOut-rights> verarbeiten.