Condividi tramite


Ricezione di dati in un driver di filtro

I driver di filtro possono iniziare a ricevere indicazioni o filtrare ricevono indicazioni dai driver sottostanti. Quando un driver miniport chiama la funzione NdisMIndicateReceiveNetBufferLists , NDIS invia la struttura di NET_BUFFER_LIST specificata al modulo filtro più basso nello stack di driver.

Ricevere indicazioni avviate da un driver di filtro

La figura seguente illustra un'indicazione di ricezione avviata da un driver di filtro.

Diagramma che illustra un'indicazione di ricezione avviata da un driver di filtro.

I driver di filtro chiamano la funzione NdisFIndicateReceiveNetBufferLists per indicare i dati ricevuti. La funzione NdisFIndicateReceiveNetBufferLists passa l'elenco indicato di strutture NET_BUFFER_LIST strutture fino allo stack fino ai driver overlying. Il driver di filtro alloca le strutture dai pool creati durante l'inizializzazione.

Se un driver di filtro imposta il flag di NDIS_RECEIVE_FLAGS_RESOURCES nel parametro ReceiveFlags di NdisFIndicateReceiveNetBufferLists, questo indica che il driver di filtro deve recuperare immediatamente la proprietà delle strutture NET_BUFFER_LIST . In questo caso, NDIS non chiama la funzione FilterReturnNetBufferLists del driver di filtro per restituire le strutture di NET_BUFFER_LIST . Il driver di filtro recupera la proprietà immediatamente dopo la restituzione di NdisFIndicateReceiveNetBufferLists .

Se un driver di filtro non imposta il flag di NDIS_RECEIVE_FLAGS_RESOURCES nel parametro ReceiveFlags di NdisFIndicateReceiveNetBufferLists, NDIS restituisce le strutture NET_BUFFER_LIST indicate per la funzione FilterReturnNetBufferLists del driver di filtro. In questo caso, il driver di filtro relinquise la proprietà delle strutture indicate fino a quando NDIS li restituisce a FilterReturnNetBufferLists.

Nota Un driver di filtro deve tenere traccia delle indicazioni di ricezione che avvia e assicurarsi che non chiami la funzione NdisFReturnNetBufferLists al termine dell'operazione di ricezione.

Filtro delle indicazioni di ricezione

La figura seguente illustra un'indicazione di ricezione filtrata avviata da un driver sottostante.

Diagramma che illustra un'indicazione di ricezione filtrata avviata da un driver sottostante.

NDIS chiama la funzione FilterReceiveNetBufferLists di un driver di filtro per elaborare le indicazioni provenienti dai driver sottostanti. NDIS chiama FilterReceiveNetBufferLists dopo che un driver sottostante chiama una funzione di indicazione di ricezione (ad esempio , NdisMIndicateReceiveNetBufferLists) per indicare i dati di rete ricevuti o i dati di loopback.

Se il flag NDIS_RECEIVE_FLAGS_RESOURCES nel parametro ReceiveFlags di FilterReceiveNetBufferLists non è impostato, il driver di filtro mantiene la proprietà delle strutture di NET_BUFFER_LIST finché non chiama la funzione NdisFReturnNetBufferLists.

Se il flag di NDIS_RECEIVE_FLAGS_RESOURCES nel parametro ReceiveFlags è impostato, il driver di filtro non può mantenere la struttura NET_BUFFER_LIST e le risorse associate allocati dal driver sottostante. Questo flag può indicare che il driver sottostante è in esecuzione basso sulle risorse di ricezione. La funzione FilterReceiveNetBufferLists deve restituire il più rapidamente possibile.

Nota Se il flag NDIS_RECEIVE_FLAGS_RESOURCES è impostato, il driver di filtro deve conservare il set originale di strutture di NET_BUFFER_LIST nell'elenco collegato. Ad esempio, quando questo flag è impostato, il driver potrebbe elaborare le strutture e indicare loro lo stack uno alla volta, ma prima che la funzione restituisca, deve ripristinare l'elenco collegato originale.

I driver di filtro possono eseguire operazioni di filtro sui dati ricevuti prima di indicare i dati da modificare. Per ogni buffer inviato alla funzione FilterReceiveNetBufferLists , è possibile eseguire le operazioni seguenti:

  • Passalo al driver overlying successivo chiamando NdisFIndicateReceiveNetBufferLists. Il driver può modificare il contenuto del buffer. NDIS garantisce la disponibilità dello spazio di contesto (vedere NET_BUFFER_LIST_CONTEXT struttura).

    Un driver di filtro può modificare lo stato passato a FilterReceiveNetBufferLists o semplicemente passarlo a NdisFIndicateReceiveNetBufferLists.

    Nota Un driver di filtro può passare un buffer con NdisFIndicateReceiveNetBufferLists anche se NDIS imposta il flag NDIS_RECEIVE_FLAGS_RESOURCES nel parametro ReceiveFlags di FilterReceiveNetBufferLists. In questo caso, il driver di filtro non deve restituire da FilterReceiveNetBufferLists finché non recupera la proprietà del buffer.

  • Eliminare il buffer. Se NDIS ha cancellato il flag di NDIS_RECEIVE_FLAGS_RESOURCES nel parametro ReceiveFlags di FilterReceiveNetBufferLists, chiamare la funzione NdisFReturnNetBufferLists per eliminare il buffer. Se NDIS imposta il flag di NDIS_RECEIVE_FLAGS_RESOURCES nel parametro ReceiveFlags di FilterReceiveNetBufferLists, non eseguire alcuna azione e restituire da FilterReceiveNetBufferLists per eliminare il buffer.

  • Accodare il buffer in una struttura di dati locale per l'elaborazione successiva. Se NDIS imposta il flag NDIS_RECEIVE_FLAGS_RESOURCES nel parametro ReceiveFlags di FilterReceiveNetBufferLists, il driver di filtro deve creare una copia prima di restituire da FilterReceiveNetBufferLists.

  • Copiare il buffer e originare un'indicazione di ricezione con la copia. L'indicazione di ricezione è simile a un'indicazione di ricezione avviata dal driver di filtro. In questo caso, il driver deve restituire il buffer originale al driver sottostante.

La funzione NdisFIndicateReceiveNetBufferLists passa l'elenco indicato di strutture NET_BUFFER_LIST strutture fino allo stack di driver in modo eccessivo. L'operazione di ricezione procede in modo analogo a un'operazione di ricezione avviata dal driver di filtro.

Se un driver overlying ha mantenuto la proprietà del buffer, NDIS chiama la funzione FilterReturnNetBufferLists per il modulo di filtro. Nella funzione FilterReturnNetBufferLists il driver di filtro annulla le operazioni eseguite nel buffer nel percorso di indicazione della ricezione.

Quando il modulo filtro livello più basso indica che viene eseguito con un buffer, NDIS restituisce il buffer al driver miniport. Se NDIS ha cancellato il flag di NDIS_RECEIVE_FLAGS_RESOURCES nel parametro ReceiveFlags di FilterReceiveNetBufferLists, il driver di filtro chiama NdisFReturnNetBufferLists per restituire il buffer. Se NDIS imposta il flag di NDIS_RECEIVE_FLAGS_RESOURCES nel parametro ReceiveFlags di FilterReceiveNetBufferLists, restituito da FilterReceiveNetBufferLists restituisce il buffer.