Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Ispezione in linea dei flussi
I modificatori di flusso inline possono modificare i dati di flusso consentendo o bloccando una parte dei dati indicati impostando il valore del countBytesEnforced membro della struttura FWPS_STREAM_CALLOUT_IO_PACKET0 quando restituiscono FWP_ACTION_PERMIT o FWP_ACTION_BLOCK dalla funzione di callout di classifyFn. Possono anche chiamare la funzione FwpsStreamInjectAsync0 per aggiungere nuovo contenuto al flusso. Questo contenuto può essere nuovo o può sostituire i dati bloccati.
Per sostituire un criterio trovato al centro di un segmento indicato (ad esempio, n byte seguiti da un modello di p byte seguiti da m byte), il callout seguirà questi passaggi:
La funzione di classifyFn del callout viene chiamata usando n + p + m byte.
Il callout restituisce FWP_ACTION_PERMIT con il membro countBytesEnforced impostato su n.
La funzione classifyFn del callout viene chiamata di nuovo con i byte p + m. WFP chiamerà di nuovo classifyFn se countBytesEnforced è minore dell'importo indicato.
Dalla funzione classifyFn, il callout chiama la funzione FwpsStreamInjectAsync0 per inserire il criterio di sostituzione p'. Il callout restituisce quindi FWP_ACTION_BLOCK con countBytesEnforced impostato su p.
La funzione classifyFn del callout viene chiamata di nuovo con m byte.
Il callout restituisce FWP_ACTION_PERMIT con countBytesEnforced impostato su m.
Se i dati forniti non sono sufficienti affinché il callout possa prendere una decisione di ispezione, può impostare il membro streamAction della struttura FWPS_STREAM_CALLOUT_IO_PACKET0 su FWPS_STREAM_ACTION_NEED_MORE_DATA e impostare il membro countBytesRequired sul valore minimo che WFP deve accumulare prima che i dati vengano nuovamente indicati. Quando streamAction è impostato, il callout deve restituire FWP_ACTION_NONE dalla funzione classifyFn.
Il WFP può accumulare fino a 8 MB di dati di flusso quando viene impostato FWPS_STREAM_ACTION_NEED_MORE_DATA. IL WFP imposta il flag FWPS_CLASSIFY_OUT_FLAG_BUFFER_LIMIT_REACHED quando chiama la funzione del callout classifyFn e lo spazio del buffer è esaurito. Quando il secondo flag è impostato, il callout deve accettare i dati indicati in modo completo. Un callout non deve restituire FWPS_STREAM_ACTION_NEED_MORE_DATA quando è impostato il flag FWPS_CLASSIFY_OUT_FLAG_NO_MORE_DATA.
Per comodità di poter analizzare un modello di flusso da un buffer flat, WFP fornisce la funzione di utilità FwpsCopyStreamDataToBuffer0, che può copiare i dati di flusso indicati in un buffer contiguo.
Ispezione del flusso fuori banda
Per l'ispezione o la modifica fuori banda, un callout di flusso seguirà il modello simile al callout di ispezione dei pacchetti: clonerebbe prima tutti i segmenti di flusso indicati per l'elaborazione posticipata e quindi blocca tali segmenti. I dati ispezionati o modificati vengono inseriti nuovamente nel flusso di dati. Quando si inserisce dati fuori banda, il callout deve restituire FWP_ACTION_BLOCK su tutti i segmenti indicati per garantire l'integrità del flusso risultante. Un modulo di ispezione fuori banda non deve inserire arbitrariamente una FIN (che indica che non sono più dati del mittente) in un flusso di dati in uscita. Se il modulo deve eliminare la connessione, il relativo classifyFn funzione callout deve impostare il membro streamAction della struttura FWPS_STREAM_CALLOUT_IO_PACKET0 su FWPS_STREAM_ACTION_DROP_CONNECTION.
Nota Si tratta di una violazione del contratto per i passaggi dei callout da fuori banda a inline e può causare comportamenti imprevisti. Assicurarsi che le chiamate fuori banda soddisfino ognuno dei criteri specificati.
Poiché i dati di flusso possono essere indicati come catena di NET_BUFFER_LIST, FWP fornisce le funzioni di utilitàfwpsCloneStreamData0fwpsCloneStreamData0 e FwpsDiscardClonedStreamData0 che operano su catene di elenchi di buffer net.
WFP supporta anche la gestione del flusso di dati per la direzione in ingresso. Se un callout non riesce a tenere il passo con la velocità dei dati in ingresso, può restituire FWPS_STREAM_ACTION_DEFER per "sospendere" il flusso. Il flusso può quindi essere "ripreso" chiamando la funzioneFwpsStreamContinue0. Se si rinvia un flusso con questa funzione, lo stack TCP/IP arresta l'elaborazione dei dati in ingresso in ACK. In questo modo la finestra scorrevole TCP diminuisce verso 0.
Per i callout di ispezione dei flussi fuori banda, FwpsStreamContinue0 non deve essere chiamato mentre viene chiamata la funzione FwpsStreamInjectAsync0.
I dati del flusso inseriti non verranno reindirizzati al callout, ma saranno disponibili per le chiamate di stream dai sottostrati di peso inferiore.
Il esempio di modifica del flusso della piattaforma di filtro di Windows nel repository degli esempi di driver di Windows su GitHub illustra come eseguire modifiche inline e fuori banda a livello di flusso.
Nota Windows Server 2008 e versioni successive non supportano la rimozione di un filtro di flusso durante i processi seguenti:
Il modulo esegue l'inserimento di pacchetti al di fuori del normale canale di comunicazione.
Il callout richiede più dati impostando il membro streamAction della strutturaFWPS_STREAM_CALLOUT_IO_PACKET0su FWPS_STREAM_ACTION_NEED_MORE_DATA.
Il callout rinvia un flusso impostando il membro streamAction della struttura FWPS_STREAM_CALLOUT_IO_PACKET0 su FWPS_STREAM_ACTION_DEFER.
Ispezione dinamica dei flussi
Windows 7 e versioni successive supportano l'ispezione dinamica dei flussi. Un'ispezione dinamica del flusso opera su un flusso di dati esistente, anziché creare un nuovo flusso. Un driver callout in grado di eseguire ispezioni di flusso dinamico deve impostare il flag FWP_CALLOUT_FLAG_ALLOW_MID_STREAM_INSPECTION nel membro Flags della struttura FWPS_CALLOUT1 o FWPS_CALLOUT2.
Evitare ispezioni non necessarie
Per eseguire ispezioni di flusso solo sulle connessioni a cui è interessato il driver, un callout può impostare il flag FWP_CALLOUT_FLAG_CONDITIONAL_ON_FLOW nel Flags membro della struttura FWPS_CALLOUT0. Questo callout verrà ignorato in tutte le altre connessioni. Le prestazioni saranno migliorate e il driver non dovrà gestire i dati sullo stato non necessari.
Modello a cascata del livello di flusso
Il livello di flusso nel WFP segue un modello a cascata rigoroso; ovvero, un callout in questo livello sarà autorizzato a ispezionare un segmento di flusso solo se il callout precedente (se presente) lo ha consentito in modo esplicito. Se un callout blocca un segmento indicato, tale segmento viene rimosso permanentemente dal flusso e non sarà consentito ispezionarlo.
Inoltre:
- Ogni callout non di ispezione a livello di flusso deve assegnare esplicitamente un valore al membro actionType del parametro classifyOut, indipendentemente dal valore che potrebbe essere stato impostato in precedenza in tale parametro.
- Il flag FWPS_RIGHT_ACTION_WRITE nel diritti membro del parametro classifyOut non ha alcun significato nel livello del flusso WFP. I callout a questo livello non devono verificare la presenza di questo flag. I callout possono elaborare il parametro layerData indicato indipendentemente dal valore di classifyOut- diritti>.