Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os drivers de filtro podem iniciar solicitações de envio ou filtrar solicitações de envio que os drivers sobrepostos iniciam. Quando um driver de protocolo chama a função NdisSendNetBufferLists, o NDIS envia a estrutura NET_BUFFER_LIST especificada para o módulo de filtro no nível superior da pilha de drivers.
Enviar solicitações iniciadas por um driver de filtro
A figura a seguir ilustra uma operação de envio iniciada por um driver de filtro.
Os drivers de filtro chamam a função NdisFSendNetBufferLists para enviar os dados de rede que estão definidos numa lista de estruturas NET_BUFFER_LIST.
Um driver de filtro deve definir o membro SourceHandle de cada estrutura NET_BUFFER_LIST que cria para o mesmo valor que passa para o parâmetro NdisFilterHandle da função NdisFSendNetBufferLists. Os drivers NDIS não devem modificar o membro SourceHandle para as estruturas NET_BUFFER_LIST que o driver não originou.
Antes de chamar NdisFSendNetBufferLists, um driver de filtro pode definir as informações que acompanham o pedido de envio, utilizando a macro NET_BUFFER_LIST_INFO. Os drivers subjacentes podem recuperar essas informações com a macro NET_BUFFER_LIST_INFO.
Assim que um driver de filtro chama NdisFSendNetBufferLists, ele renuncia à propriedade das estruturas NET_BUFFER_LIST e de todos os recursos associados. O NDIS pode processar a solicitação de envio ou passar a solicitação aos drivers subjacentes.
O NDIS chama a função FilterSendNetBufferListsComplete para retornar as estruturas e os dados ao driver de filtro. O NDIS pode recolher as estruturas e os dados de várias solicitações de envio numa única lista ligada de estruturas de NET_BUFFER_LIST antes de passar a lista para FilterSendNetBufferListsComplete
Até que o NDIS chame FilterSendNetBufferListsComplete, o status atual de uma solicitação de envio é desconhecido. Um driver de filtro nunca deve tentar examinar as estruturas NET_BUFFER_LIST ou quaisquer dados associados antes que o NDIS retorne as estruturas para FilterSendNetBufferListsComplete.
FilterSendNetBufferListsComplete executa qualquer pós-processamento necessário para concluir uma operação de envio.
Quando o NDIS chama FilterSendNetBufferListsComplete , o driver de filtro recupera a propriedade de todos os recursos associados às estruturas de NET_BUFFER_LIST especificadas pelo parâmetro NetBufferLists. FilterSendNetBufferListsComplete pode liberar esses recursos (por exemplo, chamando as funções NdisFreeNetBuffer e NdisFreeNetBufferList) ou prepará-los para reutilização em uma chamada subsequente para NdisFSendNetBufferLists.
O NDIS sempre envia os dados de rede fornecidos pelo filtro para os drivers subjacentes na ordem definida pelo driver de filtro, conforme passado para NdisFSendNetBufferLists. No entanto, depois de enviar os dados na ordem especificada, os drivers subjacentes podem retornar os buffers em qualquer ordem.
Um driver de filtro pode solicitar uma operação de loopback para os pedidos de envio que ele origina. Para solicitar o loopback, o driver define o sinalizador NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK no parâmetro SendFlags de NdisFSendNetBufferLists. O NDIS indica um pacote recebido que contém os dados de envio.
Observação Um driver de filtro deve acompanhar as solicitações de envio que ele próprio origina e certificar-se de que ele não chame a funçãoNdisFSendNetBufferListsComplete quando essas solicitações forem concluídas.
Filtrando solicitações de envio
A figura a seguir ilustra a filtragem de um pedido de envio iniciado por um driver subjacente.
O NDIS chama a função FilterSendNetBufferLists de um driver de filtro para processar o pedido de envio de um driver sobreposto.
O driver de filtro não deve modificar o membro SourceHandle nas estruturas de NET_BUFFER_LIST que recebe de outros drivers.
O driver de filtro pode filtrar os dados e enviar os dados filtrados para os drivers subjacentes. Para cada estrutura NET_BUFFER submetida ao FilterSendNetBufferLists, um driver de filtro pode fazer o seguinte:
Passe o buffer para o próximo driver subjacente chamando a função NdisFSendNetBufferLists . O NDIS garante a disponibilidade de espaço de contexto (consulte a estrutura NET_BUFFER_LIST_CONTEXT) para controladores de filtro. O driver de filtro pode modificar o conteúdo do buffer antes de chamar NdisFSendNetBufferLists. O processamento dos dados filtrados prossegue como uma operação de envio iniciada por um driver de filtro.
Libere o buffer utilizando a função NdisFSendNetBufferListsComplete.
Enfileire o buffer em uma estrutura de dados local para processamento posterior. O design do driver de filtro determina o que leva o driver a processar um buffer em fila. Alguns exemplos incluem o processamento após um tempo limite ou o processamento após o recebimento de um buffer específico.
Nota Se as filas de drivers enviarem solicitações para processamento posterior, elas deverão suportar solicitações de cancelamento de envio. Para obter mais informações sobre como cancelar solicitações de envio, consulte Cancelamento de solicitações de envio num driver de filtro.
Copie o buffer e origine uma solicitação de envio com a cópia. A operação de envio é semelhante a uma solicitação de envio iniciada por um driver de filtro. Nesse caso, o driver deve retornar o buffer original para o driver subjacente chamando a função NdisFSendNetBufferListsComplete.
A conclusão das solicitações de envio prossegue pela pilha de drivers. Quando o driver de miniporta chama a função NdisMSendNetBufferListsComplete , o NDIS chama a função FilterSendNetBufferListsComplete para o módulo de filtro de nível mais acima mais baixo.
Após a conclusão da operação de envio, o driver de filtro reverte as modificações nos descritores de buffer do driver subjacente que o driver de filtro fez em FilterSendNetBufferLists. O driver chama a funçãoNdisFSendNetBufferListsComplete para retornar a lista vinculada de estruturas de NET_BUFFER_LIST para os drivers sobrepostos e retornar o status final da solicitação de envio.
Quando o módulo de filtro superior chama NdisFSendNetBufferListsComplete, o NDIS chama a função ProtocolSendNetBufferListsComplete do driver de protocolo de origem.
Um driver de filtro que não fornece uma função FilterSendNetBufferLists ainda pode iniciar uma solicitação de envio. Se esse driver iniciar uma solicitação de envio, ele deve fornecer uma função de FilterSendNetBufferListsComplete e não deve passar o evento completo para cima na pilha de drivers.
Um controlador de filtro pode passar ou filtrar a solicitação de loopback de um driver subjacente. Para encaminhar uma solicitação de loopback, se o NDIS definir o NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK no parâmetro SendFlags de FilterSendNetBufferLists, o driver de filtro deve também definir o NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK no parâmetro SendFlags quando chamar o NdisFSendNetBufferLists. O NDIS indica um pacote recebido que contém os dados de envio.
Em geral, se um driver de filtro modifica qualquer comportamento de tal forma que o NDIS não pode fornecer um serviço padrão (como loopback), o driver de filtro deve fornecer esse serviço para NDIS. Por exemplo, um driver de filtro que modifica uma solicitação para o endereço de hardware (consulte OID_802_3_CURRENT_ADDRESS), deve gerir o loopback dos buffers direcionados para o novo endereço de hardware. Nesse caso, o NDIS não pode fornecer o serviço de loopback que normalmente fornece porque o filtro alterou o endereço. Além disso, se o driver de filtro definir o modo promíscuo (consulte OID_GEN_CURRENT_PACKET_FILTER), ele não deve passar os dados extras que recebe para os drivers subjacentes.