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.
A figura a seguir ilustra uma operação de recebimento básica, que envolve um driver de miniporta, NDIS e um driver de protocolo.
Os drivers de miniporta chamam a função NdisMIndicateReceiveNetBufferLists para indicar as estruturas NET_BUFFER para drivers de nível superior. Cada estrutura NET_BUFFER deve normalmente ser ligada a uma estrutura NET_BUFFER_LIST separada. Isso permite que os drivers de protocolo criem um subconjunto da lista original de estruturas NET_BUFFER_LIST e os encaminhem para clientes diferentes. Alguns drivers, como os drivers nativos de miniporta IEEE 802.11, 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 miniporta passa um ponteiro para a primeira estrutura NET_BUFFER_LIST na lista para a função NdisMIndicateReceiveNetBufferLists . O NDIS examina as estruturas NET_BUFFER_LIST e chama a função ProtocolReceiveNetBufferLists de cada driver de protocolo associado às estruturas NET_BUFFER_LIST. O NDIS transmite um subconjunto da lista que inclui apenas as estruturas NET_BUFFER_LIST associadas à ligação correta a cada controlador de protocolo. O NDIS compara o valor de NetBufferListFrameType especificado na estrutura NET_BUFFER_LIST com o tipo de quadro que cada controlador de protocolo regista.
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 NET_BUFFER_LIST imediatamente após o retorno da chamada ProtocolReceiveNetBufferLists.
Observação Se o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES estiver definido, o driver de protocolo deve manter o conjunto original de estruturas de NET_BUFFER_LIST na lista vinculada. Por exemplo, quando esse sinalizador é definido, o driver pode processar as estruturas e indicá-las na pilha, uma de cada vez, mas antes que a função retorne, ela deve restaurar a lista vinculada original.
Se o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags, que é passado para a função ProtocolReceiveNetBufferLists de um driver de protocolo, não estiver definido, o driver de protocolo pode manter a posse das estruturas NET_BUFFER_LIST. Nesse caso, o driver de protocolo deve retornar as estruturas NET_BUFFER_LIST chamando a função NdisReturnNetBufferLists.
Se um driver de miniporta estiver com poucos recursos de receção, poderá definir o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags na chamada para NdisMIndicateReceiveNetBufferLists. Nesse caso, o driver pode recuperar a posse de todas as estruturas indicadas NET_BUFFER_LIST e das estruturas incorporadas NET_BUFFER assim que NdisMIndicateReceiveNetBufferLists retornar. Indicar estruturas NET_BUFFER com os sinalizadores NDIS_RECEIVE_FLAGS_RESOURCES definidos força os drivers de protocolo a copiar os dados e, portanto, devem ser evitadas. Um driver de miniporta deve detetar quando está prestes a ficar sem recursos de recebimento e tomar todas as medidas necessárias para evitar essa situação.
O NDIS chama a função MiniportReturnNetBufferLists de um driver de miniporta após o driver de protocolo chamar NdisReturnNetBufferLists.
Nota Se um driver de miniporta indicar uma estrutura NET_BUFFER_LIST com o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES definido, isso não implica que o NDIS irá indicar a estrutura NET_BUFFER_LIST ao driver de protocolo com o mesmo estado. Por exemplo, o NDIS pode copiar uma estrutura NET_BUFFER_LIST com o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES definido e indicar a cópia ao controlador de protocolo com o sinalizador desativado.
O NDIS pode retornar estruturas NET_BUFFER_LIST ao driver de miniporta em qualquer ordem e em qualquer combinação. Ou seja, a lista ligada de estruturas NET_BUFFER_LIST retornadas a um driver de miniporta por meio de uma chamada para a sua função MiniportReturnNetBufferLists, pode conter estruturas NET_BUFFER_LIST originadas de diferentes chamadas anteriores para NdisMIndicateReceiveNetBufferLists.
Os drivers de miniporta devem definir o membro SourceHandle nas estruturas NET_BUFFER_LIST para o MiniportAdapterHandle que o NDIS forneceu ao driver de miniporta na função MiniportInitializeEx. Os drivers de filtro devem definir o membro SourceHandle de cada estrutura de NET_BUFFER_LIST que o driver de filtro originou para o NdisFilterHandle que o NDIS forneceu ao driver de filtro na função FilterAttach. Os drivers de filtro não devem modificar o membro SourceHandle em estruturas NET_BUFFER_LIST que não tenham sido originadas 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 deve salvar o valor SourceHandle que o driver subjacente forneceu antes de escrever no membro SourceHandle. Quando o NDIS retorna uma estrutura de NET_BUFFER_LIST encaminhada para o driver intermediário, o driver intermediário deve restaurar o SourceHandle que ele salvou.