Overwegingen voor het programmeren van aanroepstuurprogramma's
Houd rekening met de volgende onderwerpen wanneer u een stuurprogramma voor windows-filteringsplatform programmeert.
gebruikersmodus versus kernelmodus
Als de gewenste filtering kan worden gedaan met behulp van de standaardfilterfunctionaliteit die is ingebouwd in het Windows-filterplatform, moeten onafhankelijke softwareleveranciers (ISV's) gebruikersmodemanagementtoepassingen schrijven om de filterengine te configureren in plaats van callout-stuurprogramma's voor de kernelmodus te schrijven. Een callout-driver in de kernelmodus mag alleen worden geschreven wanneer u de netwerkgegevens moet verwerken op een manier die niet kan worden afgehandeld door de standaard, ingebouwde filterfunctionaliteit. Zie de documentatie Windows Filtering Platform documentatie in de Microsoft Windows SDK voor informatie over het schrijven van een beheertoepassing voor Windows-filterplatforms in de gebruikersmodus.
Keuze van filterlaag
Een uitroepbesturingsprogramma moet de netwerkgegevens filteren op de hoogst mogelijke filterlaag in de netwerkstack. Als de gewenste filtertaak bijvoorbeeld kan worden verwerkt op de stroomlaag, mag deze niet worden geïmplementeerd op de netwerklaag. Zie Ontwikkelen van IPsec-Compatible Stuurprogramma'svoor meer informatie over aanbevelingen van de filterlagen die uw stuurprogramma moet gebruiken om compatibiliteit met IPsec in Windows te garanderen.
Blokkeren bij de ALE-stroom (Application Layer Enforcement) bestaande lagen
Als een callout aan de filterengine is toegevoegd op een van de ALE-stroom gevestigde filterlagen (FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4 of FWPM_LAYER_ALE_FLOW_ESTABLISHED_V6), moet de classificeerFn callout functie nooit FWP_ACTION_BLOCK retourneren voor de actie. Er mag geen beslissing worden genomen om een verbinding te autoriseren of af te wijzen op een van de bestaande filterlagen van de ALE-stroom. Een dergelijke beslissing moet altijd worden genomen in een van de andere ALE-filterlagen.
De enige geldige reden voor een dergelijke classificeerFn bijschriftfunctie om FWP_ACTION_BLOCK voor de actie te retourneren, is wanneer een fout optreedt die een potentieel beveiligingsrisico vormt als de tot stand gebrachte verbinding niet wordt beëindigd. In dit geval sluit het retourneren van FWP_ACTION_BLOCK voor de actie de verbinding om te voorkomen dat het potentiële beveiligingsrisico wordt misbruikt.
Uitvoertijd van de Callout-functie
Omdat de filterengine doorgaans de callout-functies van een callout aanroept bij IRQL = DISPATCH_LEVEL, is het belangrijk ervoor te zorgen dat deze functies hun uitvoering zo snel en efficiënt mogelijk afronden om het systeem efficiënt te laten functioneren. Uitgebreide uitvoering bij IRQL = DISPATCH_LEVEL kan de algehele prestaties van het systeem nadelig beïnvloeden.
Injecteren in het gegevenspad ontvangen
Oproepen moeten IP-controlesommen opnieuw berekenen voordat ze functies voor pakketinjectie aanroepen, die in het ontvangende gegevenspad injecteren, omdat de controlesom in het oorspronkelijke pakket mogelijk niet juist is wanneer het pakket opnieuw wordt samengevoegd vanuit IP-pakketfragmenten. Er is geen betrouwbaar mechanisme dat aangeeft of een netbufferlijst opnieuw wordtassembleerd uit fragmenten.
Inline-injectie van TCP-pakket vanuit transportlagen
Vanwege het vergrendelingsgedrag van de TCP-stack kan een bijschrift op de transportlaag geen nieuw of gekloond TCP-pakket van de classificeerFn bijschriftfunctie injecteren. Als inline-injectie gewenst is, moet de oproep een DPC in de wachtrij plaatsen om de injectie uit te voeren.
Uitlijning van uitgaande IP-header
De MDL die de IP-header in een netbufferlijst beschrijft (NET_BUFFER_CURRENT_MDL(NET_BUFFER_LIST_FIRST_NB(netBufferList))) moet pointer-gealigneerd zijn wanneer een van de functies voor pakketinjectie wordt gebruikt om pakketgegevens in een uitgaand pad te injecteren. Omdat de MDL van de IP-header van een binnenkomend pakket pointer-uitgelijnd kan zijn, moet een callout de IP-header opnieuw opbouwen (als deze nog niet is uitgelijnd) wanneer een binnenkomend pakket in een uitgaand pad wordt geïnjecteerd.