Condividi tramite


Annullamento di una richiesta di invio in un driver di filtro

I driver di filtro possono annullare l'invio di richieste che sono state originate dai driver di filtro o da driver superiori.

Annullamento delle richieste di invio del driver di filtro

La figura seguente illustra l'annullamento di una richiesta di invio originata da un driver di filtro.

Diagramma di flusso che mostra il processo di annullamento di una richiesta di invio originata da un driver di filtro.

Un driver di filtro chiama la macro NDIS_SET_NET_BUFFER_LIST_CANCEL_ID per ogni struttura NET_BUFFER_LIST creata per le operazioni di invio. La funzione NDIS_SET_NET_BUFFER_LIST_CANCEL_ID contrassegna i dati specificati con un identificatore di annullamento.

Prima di assegnare gli ID di annullamento ai dati di rete, un driver di filtro deve chiamare NdisGeneratePartialCancelId per ottenere il byte più significativo di ogni ID di annullamento assegnato. In questo modo, il driver non duplica gli ID di annullamento assegnati da altri driver nel sistema. I driver chiamano in genere NdisGeneratePartialCancelId una volta dalla routine DriverEntry . Tuttavia, i driver possono ottenere più di un identificatore di annullamento parziale chiamando NdisGeneratePartialCancelId più volte.

Per annullare la trasmissione dei dati in sospeso in una struttura NET_BUFFER_LIST contrassegnata, un driver di filtro deve passare l'ID di annullamento alla funzione NdisFCancelSendNetBufferLists. I driver possono ottenere l'ID di annullamento di una struttura NET_BUFFER_LIST chiamando la macro NDIS_GET_NET_BUFFER_LIST_CANCEL_ID.

Se un driver di filtro contrassegna tutte le strutture NET_BUFFER_LIST con lo stesso identificatore di annullamento, può annullare tutte le trasmissioni in sospeso con una singola chiamata a NdisFCancelSendNetBufferLists. Se un driver di filtro contrassegna tutte le strutture NET_BUFFER_LIST all'interno di un sottogruppo di strutture NET_BUFFER_LIST con un identificatore univoco, può annullare tutte le trasmissioni in sospeso all'interno di tale sottogruppo con una singola chiamata a NdisFCancelSendNetBufferLists.

NDIS chiama la funzione di annullamento dell'invio dei driver sottostanti. Dopo aver interrotto la trasmissione in sospeso, i driver sottostanti chiamano una funzione completa di invio (ad esempio NdisMSendNetBufferListsComplete) per restituire le strutture di NET_BUFFER_LIST con stato di completamento di NDIS_STATUS_SEND_ABORTED. A sua volta, NDIS chiama la funzione FilterSendNetBufferListsComplete del driver di filtro.

In FilterSendNetBufferListsComplete un driver di filtro può chiamare NDIS_SET_NET_BUFFER_LIST_CANCEL_ID con CancelId impostato su NULL. In questo modo si impedisce che il NET_BUFFER_LIST venga usato di nuovo accidentalmente con un ID di annullamento non aggiornato.

Annullamento delle richieste di invio originate da driver sovrapposti

La figura seguente illustra l'annullamento di una richiesta di invio originata da un driver superiore.

Diagramma di flusso che mostra il processo di annullamento di una richiesta di invio originata da un driver superiore.

I driver sovrapposti chiamano una funzione di annullamento dell'invio (NdisFCancelSendNetBufferLists o NdisCancelSendNetBufferLists) per annullare le richieste di invio attive. Questi driver sovrapposti devono contrassegnare i dati da mandare con un ID di annullamento prima di effettuare una richiesta di invio.

NDIS chiama la funzione FilterCancelSendNetBufferLists di un driver di filtro per annullare la trasmissione di tutte le strutture NET_BUFFER_LIST contrassegnate con un identificatore di annullamento specificato.

FilterCancelSendNetBufferLists esegue le operazioni seguenti:

  1. Attraversa l'elenco delle strutture NET_BUFFER_LIST in coda del driver di filtro per il modulo di filtro specificato e chiama la macro NDIS_GET_NET_BUFFER_LIST_CANCEL_ID per ottenere l'identificatore di annullamento per ogni struttura. Il driver di filtro confronta l'ID di annullamento che NDIS_GET_NET_BUFFER_LIST_CANCEL_ID restituisce con l'ID di annullamento che NDIS ha passato a FilterCancelSendNetBufferLists.

  2. Rimuove dalla coda di invio (scollega) tutte le strutture NET_BUFFER_LIST i cui identificatori di annullamento sono uguali all'identificatore di annullamento specificato.

  3. Chiama la funzione NdisFSendNetBufferListsComplete per tutte le strutture NET_BUFFER_LIST non collegate per restituire le strutture. Il driver di filtro imposta il campo di stato delle strutture NET_BUFFER_LIST su NDIS_STATUS_SEND_ABORTED.

  4. Chiama la funzione NdisFCancelSendNetBufferLists per passare la richiesta di annullamento dell'invio ai driver sottostanti. Il driver di filtro passa l'identificatore di annullamento ricevuto dal driver sovrastante. L'operazione di annullamento procede come con un'operazione di invio di annullamento originata dal driver di filtro.