Freigeben über


Überlegungen zur Programmierung von Benachrichtigungs-Treibern

Beachten Sie die folgenden Themen, wenn Sie einen Windows-Filterplattform-Popuptreiber programmieren.

Benutzermodus im Vergleich zum Kernelmodus

Wenn die gewünschte Filterung mithilfe der in die Windows-Filterplattform integrierten Standardfilterfunktion erfolgen kann, sollten unabhängige Softwareanbieter (ISVs) Benutzermodus-Verwaltungsanwendungen schreiben, um das Filtermodul zu konfigurieren, anstatt Ausruftreiber für den Kernelmodus zu schreiben. Ein Kernelmodus-Callout-Treiber sollte nur erstellt werden, wenn Sie Netzwerkdaten auf eine Weise verarbeiten müssen, die mit der integrierten Standardfilterfunktionalität nicht möglich ist. Informationen zum Schreiben einer Windows-Filterplattform-Verwaltungsanwendung im Benutzermodus finden Sie in der Dokumentation zur Windows-Filterplattform im Microsoft Windows SDK.

Auswahl der Filterschicht

Ein Callout-Treiber sollte die Netzwerkdaten auf der höchstmöglichen Filterebene im Netzwerkstapel filtern. Wenn beispielsweise die gewünschte Filteraufgabe auf der Datenstromebene behandelt werden kann, sollte sie nicht auf der Netzwerkebene implementiert werden. Weitere Informationen zu Empfehlungen der Filterebenen, die Ihr Treiber verwenden sollte, um die Kompatibilität mit IPsec in Windows zu gewährleisten, finden Sie unter Developing IPsec-Compatible Callout Drivers.

Blockieren bei eingerichteten Ebenen (Application Layer Enforcement, ALE)

Üblicherweise sollte, wenn im Filtermodul einer der ALE-Flussebenen (FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4 oder FWPM_LAYER_ALE_FLOW_ESTABLISHED_V6) ein Callout hinzugefügt wurde, die ClassifyFn-Callout-Funktion niemals FWP_ACTION_BLOCK für die Aktion zurückgeben. Eine Entscheidung, eine Verbindung zu autorisieren oder abzulehnen, sollte nicht auf einer der eingerichteten Filterebenen des ALE-Flusses getroffen werden. Eine solche Entscheidung sollte immer auf einer der anderen ALE-Filterebenen getroffen werden.

Der einzige gültige Grund für einen solchen Aufruf der classifyFn-Funktion, FWP_ACTION_BLOCK als Aktion zurückzugeben, ist, wenn ein Fehler auftritt, der ein potenzielles Sicherheitsrisiko darstellen könnte, falls die hergestellte Verbindung nicht beendet wird. In diesem Fall schließt das Zurückgeben von FWP_ACTION_BLOCK für die Aktion die Verbindung, um zu verhindern, dass das potenzielle Sicherheitsrisiko ausgenutzt wird.

Ausführungszeit der Rückruffunktion

Da die Filter-Engine in der Regel die Callout-Funktionen eines Callouts bei IRQL = DISPATCH_LEVEL aufruft, stellen Sie sicher, dass diese Funktionen ihre Ausführung so schnell wie möglich abschließen, damit das System effizient läuft. Erweiterte Ausführung bei IRQL = DISPATCH_LEVEL kann sich negativ auf die Gesamtleistung des Systems auswirken.

Einfügen in den Empfangsdatenpfad

Aufrufe sollten die IP-Prüfsummen neu berechnen, bevor sie Paketeinfügungsfunktionen aufrufen, die in den Empfangsdatenpfad einfügen, da die Prüfsumme im ursprünglichen Paket möglicherweise nicht korrekt ist, wenn das Paket aus IP-Paketfragmenten neu zusammengesetzt wird. Es gibt keinen zuverlässigen Mechanismus, der angibt, ob eine Netzpufferliste aus Fragmenten neu zusammengesetzt wird.

Inline-Einfügung von TCP-Paketen aus den Transportschichten

Aufgrund des Sperrverhaltens des TCP-Stacks kann eine Kalldienstfunktion auf der Transportschicht kein neues oder geklontes TCP-Paket aus der classifyFn-Kalldienstfunktion injizieren. Wenn eine Inline-Injektion erwünscht ist, muss der Aufruf einen DPC in die Warteschlange stellen, um die Injektion durchzuführen.

Ausrichtung des ausgehenden IP-Headers

Die MDL, die den IP-Header in einer Netzpufferliste beschreibt (NET_BUFFER_CURRENT_MDL(NET_BUFFER_LIST_FIRST_NB(netBufferList) muss zeigerbündig ausgerichtet sein, wenn eine der Paketeinfügungsfunktionen verwendet wird, um Paketdaten in einen ausgehenden Pfad einzufügen. Da die MDL des IP-Headers eines eingehenden Pakets möglicherweise zeigerausgerichtet ist, muss ein Callout den IP-Header neu erstellen (sofern er nicht bereits ausgerichtet ist), wenn ein eingehendes Paket in einen ausgehenden Pfad eingefügt wird.

Windows Filtering Platform Callout-Treiber