Condividi tramite


Invio di dati da un driver di filtro

I driver di filtro possono avviare richieste di invio o filtrare le richieste di invio che avviano i driver in modo eccessivo. Quando un driver del protocollo chiama la funzione NdisSendNetBufferLists, NDIS invia la struttura di NET_BUFFER_LIST specificata al modulo di filtro più alto nello stack di driver.

Inviare richieste avviate da un driver di filtro

La figura seguente illustra un'operazione di invio avviata da un driver di filtro.

Diagramma che mostra un'operazione di invio avviata da un driver di filtro con funzione NdisFSendNetBufferLists.

I driver di filtro chiamano la funzione NdisFSendNetBufferLists per inviare i dati di rete definiti in un elenco di strutture NET_BUFFER_LIST .

Un driver di filtro deve impostare il membro SourceHandle di ogni struttura NET_BUFFER_LIST creata allo stesso valore che passa al parametro NdisFilterHandle di NdisFSendNetBufferLists. I driver NDIS non devono modificare il membro SourceHandle per le strutture NET_BUFFER_LIST che il driver non ha avuto origine.

Prima di chiamare NdisFSendNetBufferLists, un driver di filtro può impostare informazioni che accompagnano la richiesta di invio con la macro NET_BUFFER_LIST_INFO . I driver sottostanti possono recuperare queste informazioni con la macro NET_BUFFER_LIST_INFO.

Non appena un driver di filtro chiama NdisFSendNetBufferLists, riabilita la proprietà delle strutture NET_BUFFER_LIST e tutte le risorse associate. NDIS può gestire la richiesta di invio o passare la richiesta ai driver sottostanti.

NDIS chiama la funzione FilterSendNetBufferListsComplete per restituire le strutture e i dati al driver di filtro. NDIS può raccogliere le strutture e i dati da più richieste di invio in un singolo elenco collegato di strutture NET_BUFFER_LIST prima di passare l'elenco a FilterSendNetBufferListsComplete

Fino a quando NDIS chiama FilterSendNetBufferListsComplete, lo stato corrente di una richiesta di invio è sconosciuto. Un driver di filtro non deve mai provare ad esaminare le strutture NET_BUFFER_LIST o i dati associati prima che NDIS restituisca le strutture in FilterSendNetBufferListsComplete.

FilterSendNetBufferListsComplete esegue qualsiasi post-elaborazione necessaria per completare un'operazione di invio.

Quando NDIS chiama FilterSendNetBufferListsComplete, il driver di filtro recupera la proprietà di tutte le risorse associate alle strutture NET_BUFFER_LIST specificate dal parametro NetBufferLists . FilterSendNetBufferListsComplete può liberare queste risorse (ad esempio chiamando le funzioni NdisFreeNetBuffer e NdisFreeNetBufferList) o preparandole per il riutilizzo in una chiamata successiva a NdisFSendNetBufferLists.

NDIS invia sempre i dati di rete forniti dal filtro ai driver sottostanti nell'ordine determinato da filtro-driver come passato a NdisFSendNetBufferLists. Tuttavia, dopo l'invio dei dati nell'ordine specificato, i driver sottostanti possono restituire i buffer in qualsiasi ordine.

Un driver di filtro può richiedere il loopback per l'invio di richieste di origine. Per richiedere il loopback, il driver imposta il flag di NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK nel parametro SendFlags di NdisFSendNetBufferLists. NDIS indica un pacchetto ricevuto contenente i dati di invio.

Nota Un driver di filtro deve tenere traccia delle richieste di invio che ha origine e assicurarsi che non chiami la funzione NdisFSendNetBufferListsComplete al termine di tali richieste.

Filtro delle richieste di invio

Nella figura seguente viene illustrato il filtro di una richiesta di invio avviata da un driver overlying.

Diagramma che illustra il processo di filtro di una richiesta di invio avviata da un driver overlying usando la funzione FilterSendNetBufferLists.

NDIS chiama la funzione FilterSendNetBufferLists di un driver di filtro per filtrare la richiesta di invio di un driver overlying.

Il driver di filtro non deve modificare il membro SourceHandle nelle strutture di NET_BUFFER_LIST ricevute da altri driver.

Il driver di filtro può filtrare i dati e inviare i dati filtrati ai driver sottostanti. Per ogni struttura NET_BUFFER inviata a FilterSendNetBufferLists, un driver di filtro può eseguire le operazioni seguenti:

  • Passare il buffer al driver sottostante successivo chiamando la funzione NdisFSendNetBufferLists . NDIS garantisce la disponibilità dello spazio di contesto (vedere NET_BUFFER_LIST_CONTEXT struttura) per i driver di filtro. Il driver di filtro può modificare il contenuto del buffer prima di chiamare NdisFSendNetBufferLists. L'elaborazione dei dati filtrati procede come con un'operazione di invio avviata da un driver di filtro.

  • Eliminare il buffer chiamando la funzione NdisFSendNetBufferListsComplete .

  • Accodare il buffer in una struttura di dati locale per l'elaborazione successiva. La progettazione del driver di filtro determina il motivo per cui il driver elabora un buffer in coda. Alcuni esempi includono l'elaborazione dopo il timeout o l'elaborazione dopo la ricezione di un buffer specifico.

    Nota Se le code del driver inviano richieste per l'elaborazione successiva, è necessario supportare l'invio di richieste di annullamento. Per altre informazioni sull'invio di richieste di annullamento, vedere Annullamento delle richieste di invio in un driver di filtro.

  • Copiare il buffer e originare una richiesta di invio con la copia. L'operazione di invio è simile a una richiesta di invio avviata dal driver di filtro. In questo caso, il driver deve restituire il buffer originale al driver overlying chiamando la funzione NdisFSendNetBufferListsComplete .

Il completamento delle richieste di invio procede con lo stack di driver. Quando il driver miniport chiama la funzione NdisMSendNetBufferListsComplete , NDIS chiama la funzione FilterSendNetBufferListsComplete per il modulo filtro più basso.

Al termine dell'operazione di invio, il driver di filtro inverte le modifiche apportate ai descrittori del buffer del driver overlying che il driver di filtro creato in FilterSendNetBufferLists. Il driver chiama la funzione NdisFSendNetBufferListsComplete per restituire l'elenco collegato di strutture NET_BUFFER_LIST ai driver overlying e per restituire lo stato finale della richiesta di invio.

Quando il modulo filtro superiore chiama NdisFSendNetBufferListsComplete, NDIS chiama la funzione ProtocolSendNetBufferListsComplete del driver di protocollo di origine.

Un driver di filtro che non fornisce una funzione FilterSendNetBufferLists può comunque avviare una richiesta di invio. Se tale driver avvia una richiesta di invio, deve fornire una funzione FilterSendNetBufferListsComplete e non deve passare l'evento completo allo stack di driver.

Un driver di filtro può passare o filtrare la richiesta di loopback di un driver overlying. Per passare una richiesta di loopback, se NDIS imposta NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK nel parametro SendFlags di FilterSendNetBufferLists, il driver di filtro imposta NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK nel parametro SendFlags quando chiama NdisFSendNetBufferLists. NDIS indica un pacchetto ricevuto contenente i dati di invio.

In generale, se un driver di filtro modifica qualsiasi comportamento in modo che NDIS non possa fornire un servizio standard (ad esempio il loopback), il driver di filtro deve fornire tale servizio per NDIS. Ad esempio, un driver di filtro che modifica una richiesta per l'indirizzo hardware (vedere OID_802_3_CURRENT_ADDRESS), deve gestire il loopback dei buffer indirizzati al nuovo indirizzo hardware. In questo caso, NDIS non può fornire il servizio di loopback fornito in genere perché il filtro ha modificato l'indirizzo. Inoltre, se il driver di filtro imposta la modalità promiscua (vedere OID_GEN_CURRENT_PACKET_FILTER), non deve passare i dati aggiuntivi ricevuti ai driver overlying.