Recebendo dados em drivers de protocolo
A figura a seguir ilustra uma operação básica de recebimento, que envolve um driver de protocolo, NDIS e drivers subjacentes em uma pilha de driver.
O NDIS chama a função ProtocolReceiveNetBufferLists de um driver de protocolo para processar indicações de recebimento provenientes de drivers subjacentes. O NDIS chama ProtocolReceiveNetBufferLists depois que um driver subjacente chama uma função de indicação de recebimento (por exemplo, NdisMIndicateReceiveNetBufferLists) para indicar dados de rede recebidos ou dados de loop-back.
Se o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags de ProtocolReceiveNetBufferLists não estiver definido, o driver de protocolo manterá a propriedade das estruturas NET_BUFFER_LIST até chamar a função NdisReturnNetBufferLists . Se o NDIS definir o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES , o driver de protocolo não poderá reter a estrutura NET_BUFFER_LIST e os recursos associados. O sinalizador de NDIS_RECEIVE_FLAGS_RESOURCES definido indica que um driver subjacente está com poucos recursos de recebimento. Nesse caso, a função ProtocolReceiveNetBufferLists deve copiar os dados recebidos no armazenamento alocado por protocolo e retornar o mais rápido possível.
Nota O NDIS pode alterar os sinalizadores que um driver subjacente indica. Por exemplo, se um driver de miniporto definir o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags da função NdisMIndicateReceiveNetBufferLists , o NDIS poderá copiar os dados indicados e passar a cópia para ProtocolReceiveNetBufferLists com o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES limpo.
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.
Os drivers de protocolo chamam a função NdisReturnNetBufferLists para liberar a propriedade de uma lista de estruturas de NET_BUFFER_LIST , juntamente com as estruturas de NET_BUFFER associadas e os dados de rede.