Annullamento di un'operazione di invio

La figura seguente illustra l'annullamento di un'operazione di invio.

Diagramma che mostra il processo di annullamento di un'operazione di invio.

Un driver chiama la macro NDIS_SET_NET_BUFFER_LIST_CANCEL_ID per ogni struttura NET_BUFFER_LIST che passa ai driver di livello inferiore per la trasmissione. La funzione NDIS_SET_NET_BUFFER_LIST_CANCEL_ID contrassegna il pacchetto specificato con un identificatore di annullamento.

Prima di assegnare ID di annullamento ai pacchetti, un driver deve chiamare NdisGeneratePartialCancelId per ottenere il byte elevato di ogni ID di annullamento assegnato. Ciò garantisce che il driver non duplici 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ù di una volta.

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

Se un driver 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 NdisCancelSendNetBufferLists. Se un driver 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 NdisCancelSendNetBufferLists.

NDIS chiama la funzione MiniportCancelSend del driver di livello inferiore appropriato sull'associazione. Dopo aver interrotto la trasmissione in sospeso, il driver miniport sottostante chiama la funzione NdisMSendNetBufferListsComplete , per restituire le strutture di NET_BUFFER_LIST e uno stato di completamento di NDIS_STATUS_SEND_ABORTED. NDIS, a sua volta, chiama la funzione ProtocolSendNetBufferListsComplete del driver appropriato.

Nella funzione ProtocolSendNetBufferListsComplete un driver di protocollo può chiamare NDIS_SET_NET_BUFFER_LIST_CANCEL_ID con CancelId impostato su NULL. Ciò impedisce la NET_BUFFER_LIST di essere usata di nuovo inavvertitamente con un ID di annullamento non aggiornato.