estrutura NET_BUFFER_LIST (ndis/nbl.h)
A estrutura NET_BUFFER_LIST especifica uma lista vinculada de estruturas de NET_BUFFER .
Sintaxe
typedef struct _NET_BUFFER_LIST {
union {
struct {
NET_BUFFER_LIST *Next;
NET_BUFFER *FirstNetBuffer;
};
SLIST_HEADER Link;
NET_BUFFER_LIST_HEADER NetBufferListHeader;
};
NET_BUFFER_LIST_CONTEXT *Context;
NET_BUFFER_LIST *ParentNetBufferList;
NDIS_HANDLE NdisPoolHandle;
PVOID NdisReserved[2];
PVOID ProtocolReserved[4];
PVOID MiniportReserved[2];
PVOID Scratch;
NDIS_HANDLE SourceHandle;
ULONG NblFlags;
LONG ChildRefCount;
ULONG Flags;
union {
NDIS_STATUS Status;
ULONG NdisReserved2;
};
PVOID NetBufferListInfo[MaxNetBufferListInfo];
} NET_BUFFER_LIST, *PNET_BUFFER_LIST;
Membros
Next
O próximo NET_BUFFER_LIST estrutura na cadeia.
Os drivers não devem acessar esse membro diretamente. Em vez disso, eles devem chamar a macro NET_BUFFER_LIST_NEXT_NBL .
FirstNetBuffer
A primeira NET_BUFFER neste NET_BUFFER_LIST.
Os drivers não devem acessar esse membro diretamente. Em vez disso, eles devem chamar a macro NET_BUFFER_LIST_FIRST_NB .
Link
Reservado para NDIS.
NetBufferListHeader
Uma estrutura NET_BUFFER_LIST_HEADER .
Context
Um ponteiro para uma estrutura NET_BUFFER_LIST_CONTEXT . Os drivers de protocolo e miniport usam essa estrutura para armazenar informações sobre a estrutura de NET_BUFFER_LIST. As informações armazenadas na estrutura NET_BUFFER_LIST_CONTEXT são opacas para o NDIS e outros drivers na pilha.
Use as seguintes funções e macros para acessar dados na estrutura NET_BUFFER_LIST_CONTEXT:
NdisAllocateNetBufferListContext NdisFreeNetBufferListContext NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZEParentNetBufferList
Se essa estrutura NET_BUFFER_LIST for um clone de outra estrutura NET_BUFFER_LIST, esse membro especificará um ponteiro para a estrutura de NET_BUFFER_LIST pai. Caso contrário, esse parâmetro será NULL. Um driver usa o Função NdisAllocateCloneNetBufferList para criar um clone.
NdisPoolHandle
Um identificador de pool que identifica o pool de NET_BUFFER_LIST do qual a estrutura de NET_BUFFER_LIST foi alocada.
NdisReserved[2]
Reservado para uso pelo NDIS.
ProtocolReserved[4]
Reservado para uso por drivers de protocolo.
MiniportReserved[2]
Reservado para uso por drivers de miniporta.
Scratch
Dados definidos pelo proprietário atual da estrutura NET_BUFFER_LIST. O proprietário atual, NDIS ou um driver NDIS, pode usar esse membro para suas próprias finalidades. Quando a estrutura NET_BUFFER_LIST é alocada inicialmente, esse membro é NULL. Depois que o proprietário atual abrir mão da propriedade, o NDIS ou outro driver poderá substituir esse membro.
SourceHandle
Um identificador que o NDIS forneceu ao driver em uma operação de associação ou anexação usando uma das seguintes rotinas fornecidas pelo driver:
Miniport Driver
Driver de protocolo
Driver de Filtro
O NDIS usa SourceHandle para retornar a estrutura NET_BUFFER_LIST para o driver que enviou a estrutura NET_BUFFER_LIST.
NblFlags
Esse membro contém sinalizadores que podem ser combinados com uma operação OR bit a bit.
Use as macros NdisTestNblFlag, NdisTestNblFlags, NdisSetNblFlag e NdisClearNblFlag para acessar os sinalizadores.
Drivers intermediários e drivers de filtro poderão definir os sinalizadores a seguir se não modificarem os dados associados a um NET_BUFFER_LIST. Por exemplo, se os dados não forem alterados, o NDIS poderá reutilizar as informações originais das quais o NET_BUFFER_LIST foi criado.
NDIS_NBL_FLAGS_SEND_READ_ONLY
Se definido, a estrutura NET_BUFFER_LIST e seus dados serão somente leitura para operações de envio.
NDIS_NBL_FLAGS_RECV_READ_ONLY
Se definido, a estrutura NET_BUFFER_LIST e seus dados serão somente leitura para operações de recebimento.
Um driver pode definir os seguintes sinalizadores mesmo que ele não divida o quadro Ethernet associado:
NDIS_NBL_FLAGS_IS_IPV4
Todos os quadros Ethernet nesta estrutura NET_BUFFER_LIST são quadros IPv4. Se esse sinalizador for definido, o provedor de divisão de dados de cabeçalho não deverá definir o sinalizador NDIS_NBL_FLAGS_IS_IPV6.
NDIS_NBL_FLAGS_IS_IPV6
Todos os quadros Ethernet nesta estrutura NET_BUFFER_LIST são quadros IPv6. Se esse sinalizador for definido, o provedor de divisão de dados de cabeçalho não deverá definir o sinalizador NDIS_NBL_FLAGS_IS_IPV4.
NDIS_NBL_FLAGS_IS_TCP
Todos os quadros Ethernet nesta estrutura NET_BUFFER_LIST são quadros TCP. Se esse sinalizador for definido, o provedor de divisão de dados de cabeçalho não deverá definir o sinalizador de NDIS_NBL_FLAGS_IS_UDP e o provedor deverá definir o sinalizador NDIS_NBL_FLAGS_IS_IPV4 ou o sinalizador NDIS_NBL_FLAGS_IS_IPV6.
NDIS_NBL_FLAGS_IS_UDP
Todos os quadros Ethernet nesta estrutura NET_BUFFER_LIST são quadros UDP. Se esse sinalizador for definido, o provedor de divisão de dados de cabeçalho não deverá definir o sinalizador NDIS_NBL_FLAGS_IS_TCP e o provedor deverá definir o sinalizador NDIS_NBL_FLAGS_IS_IPV4 ou o sinalizador de NDIS_NBL_FLAGS_IS_IPV6.
NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET
Todos os pacotes associados a essa estrutura NET_BUFFER_LIST são pacotes de loopback.
Se o provedor de divisão de dados de cabeçalho não dividir o quadro Ethernet associado, o driver de miniporto deverá indicar a estrutura NET_BUFFER_LIST com os seguintes sinalizadores limpos:
NDIS_NBL_FLAGS_HD_SPLIT
O cabeçalho e os dados são divididos em todos os quadros Ethernet associados a essa estrutura NET_BUFFER_LIST.
NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER
Todos os quadros Ethernet neste NET_BUFFER_LIST são divididos no início do cabeçalho do protocolo de camada superior. Se esse sinalizador for definido, o provedor de divisão de dados de cabeçalho deverá definir o sinalizador NDIS_NBL_FLAGS_IS_IPV4 ou o sinalizador NDIS_NBL_FLAGS_IS_IPV6. Além disso, o provedor pode definir o sinalizador NDIS_NBL_FLAGS_IS_TCP ou o sinalizador NDIS_NBL_FLAGS_IS_UDP, mas o provedor não deve definir o sinalizador NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD.
NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD
Todos os quadros Ethernet nesta estrutura NET_BUFFER_LIST são divididos no início do conteúdo TCP ou UDP. Se esse sinalizador for definido, o provedor de divisão de dados de cabeçalho deverá definir o sinalizador NDIS_NBL_FLAGS_IS_IPV4 ou o sinalizador NDIS_NBL_FLAGS_IS_IPV6. Além disso, o provedor deve definir o sinalizador NDIS_NBL_FLAGS_IS_TCP ou o sinalizador NDIS_NBL_FLAGS_IS_UDP, mas o provedor não deve definir o sinalizador NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER.
ChildRefCount
Se essa estrutura NET_BUFFER_LIST tiver clones (é pai), esse membro especificará o número de clones pendentes. Caso contrário, esse membro será zero.
Flags
Atributos da estrutura NET_BUFFER_LIST. As definições a seguir especificam uma máscara de bits para um conjunto de sinalizadores:
NBL_FLAGS_PROTOCOL_RESERVED
Esse conjunto é reservado para drivers de protocolo.
NBL_FLAGS_MINIPORT_RESERVED
Esse conjunto é reservado para drivers de miniporta.
NBL_FLAGS_SCRATCH
O proprietário atual da estrutura NET_BUFFER_LIST, NDIS ou um driver NDIS, pode usar esse conjunto. Quando o proprietário atual renuncia à propriedade, o NDIS ou outro driver pode substituir esses sinalizadores.
NBL_FLAGS_NDIS_RESERVED
Esse conjunto é reservado para NDIS.
Status
A conclusão final status de uma operação de dados de rede nessa estrutura NET_BUFFER_LIST. Os drivers de miniporta gravam esse valor antes de chamar o Função NdisMSendNetBufferListsComplete . Os drivers de miniporto especificam um dos seguintes valores:
NDIS_STATUS_SUCCESS
Todos os dados de rede descritos por NET_BUFFER estruturas associadas a essa estrutura NET_BUFFER_LIST foram transmitidos com êxito pela rede.
NDIS_STATUS_INVALID_LENGTH
O tamanho dos dados em algumas estruturas NET_BUFFER associadas a essa estrutura NET_BUFFER_LIST era muito grande para a NIC subjacente.
NDIS_STATUS_RESOURCES
A solicitação de envio para essa estrutura NET_BUFFER_LIST falhou devido a recursos insuficientes.
NDIS_STATUS_FAILURE
Essa solicitação de envio para essa estrutura de NET_BUFFER_LIST falhou devido a algum motivo diferente daqueles declarados nos três valores anteriores.
NDIS_STATUS_SEND_ABORTED
O NDIS chamou a função MiniportCancelSend para cancelar a operação de envio para essa estrutura NET_BUFFER_LIST.
NDIS_STATUS_RESET_IN_PROGRESS
O driver de miniporte anulou a solicitação de envio devido a uma redefinição.
NDIS_STATUS_PAUSED
Se um driver precisar rejeitar solicitações de envio porque ele está em pausa, ele define o status completo em cada NET_BUFFER_LIST afetado como NDIS_STATUS_PAUSED.
NdisReserved2
Reservado para NDIS.
NetBufferListInfo[MaxNetBufferListInfo]
Uma matriz de valores que contém informações comuns a todas as estruturas NET_BUFFER na lista. Essas informações geralmente são chamadas de "dados OOB (fora de banda)".
Use o NDIS_NET_BUFFER_LIST_INFO valores de enumeração com a macro NET_BUFFER_LIST_INFO para definir e obter valores na matriz NetBufferListInfo .
Comentários
Os drivers NDIS podem chamar qualquer uma das seguintes funções para alocar e inicializar uma estrutura de NET_BUFFER_LIST:
NdisAllocateNetBufferAndNetBufferList NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateReassembledNetBufferListTodas as estruturas NET_BUFFER associadas a uma estrutura de NET_BUFFER_LIST têm os atributos especificados pelos membros NetBufferListInfo e Context .
Quando um driver chama a função NdisSendNetBufferLists ou NdisFSendNetBufferLists , ele perde a propriedade de:
- A estrutura de NET_BUFFER_LIST especificada.
- As estruturas NET_BUFFER anexadas e MDLs.
- Qualquer NDIS_REQUEST_CONTROLs anexado.
- Todos os dados NetBufferListInfo associados à estrutura NET_BUFFER_LIST.
Uma lista de estruturas de NET_BUFFER_LIST é uma lista simples vinculada e terminada por NULL. Para mover uma estrutura de NET_BUFFER_LIST para uma lista diferente, faça as atualizações apropriadas para os membros Next nas listas de origem e destino.
Para acessar membros da estrutura NET_BUFFER_LIST, use as seguintes macros e funções:
NET_BUFFER_LIST_MINIPORT_RESERVED NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZE NET_BUFFER_LIST_PROTOCOL_RESERVED NdisGetPoolFromNetBufferListPara obter mais informações sobre como usar buffers de rede, consulte Arquitetura de NET_BUFFER.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Com suporte no NDIS 6.0 e posterior. |
Cabeçalho | ndis/nbl.h (inclua ndis.h) |