Share via


Annullamento di una richiesta di invio in un driver di filtro

I driver di filtro possono annullare l'invio di richieste originate dal driver di filtro o originate da driver eccessivamente.

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 di ordine elevato 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 in genere chiamano 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 in sospeso dei dati in una struttura di NET_BUFFER_LIST contrassegnata, un driver di filtro passa l'ID di annullamento alla funzione NdisFCancelSendNetBufferLists . I driver possono ottenere l'ID di annullamento di una struttura di 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 cancel send dei driver sottostanti. Dopo aver interrotto la trasmissione in sospeso, i driver sottostanti chiamano una funzione di invio completa (ad esempio NdisMSendNetBufferListsComplete) per restituire le strutture NET_BUFFER_LIST con stato di completamento di NDIS_STATUS_SEND_ABORTED. NDIS, a sua volta, 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 evita che il NET_BUFFER_LIST venga usato di nuovo con un ID di annullamento non aggiornato.

Annullamento delle richieste di invio originate da driver eccessivamente

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

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

I driver overlying chiamano una funzione cancel send ( NdisFCancelSendNetBufferLists o NdisCancelSendNetBufferLists) per annullare le richieste di invio in sospeso. Questi driver eccessivamente devono contrassegnare i dati di invio 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 di strutture di 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 passato a FilterCancelSendNetBufferLists.

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

  3. Chiama la funzione NdisFSendNetBufferListsComplete per tutte le strutture NET_BUFFER_LIST scollegate 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 invio annulla ai driver sottostanti. Il driver di filtro passa l'identificatore di annullamento ricevuto dal driver overlying. L'operazione di annullamento procede come con un'operazione di invio cancel originata da filter-driver.