Partilhar via


Cancelando uma solicitação de envio em um driver de filtro

Os drivers de filtro podem cancelar pedidos de envio originados pelo driver de filtro ou originados por drivers superiores.

Cancelar pedidos de envio do controlador de filtro

A figura a seguir ilustra o cancelamento de uma solicitação de envio que foi originada por um driver de filtro.

Fluxograma que mostra o processo de cancelamento de uma solicitação de envio originada por um driver de filtro.

Um driver de filtro chama a macro NDIS_SET_NET_BUFFER_LIST_CANCEL_ID para cada estrutura de NET_BUFFER_LIST que ele cria para operações de envio. A função NDIS_SET_NET_BUFFER_LIST_CANCEL_ID marca os dados especificados com um identificador de cancelamento.

Antes de atribuir IDs de cancelamento aos dados da rede, um driver de filtro deve chamar NdisGeneratePartialCancelId para obter o byte de alta ordem de cada ID de cancelamento atribuído. Isso garante que o driver não duplique IDs de cancelamento atribuídos por outros drivers no sistema. Os controladores normalmente chamam NdisGeneratePartialCancelId uma vez na rotina DriverEntry. No entanto, os drivers podem obter mais de um identificador de cancelamento parcial chamando NdisGeneratePartialCancelId várias vezes.

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

Se um driver de filtro 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 NdisFCancelSendNetBufferLists. Se um driver de filtro 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 NdisFCancelSendNetBufferLists.

O NDIS chama a função de cancelar envio dos drivers subjacentes. Depois de anular a transmissão pendente, os drivers subjacentes chamam uma função send complete (por exemplo, NdisMSendNetBufferListsComplete) para retornar as estruturas NET_BUFFER_LIST com um status de conclusão de NDIS_STATUS_SEND_ABORTED. O NDIS, por sua vez, chama a função do driver de filtro FilterSendNetBufferListsComplete.

Em FilterSendNetBufferListsComplete, um driver de filtro pode chamar NDIS_SET_NET_BUFFER_LIST_CANCEL_ID com CancelId definido como NULL. Isso evita que o NET_BUFFER_LIST seja usado acidentalmente novamente com um ID de cancelamento obsoleto.

Cancelando pedidos de envio originados por controladores sobrepostos

A figura a seguir ilustra o cancelamento de uma solicitação de envio que foi originada por um driver superior.

Fluxograma que mostra o processo de cancelamento de uma solicitação de envio originada por um driver superior.

Drivers superiores chamam uma função de cancelamento de envio ( NdisFCancelSendNetBufferLists ou NdisCancelSendNetBufferLists) para cancelar solicitações de envio pendentes. Esses drivers intermediários devem marcar os dados de envio com um ID de cancelamento antes de efetuar um pedido de envio.

O NDIS chama a função FilterCancelSendNetBufferLists de um driver de filtro para cancelar a transmissão de todas as estruturas NET_BUFFER_LIST marcadas com um identificador de cancelamento especificado.

FilterCancelSendNetBufferLists executa as seguintes operações:

  1. Percorre a lista de estruturas NET_BUFFER_LIST enfileiradas do driver de filtro para o módulo de filtro especificado e chama a macro NDIS_GET_NET_BUFFER_LIST_CANCEL_ID para obter o identificador de cancelamento para cada estrutura. O driver de filtro compara o ID de cancelamento que NDIS_GET_NET_BUFFER_LIST_CANCEL_ID retorna com o ID de cancelamento que NDIS passou para FilterCancelSendNetBufferLists.

  2. Remove da fila de envio (desvincula) todas as estruturas de NET_BUFFER_LIST cujos identificadores de cancelamento correspondem ao identificador de cancelamento especificado.

  3. Chama a função NdisFSendNetBufferListsComplete para todas as estruturas desvinculadas NET_BUFFER_LIST, a fim de devolver as estruturas. O driver de filtro define o campo de status das estruturas de NET_BUFFER_LIST como NDIS_STATUS_SEND_ABORTED.

  4. Chama a função NdisFCancelSendNetBufferLists para passar o pedido de cancelamento de envio para os controladores subjacentes. O driver de filtro transmite o identificador de cancelamento que recebeu do driver superior. A operação de cancelamento prossegue da mesma forma que uma operação de envio de cancelamento originada por um driver de filtro.