Considerazioni sulla programmazione dei driver di callout
Quando si programma un driver callout di Windows Filtering Platform, tenere presenti gli argomenti seguenti.
modalità utente contro modalità kernel
Se il filtro desiderato può essere eseguito usando la funzionalità di filtro standard integrata in Windows Filtering Platform, i fornitori di software indipendenti (ISV) devono scrivere applicazioni di gestione in modalità utente per configurare il motore di filtro invece di scrivere driver callout in modalità kernel. Un driver callout in modalità kernel deve essere scritto solo quando è necessario elaborare i dati di rete in modi che non possono essere gestiti dalla funzionalità di filtro predefinita standard. Per informazioni su come scrivere un'applicazione di gestione della piattaforma Windows Filtering in modalità utente, vedere la documentazione Windows Filtering Platform nel Microsoft Windows SDK.
Scelta del livello di filtro
Un driver callout deve filtrare i dati di rete al livello di filtro più alto possibile nello stack di rete. Ad esempio, se l'attività di filtro desiderata può essere gestita a livello di flusso, non deve essere implementata a livello di rete. Per ulteriori informazioni sui consigli relativi ai livelli di filtro che il driver dovrebbe utilizzare per garantire la compatibilità con IPsec in Windows, consultare Sviluppo di callout driver IPsec-Compatible.
Blocco dei flussi nei livelli stabiliti dell'Application Layer Enforcement (ALE)
In genere, se un callout è stato aggiunto al motore di filtro in uno dei flusso ALE stabilito livelli di filtro (FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4 o FWPM_LAYER_ALE_FLOW_ESTABLISHED_V6), il relativo classificareFn funzione callout non deve mai restituire FWP_ACTION_BLOCK per l'azione. Una decisione di autorizzare o rifiutare una connessione non deve essere presa in uno dei livelli di filtro stabiliti dal flusso ALE. Tale decisione deve essere sempre presa in uno degli altri livelli di filtro ALE.
L'unico motivo valido per cui un classifyFn callout funzione debba restituire FWP_ACTION_BLOCK per l'azione è se si verifica un errore che potrebbe rappresentare un rischio di sicurezza potenziale se la connessione stabilita non viene terminata. In questo caso, la restituzione di FWP_ACTION_BLOCK per l'azione chiude la connessione per impedire che il potenziale rischio di sicurezza venga sfruttato.
Tempo di esecuzione della funzione callout
Poiché il motore di filtro chiama in genere le funzioni callout di un callout in IRQL = DISPATCH_LEVEL, assicurarsi che queste funzioni completino l'esecuzione il più rapidamente possibile per mantenere il sistema in esecuzione in modo efficiente. L'esecuzione estesa in IRQL = DISPATCH_LEVEL può influire negativamente sulle prestazioni complessive del sistema.
Inserimento nel percorso dati di ricezione
I callout devono ricalcolare i checksum IP prima di chiamare funzioni di inserimento di pacchetti che inseriscono nel percorso dati di ricezione perché il checksum nel pacchetto originale potrebbe non essere corretto quando il pacchetto viene riassemblato dai frammenti di pacchetti IP. Non esiste un meccanismo affidabile che indica se un elenco di buffer net viene riassemblato da frammenti.
Inserimento inline del pacchetto TCP dai livelli di trasporto
A causa del comportamento di blocco dello stack TCP, un callout a livello di trasporto non può inserire un pacchetto TCP nuovo o clonato dalla funzione callout classifyFn. Se si desidera l'inserimento in linea, il callout deve accodare un DPC per eseguire l'iniezione.
Allineamento intestazione IP in uscita
Il file MDL che descrive l'intestazione IP in un elenco di buffer net (NET_BUFFER_CURRENT_MDL(NET_BUFFER_LIST_FIRST_NB(netBufferList))) deve essere allineato al puntatore quando viene usata una delle funzioni di inserimento di pacchetti per inserire i dati dei pacchetti in un percorso in uscita. Poiché l'intestazione IP di un pacchetto in ingresso MDL può essere allineata al puntatore, un callout deve ricompilare l'intestazione IP (se non è già allineata) quando si inserisce un pacchetto in ingresso in un percorso in uscita.