Tipi di callout
I tipi di callout seguenti possono essere usati con il WFP:
Callout ispezione inline
Questo tipo di callout restituisce sempre FWP_ACTION_CONTINUE dalla funzione classifyFn e non modifica il traffico di rete in alcun modo. Un callout che raccoglie statistiche di rete è un esempio di questo tipo di callout.
Per questo tipo di callout, il tipo di azione del filtro (specificato dal membro Type della struttura FWPS_ACTION0) deve essere impostato su FWP_ACTION_CALLOUT_INSPECTION.
Callout ispezione fuori banda
Questo tipo di callout non modifica il traffico di rete. Al contrario, rinvia qualsiasi ispezione da eseguire all'esterno della funzione classifyFn "in sospeso" i dati indicati e quindi reiniettare i dati pennati nello stack TCP/IP con una delle funzioni di inserimento di pacchetti. In sospeso viene implementato clonando prima i dati indicati, seguito dalla restituzione di FWP_ACTION_BLOCK dalla funzione classifyFn con il set di bit FWPS_CLASSIFY_OUT_FLAG_ABSORB .
Callout di modifica inline
Questo tipo di callout modifica il traffico di rete effettuando prima un clone dei dati indicati, quindi modificando il clone e infine inserendo nuovamente il clone modificato nello stack TCP/IP dalla funzione classifyFn . Questo tipo di callout restituisce anche FWP_ACTION_BLOCK dalla funzione classifyFn con FWPS_CLASSIFY_OUT_FLAG_ABSORB bit impostato.
Il tipo di azione di filtro per questo tipo di callout deve essere impostato su FWP_ACTION_CALLOUT_TERMINATING.
Callout di modifica fuori banda
Questo tipo di callout fa prima riferimento al pacchetto indicato usando la funzione FwpsReferenceNetBufferList0 con il parametro intentToModify impostato su TRUE. Il callout restituisce quindi FWP_ACTION_BLOCK con il bit FWPS_CLASSIFY_OUT_FLAG_ABSORB impostato dalla funzione classifyFn . Quando il pacchetto è pronto per essere modificato all'esterno di classifyFn, il callout clona il pacchetto di riferimento (non appena viene clonato, il pacchetto originale può quindi essere dereferenziato). Il callout modifica quindi il clone e inserisce nuovamente il pacchetto modificato nello stack TCP/IP.
Il tipo di azione di filtro per questo tipo di callout deve essere impostato su FWP_ACTION_CALLOUT_TERMINATING.
Callout reindirizzamento
Per altre informazioni su questo tipo di callout, vedere Uso di Bind o Connect Redirection.
Esistono due tipi di callout di reindirizzamento:
- Un callout di reindirizzamento delle associazioni consente al driver callout di modificare l'indirizzo locale e la porta locale di un socket.
- Un callout di reindirizzamento della connessione consente al driver callout di modificare l'indirizzo remoto e la porta remota di una connessione.
Il tipo di azione di filtro per questo tipo di callout deve essere impostato su FWP_ACTION_PERMIT.
Per altre informazioni sulle FWPS_CLASSIFY_OUT_FLAG_ABSORB, vedere FWPS_CLASSIFY_OUT0. Questo flag non è valido in alcun livello di eliminazione WFP. La restituzione di FWP_ACTION_BLOCK con il flag FWPS_CLASSIFY_OUT_FLAG_ABSORB impostato dalla funzione classifyFn fa sì che il pacchetto venga rimosso automaticamente, in modo che il pacchetto non raggiungerà alcun livello di eliminazione WFP, né causerà la generazione degli eventi di controllo.
Anche se gli elenchi di buffer net clonati possono essere modificati, ad esempio aggiungendo o rimuovendo buffer net o MDL o entrambi, i callout devono annullare tali modifiche prima di chiamare la funzione FwpsFreeCloneNetBufferList0.
Per coesistere con altri callout che eseguono l'ispezione dei pacchetti, la modifica dei pacchetti o il reindirizzamento della connessione, prima che un pacchetto venga pennato con il meccanismo reference/clone-drop-reinject, un callout deve eliminare "hard" il pacchetto originale cancellando il flag FWPS_RIGHT_ACTION_WRITE nel membro dei diritti della struttura FWPS_CLASSIFY_OUT0 restituita dalla funzione classifyFn. Se il flag di FWPS_RIGHT_ACTION_WRITE viene impostato quando viene chiamato il metodo classifyFn (il che significa che il pacchetto potrebbe essere sottoposto a penna e successivamente reinitto o modificato), il callout non deve creare la penna dell'indicazione e non deve modificare il tipo di azione corrente e deve attendere che un callout di peso maggiore inserisca il clone che potrebbe essere modificato.
Il flag FWPS_RIGHT_ACTION_WRITE deve essere impostato ogni volta che un callout esegue una classificazione. Il driver del callout deve verificare la presenza del flag FWPS_RIGHT_ACTION_WRITE per verificare i diritti del callout per restituire un'azione. Se questo flag non è impostato, il callout può comunque restituire un'azione FWP_ACTION_BLOCK per impostare un'azione di FWP_ACTION_PERMIT restituita da un callout precedente. Nell'esempio illustrato in Uso di un callout per l'ispezione approfondita, la funzione viene chiusa solo se il flag non è impostato.
La funzione FwpsPendOperation0 viene usata per creare pacchetti pend originati dai livelli di filtro di gestione FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_XXX, FWPM_LAYER_ALE_AUTH_LISTEN_XXX o FWPM_LAYER_ALE_AUTH_CONNECT_XXX.
La funzione FwpsPendClassify0 viene usata per creare pacchetti pend originati dai livelli di filtro di runtime seguenti:
FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V4 FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V6 FWPS_LAYER_ALE_CONNECT_REDIRECT_V4 FWPS_LAYER_ALE_CONNECT_REDIRECT_V6 FWPS_LAYER_ALE_BIND_REDIRECT_V4 FWPS_LAYER_ALE_BIND_REDIRECT_V6