Recebendo dados de rede
A figura a seguir ilustra uma operação básica de recebimento, que envolve um driver de miniporta, NDIS e um driver de protocolo.
Os drivers de miniport chamam a função NdisMIndicateReceiveNetBufferLists para indicar NET_BUFFER estruturas para drivers de nível mais alto. Cada estrutura de NET_BUFFER geralmente deve ser anexada a uma estrutura NET_BUFFER_LIST separada. Isso permite que os drivers de protocolo criem um subconjunto da lista original de estruturas de NET_BUFFER_LIST e os encaminhem para clientes diferentes. Alguns drivers, por exemplo, drivers de miniporta IEEE 802.11 nativos, podem anexar mais de uma estrutura NET_BUFFER a uma estrutura NET_BUFFER_LIST.
Depois de vincular todas as estruturas NET_BUFFER_LIST, um driver de miniporto passa um ponteiro para a primeira estrutura NET_BUFFER_LIST na lista para a função NdisMIndicateReceiveNetBufferLists . O NDIS examina as estruturas de NET_BUFFER_LIST e chama a função ProtocolReceiveNetBufferLists de cada driver de protocolo associado às estruturas de NET_BUFFER_LIST. O NDIS passa um subconjunto da lista que inclui apenas as estruturas de NET_BUFFER_LIST associadas à associação correta a cada driver de protocolo. O NDIS corresponde ao valor NetBufferListFrameType especificado na estrutura NET_BUFFER_LIST com o tipo de quadro registrado por cada driver de protocolo.
Se o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags que é passado para a função ProtocolReceiveNetBufferLists de um driver de protocolo estiver definido, o NDIS recuperará a propriedade das estruturas de NET_BUFFER_LIST imediatamente após o retorno da chamada ProtocolReceiveNetBufferLists .
Nota Se o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES estiver definido, o driver de protocolo deverá manter o conjunto original de estruturas NET_BUFFER_LIST na lista vinculada. Por exemplo, quando esse sinalizador é definido, o driver pode processar as estruturas e indique-as na pilha um de cada vez, mas antes que a função retorne, ele deve restaurar a lista vinculada original.
Se o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags passado para a função ProtocolReceiveNetBufferLists de um driver de protocolo não estiver definido, o driver de protocolo poderá manter a propriedade das estruturas NET_BUFFER_LIST. Nesse caso, o driver de protocolo deve retornar as estruturas de NET_BUFFER_LIST chamando a função NdisReturnNetBufferLists .
Se um driver de miniporta estiver com poucos recursos de recebimento, ele poderá definir o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags na chamada para NdisMIndicateReceiveNetBufferLists. Nesse caso, o driver pode recuperar a propriedade de todas as estruturas de NET_BUFFER_LIST indicadas e estruturas de NET_BUFFER inseridas assim que NdisMIndicateReceiveNetBufferLists retornar. Indicar NET_BUFFER estruturas com o conjunto de sinalizadores NDIS_RECEIVE_FLAGS_RESOURCES força os drivers de protocolo a copiar os dados e, portanto, deve ser evitado. Um driver de miniporta deve detectar quando está prestes a ficar sem recursos de recebimento e tomar as etapas necessárias para evitar essa situação.
O NDIS chama a função MiniportReturnNetBufferLists de um driver de miniport após o driver de protocolo chamar NdisReturnNetBufferLists.
Nota Se um driver de miniporto indicar uma estrutura NET_BUFFER_LIST com o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES definido, isso não significa que o NDIS indicará a estrutura NET_BUFFER_LIST para o driver de protocolo com o mesmo status. Por exemplo, o NDIS pode copiar uma estrutura de NET_BUFFER_LIST com o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES definido e indicar a cópia para o driver de protocolo com o sinalizador limpo.
O NDIS pode retornar NET_BUFFER_LIST estruturas para o driver de miniporta em qualquer ordem arbitrária e em qualquer combinação. Ou seja, a lista vinculada de estruturas de NET_BUFFER_LIST retornadas para um driver de miniport por uma chamada para sua função MiniportReturnNetBufferLists pode ter estruturas NET_BUFFER_LIST de diferentes chamadas anteriores para NdisMIndicateReceiveNetBufferLists.
Os drivers de miniport devem definir o membro SourceHandle nas estruturas NET_BUFFER_LIST para o MiniportAdapterHandle que o NDIS forneceu ao driver de miniport na função MiniportInitializeEx . Os drivers de filtro devem definir o membro SourceHandle de cada estrutura NET_BUFFER_LIST que o driver de filtro originou para o NdisFilterHandle do filtro que o NDIS forneceu ao driver de filtro na função FilterAttach . Os drivers de filtro não devem modificar o membro SourceHandle em nenhuma estrutura NET_BUFFER_LIST que não tenha sido originada pelo driver de filtro.
Os drivers intermediários também definem o membro SourceHandle na estrutura NET_BUFFER_LIST para o valor MiniportAdapterHandle que o NDIS forneceu ao driver intermediário na função MiniportInitializeEx . Se um driver intermediário encaminhar uma indicação de recebimento, o driver deverá salvar o valor SourceHandle que o driver subjacente forneceu antes de gravar no membro SourceHandle . Quando o NDIS retorna uma estrutura NET_BUFFER_LIST encaminhada para o driver intermediário, o driver intermediário deve restaurar o SourceHandle que salvou.