Ispezione dei flussi

Ispezione flusso inline

I modificatori di flusso inline possono modificare i dati del flusso consentendo o bloccando una parte dei dati indicati impostando il valore del membro countBytesEnforced della struttura FWPS_STREAM_CALLOUT_IO_PACKET0 quando restituiscono FWP_ACTION_PERMIT o FWP_ACTION_BLOCK dalla funzione callout 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 byte p seguito da m byte), il callout seguirà questi passaggi:

  1. La funzione classifyFn del callout viene chiamata usando n + p + m byte.

  2. Il callout restituisce FWP_ACTION_PERMIT con il membro countBytesEnforced impostato su n.

  3. La funzione classifyFn del callout viene chiamata di nuovo con p + m byte. Il WFP chiamerà di nuovo classifyFn se countBytesEnforced è minore dell'importo indicato.

  4. Dalla funzione classifyFn il callout chiama la funzione FwpsStreamInjectAsync0 per inserire il modello di sostituzione p'. Il callout restituisce quindi FWP_ACTION_BLOCK con countBytesEnforced impostato su p.

  5. La funzione classifyFn del callout viene chiamata nuovamente con m byte.

  6. Il callout restituisce FWP_ACTION_PERMIT con countBytesEnforced impostato su m.

Se i dati indicati non sono sufficienti per il callout per 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 sull'importo minimo che il WFP deve accumulare prima che i dati vengano indicati di nuovo. 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 imposterà il flag di FWPS_CLASSIFY_OUT_FLAG_BUFFER_LIMIT_REACHED quando chiama la funzione classifyFn del callout e lo spazio del buffer viene esaurito. Quando quest'ultimo 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 di 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à lo schema simile del callout di ispezione dei pacchetti: clonerebbe prima tutti i segmenti di flusso indicati per l'elaborazione posticipata e quindi blocca tali segmenti. I dati esaminati o modificati vengono inseriti nuovamente nel flusso di dati. Quando si inseriscono 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 un FIN (che indica non più dati dal mittente) in un flusso di dati in uscita. Se il modulo deve eliminare la connessione, la relativa funzione callout classifyFn 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 callout per passare da fuori banda a inline e può causare comportamenti imprevisti. Assicurarsi che i callout fuori banda soddisfi ognuno dei criteri specificati.

Poiché i dati del flusso possono essere indicati come catena di NET_BUFFER_LIST , FWP fornisce le funzioni di utilità FwpsCloneStreamData0 e FwpsDiscardClonedStreamData0 che operano su catene di elenchi di buffer net.

IL WFP supporta anche la limitazione dei dati di flusso per la direzione in ingresso. Se un callout non riesce a tenere il passo con la frequenza dei dati in ingresso, può restituire FWPS_STREAM_ACTION_DEFER per "sospendere" il flusso. Il flusso può quindi essere "ripreso" chiamando la funzione FwpsStreamContinue0 . Se si rinvia un flusso con questa funzione, lo stack TCP/IP arresta l'elaborazione dei dati in ingresso da ACK. In questo modo la finestra scorrevole TCP diminuisce verso 0.

Per i callout di ispezione del flusso fuori banda, FwpsStreamContinue0 non deve essere chiamato mentre viene chiamata la funzione FwpsStreamInjectAsync0 .

I dati del flusso inseriti non verranno indicati nuovamente al callout, ma saranno resi disponibili per trasmettere i callout dai sottostrati di peso inferiore.

L'esempio di modifica del flusso della piattaforma di filtri Di Windows nel repository degli esempi di driver di Windows in GitHub illustra come eseguire la modifica 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 callout esegue l'inserimento di pacchetti fuori banda.

  • Il callout richiede più dati impostando il membro streamAction della struttura FWPS_STREAM_CALLOUT_IO_PACKET0 su 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 le ispezioni dinamiche dei flussi. Un'ispezione dinamica del flusso opera su un flusso di dati di flusso esistente, invece di crearne una nuova ed eliminarne una nuova. Un driver di callout in grado di eseguire ispezioni di flusso dinamiche deve impostare il flag di 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 membro Flags della struttura FWPS_CALLOUT0 . Questo callout verrà ignorato in tutte le altre connessioni. Le prestazioni verranno migliorate e il driver non dovrà gestire i dati di stato non necessari.

Modello a cascata livello di flusso

Il livello di flusso nel WFP segue un modello a cascata rigoroso; ovvero, un callout in questo livello sarà autorizzato a esaminare 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 definitivamente dal flusso e non sarà consentito controllare alcun callout.

Inoltre:

  1. Ogni callout non ispezionato a livello di flusso deve assegnare in modo esplicito un valore al membro actionType del parametro classifyOut indipendentemente dal valore che potrebbe essere stato impostato in precedenza in tale parametro.
  2. Il flag FWPS_RIGHT_ACTION_WRITE nel membro dei diritti 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-rights>.