Partilhar via


Cancelando uma operação de envio

A figura a seguir ilustra o cancelamento de uma operação de envio.

Diagrama que mostra o processo de cancelamento de uma operação de envio.

Um driver chama a macro NDIS_SET_NET_BUFFER_LIST_CANCEL_ID para cada estrutura NET_BUFFER_LIST que passa para drivers de nível inferior para transmissão. A função NDIS_SET_NET_BUFFER_LIST_CANCEL_ID marca o pacote especificado com um identificador de cancelamento.

Antes de atribuir IDs de cancelamento a pacotes, um driver deve chamar NdisGeneratePartialCancelId para obter o byte de alta ordem de cada ID de cancelamento que ele atribui. Isso garante que o driver não duplize as IDs de cancelamento atribuídas por outros drivers no sistema. Os drivers normalmente chamam NdisGeneratePartialCancelId uma vez da rotina DriverEntry ; no entanto, os drivers podem obter mais de um identificador de cancelamento parcial chamando NdisGeneratePartialCancelId mais de uma vez.

Para cancelar a transmissão pendente de dados em uma estrutura de NET_BUFFER_LIST marcada, um driver passa a ID de cancelamento para a função NdisCancelSendNetBufferLists . Os drivers podem obter a ID de cancelamento de uma estrutura de NET_BUFFER_LIST chamando a macro NDIS_GET_NET_BUFFER_LIST_CANCEL_ID .

Se um driver marcar todas as estruturas NET_BUFFER_LIST com o mesmo identificador de cancelamento, ele poderá cancelar todas as transmissões pendentes com uma única chamada para NdisCancelSendNetBufferLists. Se um driver marcar todas as estruturas NET_BUFFER_LIST dentro de um subgrupo de estruturas NET_BUFFER_LIST com um identificador exclusivo, ele poderá cancelar todas as transmissões pendentes dentro desse subgrupo com uma única chamada para NdisCancelSendNetBufferLists.

O NDIS chama a função MiniportCancelSend do driver de nível inferior apropriado na associação. Depois de anular a transmissão pendente, o driver de miniporto subjacente chama a função NdisMSendNetBufferListsComplete para retornar as estruturas de NET_BUFFER_LIST e uma status de conclusão de NDIS_STATUS_SEND_ABORTED. O NDIS, por sua vez, chama a função ProtocolSendNetBufferListsComplete do driver apropriado.

Em sua função ProtocolSendNetBufferListsComplete , um driver de protocolo pode chamar NDIS_SET_NET_BUFFER_LIST_CANCEL_ID com CancelId definido como NULL. Isso impede que o NET_BUFFER_LIST seja usado inadvertidamente novamente com uma ID de cancelamento obsoleta.