Compartilhar via


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

Os drivers de filtro podem cancelar solicitações de envio originadas pelo driver de filtro ou que foram originadas por drivers de sobreposição.

Cancelando solicitações de envio do driver de filtro

A figura a seguir ilustra o cancelamento de uma solicitação de envio 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 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 a dados de rede, um driver de filtro 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 várias vezes.

Para cancelar a transmissão pendente de dados em uma estrutura de NET_BUFFER_LIST marcada, um driver de filtro passa a ID de cancelamento para a função NdisFCancelSendNetBufferLists . 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 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 cancelar envio dos drivers subjacentes. Depois de anular a transmissão pendente, os drivers subjacentes chamam uma função de envio completo (por exemplo, NdisMSendNetBufferListsComplete) para retornar as estruturas de NET_BUFFER_LIST com um status de conclusão de NDIS_STATUS_SEND_ABORTED. O NDIS, por sua vez, chama a função FilterSendNetBufferListsComplete do driver de filtro.

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

Cancelando solicitações de envio originadas por drivers de sobreposição

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

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

Os drivers em excesso chamam uma função cancelar envio ( NdisFCancelSendNetBufferLists ou NdisCancelSendNetBufferLists) para cancelar solicitações de envio pendentes. Esses drivers de sobreposição devem marcar os dados de envio com uma ID de cancelamento antes de fazer uma solicitação de envio.

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

FilterCancelSendNetBufferLists executa as seguintes operações:

  1. Percorre a lista do driver de filtro de estruturas de NET_BUFFER_LIST enfileiradas 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 a ID de cancelamento que NDIS_GET_NET_BUFFER_LIST_CANCEL_ID retorna com a ID de cancelamento que o NDIS passou para FilterCancelSendNetBufferLists.

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

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

  4. Chama a função NdisFCancelSendNetBufferLists para passar a solicitação cancelar envio para drivers subjacentes. O driver de filtro passa o identificador de cancelamento que recebeu do driver de sobreposição. A operação de cancelamento prossegue como com uma operação de envio de cancelamento originada pelo driver de filtro.