Enviando dados de um driver de filtro
Os drivers de filtro podem iniciar solicitações de envio ou filtrar solicitações de envio iniciadas por drivers em excesso. Quando um driver de protocolo chama a função NdisSendNetBufferLists , o NDIS envia a estrutura de NET_BUFFER_LIST especificada para o módulo de filtro mais alto na pilha de driver.
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 definidos em uma lista de estruturas de NET_BUFFER_LIST .
Um driver de filtro deve definir o membro SourceHandle de cada estrutura NET_BUFFER_LIST que ele cria com o mesmo valor que ele passa para o parâmetro NdisFilterHandle de NdisFSendNetBufferLists. Os drivers NDIS não devem modificar o membro SourceHandle para estruturas de NET_BUFFER_LIST que o driver não se originou.
Antes de chamar NdisFSendNetBufferLists, um driver de filtro pode definir informações que acompanham a solicitação de envio com 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 de NET_BUFFER_LIST e de todos os recursos associados. O NDIS pode lidar com a solicitação de envio ou passar a solicitação para drivers subjacentes.
O NDIS chama a função FilterSendNetBufferListsComplete para retornar as estruturas e os dados para o driver de filtro. O NDIS pode coletar as estruturas e dados de várias solicitações de envio em uma única lista vinculada de estruturas de NET_BUFFER_LIST antes de passar a lista para FilterSendNetBufferListsComplete
Até que o NDIS chame FilterSendNetBufferListsComplete, a status atual de uma solicitação de envio é desconhecida. 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 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 dados de rede fornecidos por filtro para os drivers subjacentes na ordem determinada 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 loopback para enviar solicitações originadas. 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.
Nota Um driver de filtro deve acompanhar as solicitações de envio originadas e garantir que ele não chame a função NdisFSendNetBufferListsComplete quando essas solicitações forem concluídas.
Filtrando enviar solicitações
A figura a seguir ilustra a filtragem de uma solicitação de envio iniciada por um driver sobressoido.
O NDIS chama a função FilterSendNetBufferLists de um driver de filtro para filtrar a solicitação de envio de um driver sobressociente.
O driver de filtro não deve modificar o membro SourceHandle nas estruturas NET_BUFFER_LIST que recebe de outros drivers.
O driver de filtro pode filtrar os dados e enviar os dados filtrados para drivers subjacentes. Para cada estrutura de NET_BUFFER enviada a 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 do espaço de contexto (consulte NET_BUFFER_LIST_CONTEXT estrutura) para drivers de filtro. O driver de filtro pode modificar o conteúdo do buffer antes de chamar NdisFSendNetBufferLists. O processamento dos dados filtrados prossegue como em uma operação de envio iniciada por um driver de filtro.
Solte o buffer chamando a função NdisFSendNetBufferListsComplete .
Enfileirar o buffer em uma estrutura de dados local para processamento posterior. O design do driver de filtro determina o que faz com que o driver processe um buffer enfileirado. Alguns exemplos incluem processamento após um tempo limite ou processamento depois que um buffer específico é recebido.
Nota Se as filas de driver enviarem solicitações para processamento posterior, ele deverá dar suporte a solicitações de envio de cancelamento. Para obter mais informações sobre como enviar solicitações de cancelamento, consulte Canceling Send Requests in a Filter Driver(Canceling Send Requests in a Filter Driver).
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 pelo driver de filtro. Nesse caso, o driver deve retornar o buffer original para o driver sobreposto chamando a função NdisFSendNetBufferListsComplete .
A conclusão das solicitações de envio aumenta a pilha do driver. Quando o driver de miniporto chama a função NdisMSendNetBufferListsComplete , o NDIS chama a função FilterSendNetBufferListsComplete para o módulo de filtro mais baixo sobreposto.
Após a conclusão da operação de envio, o driver de filtro inverte as modificações nos descritores de buffer do driver sobressociente que o driver de filtro fez em FilterSendNetBufferLists. O driver chama a função NdisFSendNetBufferListsComplete 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 mais alto 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 deverá fornecer uma função FilterSendNetBufferListsComplete e não deverá passar o evento completo para cima na pilha do driver.
Um driver de filtro pode passar ou filtrar a solicitação de loopback de um driver subjacente. Para passar uma solicitação de loopback, se o NDIS definir NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK no parâmetro SendFlags de FilterSendNetBufferLists, o driver de filtro definirá NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK no parâmetro SendFlags quando chamar NdisFSendNetBufferLists. O NDIS indica um pacote recebido que contém os dados de envio.
Em geral, se um driver de filtro modificar qualquer comportamento de forma que o NDIS não possa fornecer um serviço padrão (como loopback), o driver de filtro deverá 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 manipular o loopback de 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 deverá passar os dados extras que recebe para drivers excessivamente.