Uso dell'assegnazione di tag ai pacchetti

Un driver di callout può contrassegnare pacchetti di interesse e ricevere notifiche di eventi che si verificano nei pacchetti contrassegnati. L'assegnazione di tag ai pacchetti è supportata in Windows 7 e versioni successive di Windows.

Per usare l'assegnazione di tag ai pacchetti, il driver del callout deve implementare la funzione di callback FWPS_NET_BUFFER_LIST_NOTIFY_FN0 o FWPS_NET_BUFFER_LIST_NOTIFY_FN1 . Questa funzione riceverà tutte le notifiche di stato per i pacchetti con tag. Prima di contrassegnare singoli pacchetti, il driver callout deve ottenere un tag di contesto speciale chiamando FwpsNetBufferListGetTagForContext0. Il driver di callout può usare lo stesso tag di contesto per alcuni o tutti i pacchetti con tag. Ad esempio, un driver di callout può distinguere tra tipi di pacchetti con tag usando tag di contesto diversi.

Per contrassegnare i pacchetti, il driver del callout usa strutture NET_BUFFER_LIST . Il driver callout effettua chiamate a FwpsNetBufferListAssociateContext0 per contrassegnare le singole strutture NET_BUFFER_LIST . Il contesto associato al driver di callout al pacchetto è un valore arbitrario a 64 bit senza segno. Quando viene attivato un evento, il callback FWPS_NET_BUFFER_LIST_NOTIFY_FN0 o FWPS_NET_BUFFER_LIST_NOTIFY_FN1 passa il contesto come parametro di input in modo che il driver del callout possa identificare singoli pacchetti contrassegnati. Il contesto non viene utilizzato o valutato dal motore di filtro. Viene passato al callback per l'uso da parte del driver del callout.

I contesti vengono rimossi automaticamente dai pacchetti con tag quando i pacchetti lasciano lo stack. Tuttavia, se i pacchetti non immettono mai lo stack TCP/IP, ad esempio nel caso di un driver di filtro NDIS, i contesti dovranno essere rimossi manualmente chiamando FwpsNetBufferListRemoveContext0 con il parametro netBufferList impostato su NULL.

Se un callout deve interrompere le operazioni di assegnazione di tag in anticipo, i contesti possono essere rimossi chiamando FwpsNetBufferListRemoveContext0. La rimozione di un contesto attiva in genere un evento FWPS_NET_BUFFER_LIST_CONTEXT_REMOVED . Per altre informazioni sugli eventi che possono essere attivati, vedere l'enumerazione FWPS_NET_BUFFER_LIST_EVENT_TYPE0 . In alcuni casi non verrà attivato alcun evento, ad esempio quando il pacchetto non entra mai nello stack TCP/IP per l'elaborazione.

Quando viene clonato un pacchetto con tag, il driver di callout può spostare o copiare il contesto nel pacchetto clone. Per spostare il contesto (nel caso di un clone), il driver del callout deve chiamare FwpsNetBufferListRetrieveContext0 con il parametro removeContext impostato su TRUE. Il contesto può quindi essere associato al nuovo pacchetto. Il processo di copia del contesto (nel caso di una duplicazione) è lo stesso, ad eccezione del fatto che il parametro removeContext di FwpsNetBufferListRetrieveContext0 deve essere impostato su FALSE.

I pacchetti contrassegnati dai livelli TCP/IP possono essere recuperati da un driver di filtro NDIS. È anche vero il contrario. L'assegnazione di tag ai pacchetti non è disponibile dai livelli di flusso in cui non sono indicati pacchetti tranne i segmenti di dati.

Un driver di callout può recuperare il contesto per un pacchetto all'esterno della funzione FWPS_NET_BUFFER_LIST_NOTIFY_FN0 o FWPS_NET_BUFFER_LIST_NOTIFY_FN1 chiamando FwpsNetBufferListRetrieveContext0. In genere, un driver di callout recupererà il contesto nel callback classifyFn .

classifyFn

FWPS_NET_BUFFER_LIST_EVENT_TYPE0

FWPS_NET_BUFFER_LIST_NOTIFY_FN0

FWPS_NET_BUFFER_LIST_NOTIFY_FN1

FwpsNetBufferListAssociateContext0

FwpsNetBufferListGetTagForContext0

FwpsNetBufferListRemoveContext0

FwpsNetBufferListRetrieveContext0

NET_BUFFER_LIST

Driver di filtro NDIS