NET_BUFFER_LIST Struktur (ndis/nbl.h)
Die NET_BUFFER_LIST-Struktur gibt eine verknüpfte Liste von NET_BUFFER Strukturen an.
Syntax
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;
Angehörige
Next
Die nächste NET_BUFFER_LIST Struktur in der Kette.
Treiber sollten nicht direkt auf dieses Mitglied zugreifen. Stattdessen sollten sie das NET_BUFFER_LIST_NEXT_NBL Makro aufrufen.
FirstNetBuffer
Die erste NET_BUFFER auf diesem NET_BUFFER_LIST.
Treiber sollten nicht direkt auf dieses Mitglied zugreifen. Stattdessen sollten sie das NET_BUFFER_LIST_FIRST_NB Makro aufrufen.
Link
Reserviert für NDIS.
NetBufferListHeader
Eine NET_BUFFER_LIST_HEADER Struktur.
Context
Ein Zeiger auf eine NET_BUFFER_LIST_CONTEXT Struktur. Protokoll- und Miniporttreiber verwenden diese Struktur, um Informationen zur NET_BUFFER_LIST Struktur zu speichern. In der NET_BUFFER_LIST_CONTEXT-Struktur gespeicherte Informationen sind undurchsichtig für NDIS und andere Treiber im Stapel.
Verwenden Sie die folgenden Funktionen und Makros, um auf Daten in der NET_BUFFER_LIST_CONTEXT-Struktur zuzugreifen:
NdisAllocateNetBufferListContext NdisFreeNetBufferListContext NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZEParentNetBufferList
Wenn es sich bei dieser NET_BUFFER_LIST Struktur um einen Klon einer anderen NET_BUFFER_LIST Struktur handelt, gibt dieses Element einen Zeiger auf die übergeordnete NET_BUFFER_LIST Struktur an. Andernfalls ist dieser Parameter NULL-. Ein Treiber verwendet die NdisAllocateCloneNetBufferList Funktion zum Erstellen eines Klons.
NdisPoolHandle
Ein Poolhandle, das den NET_BUFFER_LIST Pool identifiziert, aus dem die NET_BUFFER_LIST Struktur zugeordnet wurde.
NdisReserved[2]
Reserviert für die Verwendung durch NDIS.
ProtocolReserved[4]
Reserviert für die Verwendung durch Protokolltreiber.
MiniportReserved[2]
Reserviert für die Verwendung durch Miniporttreiber.
Scratch
Daten, die vom aktuellen Besitzer der NET_BUFFER_LIST Struktur definiert werden. Der aktuelle Besitzer, entweder NDIS oder ein NDIS-Treiber, kann dieses Mitglied zu eigenen Zwecken verwenden. Wenn die NET_BUFFER_LIST Struktur anfangs zugewiesen wird, wird dieses Element NULL-. Nachdem der aktuelle Besitzer den Besitz zurückgibt, kann NDIS oder ein anderer Treiber dieses Mitglied überschreiben.
SourceHandle
Ein Handle, das NDIS dem Treiber in einem Bindungs- oder Anfügenvorgang mithilfe einer der folgenden vom Treiber bereitgestellten Routinen bereitgestellt wird:
Miniport-Treiber
Protokolltreiber
Filtertreiber
NDIS verwendet SourceHandle-, um die NET_BUFFER_LIST Struktur an den Treiber zurückzugeben, der die NET_BUFFER_LIST Struktur gesendet hat.
NblFlags
Dieses Element enthält Flags, die mit einem bitweisen OR-Vorgang kombiniert werden können.
Verwenden Sie die NdisTestNblFlag, NdisTestNblFlags, NdisSetNblFlagund NdisClearNblFlag Makros, um auf die Flags zuzugreifen.
Zwischentreiber und Filtertreiber können die folgenden Flags festlegen, wenn sie keine Daten ändern, die einem NET_BUFFER_LIST zugeordnet sind. Wenn sich die Daten beispielsweise nicht geändert haben, kann NDIS die ursprünglichen Informationen wiederverwenden, aus denen die NET_BUFFER_LIST erstellt wurde.
NDIS_NBL_FLAGS_SEND_READ_ONLY
Wenn festgelegt, sind die NET_BUFFER_LIST Struktur und die zugehörigen Daten für Sendevorgänge schreibgeschützt.
NDIS_NBL_FLAGS_RECV_READ_ONLY
Bei Festlegung sind die NET_BUFFER_LIST Struktur und die zugehörigen Daten für Empfangsvorgänge schreibgeschützt.
Ein Treiber kann die folgenden Flags auch dann festlegen, wenn er den zugeordneten Ethernet-Frame nicht teilt:
NDIS_NBL_FLAGS_IS_IPV4
Alle Ethernet-Frames in dieser NET_BUFFER_LIST-Struktur sind IPv4-Frames. Wenn dieses Flag festgelegt ist, darf der Anbieter für die Aufteilung von Headerdaten das NDIS_NBL_FLAGS_IS_IPV6 Flag nicht festlegen.
NDIS_NBL_FLAGS_IS_IPV6
Alle Ethernet-Frames in dieser NET_BUFFER_LIST Struktur sind IPv6-Frames. Wenn dieses Flag festgelegt ist, darf der Anbieter für die Aufteilung von Headerdaten das NDIS_NBL_FLAGS_IS_IPV4 Flag nicht festlegen.
NDIS_NBL_FLAGS_IS_TCP
Alle Ethernet-Frames in dieser NET_BUFFER_LIST Struktur sind TCP-Frames. Wenn dieses Flag festgelegt ist, darf der Anbieter für die Aufteilung von Headerdaten das NDIS_NBL_FLAGS_IS_UDP Flag nicht festlegen, und der Anbieter muss das NDIS_NBL_FLAGS_IS_IPV4-Flag oder das NDIS_NBL_FLAGS_IS_IPV6-Flag festlegen.
NDIS_NBL_FLAGS_IS_UDP
Alle Ethernet-Frames in dieser NET_BUFFER_LIST Struktur sind UDP-Frames. Wenn dieses Flag festgelegt ist, darf der Anbieter für die Aufteilung von Headerdaten das NDIS_NBL_FLAGS_IS_TCP Flag nicht festlegen, und der Anbieter muss das NDIS_NBL_FLAGS_IS_IPV4-Flag oder das NDIS_NBL_FLAGS_IS_IPV6-Flag festlegen.
NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET
Alle Pakete, die dieser NET_BUFFER_LIST Struktur zugeordnet sind, sind Loopbackpakete.
Wenn der Split-Anbieter für Headerdaten den zugeordneten Ethernet-Frame nicht aufteilt, muss der Miniporttreiber die NET_BUFFER_LIST Struktur mit den folgenden Flags angeben:
NDIS_NBL_FLAGS_HD_SPLIT
Der Header und die Daten werden in allen Ethernet-Frames aufgeteilt, die dieser NET_BUFFER_LIST Struktur zugeordnet sind.
NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER
Alle Ethernet-Frames in diesem NET_BUFFER_LIST werden am Anfang des Protokollheaders der oberen Ebene aufgeteilt. Wenn dieses Flag festgelegt ist, muss der Anbieter für die Aufteilung von Kopfzeilendaten das NDIS_NBL_FLAGS_IS_IPV4 Flag oder das NDIS_NBL_FLAGS_IS_IPV6 Flag festlegen. Außerdem kann der Anbieter das NDIS_NBL_FLAGS_IS_TCP Flag oder das NDIS_NBL_FLAGS_IS_UDP Flag festlegen, aber der Anbieter darf das NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD Flag nicht festlegen.
NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD
Alle Ethernet-Frames in dieser NET_BUFFER_LIST-Struktur werden am Anfang der TCP- oder UDP-Nutzlast aufgeteilt. Wenn dieses Flag festgelegt ist, muss der Anbieter für die Aufteilung von Kopfzeilendaten das NDIS_NBL_FLAGS_IS_IPV4 Flag oder das NDIS_NBL_FLAGS_IS_IPV6 Flag festlegen. Außerdem muss der Anbieter das NDIS_NBL_FLAGS_IS_TCP Flag oder das NDIS_NBL_FLAGS_IS_UDP Flag festlegen, aber der Anbieter darf das NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER Flag nicht festlegen.
ChildRefCount
Wenn diese NET_BUFFER_LIST Struktur Klonen aufweist (ist ein übergeordnetes Element), gibt dieses Element die Anzahl der ausstehenden Klonen an. Andernfalls ist dieses Element null.
Flags
Attribute der NET_BUFFER_LIST Struktur. Die folgenden Definitionen geben eine Bitmaske für eine Reihe von Flags an:
NBL_FLAGS_PROTOCOL_RESERVED
Dieser Satz ist für Protokolltreiber reserviert.
NBL_FLAGS_MINIPORT_RESERVED
Dieser Satz ist für Miniporttreiber reserviert.
NBL_FLAGS_SCRATCH
Der aktuelle Besitzer der NET_BUFFER_LIST-Struktur, entweder NDIS oder ein NDIS-Treiber, kann diesen Satz verwenden. Wenn der aktuelle Besitzer den Besitz zurückgibt, kann NDIS oder ein anderer Treiber diese Flags überschreiben.
NBL_FLAGS_NDIS_RESERVED
Dieser Satz ist für NDIS reserviert.
Status
Der endgültige Abschlussstatus eines Netzwerkdatenvorgangs für diese NET_BUFFER_LIST Struktur. Miniport-Treiber schreiben diesen Wert vor dem Aufrufen des NdisMSendNetBufferListsComplete-Funktion. Miniport-Treiber geben einen der folgenden Werte an:
NDIS_STATUS_SUCCESS
Alle durch NET_BUFFER Strukturen beschriebenen Netzwerkdaten, die dieser NET_BUFFER_LIST Struktur zugeordnet sind, wurden erfolgreich über das Netzwerk übertragen.
NDIS_STATUS_INVALID_LENGTH
Die Größe der Daten in einigen NET_BUFFER Strukturen, die dieser NET_BUFFER_LIST Struktur zugeordnet sind, war für die zugrunde liegende NIC zu groß.
NDIS_STATUS_RESOURCES
Fehler bei der Sendeanforderung für diese NET_BUFFER_LIST Struktur aufgrund unzureichender Ressourcen.
NDIS_STATUS_FAILURE
Diese Sendeanforderung für diese NET_BUFFER_LIST Struktur ist aus einem anderen Grund als den in den vorherigen drei Werten angegebenen Ursache fehlgeschlagen.
NDIS_STATUS_SEND_ABORTED
NDIS hat die MiniportCancelSend--Funktion aufgerufen, um den Sendevorgang für diese NET_BUFFER_LIST-Struktur abzubrechen.
NDIS_STATUS_RESET_IN_PROGRESS
Der Miniporttreiber hat die Sendeanforderung aufgrund einer Zurücksetzung abgebrochen.
NDIS_STATUS_PAUSED
Wenn ein Treiber Sendeanforderungen ablehnen muss, da er angehalten ist, wird der vollständige Status in jedem betroffenen NET_BUFFER_LIST auf NDIS_STATUS_PAUSED festgelegt.
NdisReserved2
Reserviert für NDIS.
NetBufferListInfo[MaxNetBufferListInfo]
Ein Array von Werten, die Informationen enthalten, die allen NET_BUFFER Strukturen in der Liste gemeinsam sind. Diese Informationen werden häufig als "Out-of-Band(OOB)-Daten" bezeichnet.
Verwenden Sie die NDIS_NET_BUFFER_LIST_INFO Enumerationswerte mit dem NET_BUFFER_LIST_INFO Makro, um Werte im NetBufferListInfo Array festzulegen und abzurufen.
Bemerkungen
NDIS-Treiber können eine der folgenden Funktionen aufrufen, um eine NET_BUFFER_LIST Struktur zuzuweisen und zu initialisieren:
NdisAllocateNetBufferAndNetBufferList NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateReassembledNetBufferListAlle NET_BUFFER Strukturen, die einer NET_BUFFER_LIST Struktur zugeordnet sind, weisen die Attribute auf, die durch die NetBufferListInfo-- und Context--Member angegeben werden.
Wenn ein Treiber die NdisSendNetBufferLists oder NdisFSendNetBufferLists-Funktion aufruft, verliert er den Besitz von:
- Die angegebene NET_BUFFER_LIST Struktur.
- Die angefügten NET_BUFFER Strukturen und MDLs.
- Alle angefügten NDIS_REQUEST_CONTROLs.
- Alle NetBufferListInfo Daten, die der NET_BUFFER_LIST Struktur zugeordnet sind.
Eine Liste der NET_BUFFER_LIST Strukturen ist eine einfache, einfach verknüpfte und NULL-beendete Liste. Um eine NET_BUFFER_LIST Struktur in eine andere Liste zu verschieben, nehmen Sie die entsprechenden Aktualisierungen an den Next-Membern in den Quell- und Ziellisten vor.
Verwenden Sie die folgenden Makros und Funktionen, um auf Elemente der NET_BUFFER_LIST-Struktur zuzugreifen:
NET_BUFFER_LIST_MINIPORT_RESERVED NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZE NET_BUFFER_LIST_PROTOCOL_RESERVED NdisGetPoolFromNetBufferListWeitere Informationen zur Verwendung von Netzpuffern finden Sie unter NET_BUFFER Architecture.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Unterstützt in NDIS 6.0 und höher. |
Header- | ndis/nbl.h (include ndis.h) |