MINIPORT_SEND_NET_BUFFER_LISTS Rückruffunktion (ndis.h)
NDIS ruft die MiniportSendNetBufferLists-Funktion auf, um Netzwerkdaten zu übertragen, die in einer verknüpften Liste von NET_BUFFER_LIST Strukturen enthalten sind.
Syntax
MINIPORT_SEND_NET_BUFFER_LISTS MiniportSendNetBufferLists;
void MiniportSendNetBufferLists(
[in] NDIS_HANDLE MiniportAdapterContext,
[in] PNET_BUFFER_LIST NetBufferList,
[in] NDIS_PORT_NUMBER PortNumber,
[in] ULONG SendFlags
)
{...}
Parameter
[in] MiniportAdapterContext
Ein Handle für einen Kontextbereich, den der Miniporttreiber in seiner MiniportInitializeEx-Funktion zugeordnet hat. Der Miniporttreiber verwendet diesen Kontextbereich, um Zustandsinformationen zu einem Adapter zu verwalten.
[in] NetBufferList
Ein Zeiger auf die erste NET_BUFFER_LIST Struktur in einer verknüpften Liste von NET_BUFFER_LIST Strukturen. Jede NET_BUFFER_LIST Struktur in der Liste beschreibt eine Liste von NET_BUFFER Strukturen. Jede NET_BUFFER Struktur in der Liste wird einer Kette von MDLs zugeordnet. Die MDLs enthalten die Netzwerkdaten.
[in] PortNumber
Eine Portnummer, die einen Miniportadapterportport identifiziert. Um eine Miniportadapterportnummer zuzuweisen, rufen Sie die Funktion NdisMAllocatePort auf. Ein Nullwert gibt den Standardport eines Miniportadapters an.
[in] SendFlags
Flags, die Attribute für den Sendevorgang definieren. Die Flags können mit einem OR-Vorgang kombiniert werden. Um alle Flags zu löschen, legen Sie diesen Member auf 0 fest. Diese Funktion unterstützt die folgenden Flags:
NDIS_SEND_FLAGS_DISPATCH_LEVEL
Gibt an, dass die aktuelle IRQL DISPATCH_LEVEL ist. Weitere Informationen zu diesem Flag finden Sie unter Dispatch IRQL Tracking.
NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK
Gibt an, dass NDIS auf Loopback überprüfen soll. Standardmäßig stellt NDIS keine Daten an den Treiber zurück, der die Sendeanforderung übermittelt hat. Ein überlastender Treiber kann dieses Verhalten überschreiben, indem er dieses Flag festlegt. Wenn dieses Flag festgelegt ist, identifiziert NDIS alle NET_BUFFER Strukturen, die Daten enthalten, die den Empfangskriterien für die Bindung entsprechen. NDIS gibt NET_BUFFER Strukturen an, die die Kriterien dem überlastenden Treiber entsprechen. Dieses Flag hat keinen Einfluss auf die Überprüfung auf Loopback oder Das Zurückschleifen von anderen Bindungen.
Rückgabewert
Keine
Bemerkungen
MiniportSendNetBufferLists ist eine erforderliche Funktion für Miniporttreiber. Wenn ein überlastende Treiber die NdisSendNetBufferLists-Funktion aufruft , ruft NDIS die MiniportSendNetBufferLists-Funktion des gebundenen Miniporttreibers auf.
Beim Übertragen der Netzwerkdaten, die NDIS im NetBufferLists-Parameter übergibt, muss der Miniporttreiber die folgenden Richtlinien verwenden:
- Die Reihenfolge der NET_BUFFER Strukturen in jeder NET_BUFFER_LIST-Struktur muss beibehalten werden.
- Die Reihenfolge der NET_BUFFER_LIST Strukturen sollte beibehalten werden, wenn sie über dieselbe Verbindung übertragen werden sollen.
-
Wenn die NET_BUFFER_LIST Strukturen auf verschiedenen Verbindungen übertragen werden sollen, können sie in mehrere Übertragungswarteschlangen unterteilt werden, wenn die folgenden Features verwendet werden. In diesem Fall sollte die Reihenfolge der NET_BUFFER_LIST Strukturen für jede Verbindung beibehalten werden.
- Receive Side Scaling (RSS) (Der RSS-Hashwert in der NET_BUFFER_LIST-Struktur kann als Index in der RSS-Indirektionstabelle verwendet werden.)
- Warteschlange für virtuelle Computer (VMQ) (Der Warteschlangenbezeichner der ausgehenden Warteschlange wird in den OOB-Informationen von NetBufferListFilteringInfo festgelegt. Weitere Informationen finden Sie unter VMQ-Übertragungspfad.)
- IEEE 802.1 Data Center Bridging (DCB) (Sie können die Traffic Class (TC) deaktivieren.)
- IEEE 802.1p (Sie können 802.1p-Tags ohne DCB ausschalten.)
Miniport-Treiber akzeptieren alle Sendeanforderungen, die NDIS stellt, indem sie die Funktion MiniportSendNetBufferLists aufrufen. Wenn ein Miniporttreiber eine Sendeanforderung nicht sofort abschließen kann, muss der Treiber die Anforderung in einer Warteschlange halten, bis er die Anforderung abschließen kann. Während eine Sendeanforderung aussteht, behält der Miniporttreiber den Besitz der NET_BUFFER_LIST-Strukturen und aller protokollseitig zugeordneten Ressourcen, die den NET_BUFFER_LIST-Strukturen zugeordnet sind.
Der Miniporttreiber muss den NdisMSendNetBufferListsComplete-Funktion zum Abschließen der Sendeanforderungen für alle NET_BUFFER_LIST-Strukturen. Um die Systemleistung zu verbessern, kann der Treiber eine verknüpfte Liste erstellen, die die NET_BUFFER_LIST Strukturen aus mehreren Sendeanforderungen enthält. Der Treiber kann eine solche verknüpfte Liste dann in einem einzigen Aufruf an NdisMSendNetBufferListsComplete übergeben.NET_BUFFER_LIST Strukturen und andere zugeordnete Ressourcen sollten vom Miniporttreiber als unzugänglich behandelt werden, sobald der Treiber NdisMSendNetBufferListsComplete aufruft.
Die MiniportSendNetBufferLists-Funktion muss den Zugriff auf ihre internen Warteschlangen mit Netzwerkdaten mit den anderen MiniportXxx-Funktionen des Treibers synchronisieren, die auf dieselben Warteschlangen zugreifen. Ein Miniporttreiber kann Drehsperren verwenden, um den Zugriff auf die Warteschlangen zu synchronisieren.
Protokolltreiber sind für die Bestimmung der erforderlichen Netzwerkdaten verantwortlich, basierend auf dem vom gebundenen Miniporttreiber ausgewählten Mittleren Typ. Ein Protokolltreiber kann jedoch Netzwerkdaten bereitstellen, die Pakete angeben, die kürzer als die Mindestpaketgröße für das ausgewählte Medium sind. In diesem Fall muss MiniportSendNetBufferLists die Pakete mit Nullen polstern, wenn das ausgewählte Medium eine Mindestlänge für die Übertragungspaketgröße aufzwingt.
Wenn der Miniporttreiber das NDIS_MAC_OPTION_NO_LOOPBACK-Flag festgelegt hat, wenn NDIS die OID_GEN_MAC_OPTIONS OID abgefragt hat, darf der Miniporttreiber nicht versuchen, Netzwerkdaten zurückzuschleifen. NDIS bietet Software-Loopbackunterstützung für einen solchen Treiber.
NDIS ruft MiniportSendNetBufferLists unter IRQL<= DISPATCH_LEVEL auf.
Beispiele
Um eine MiniportSendNetBufferLists-Funktion zu definieren, müssen Sie zunächst eine Funktionsdeklaration bereitstellen, die den Typ der zu definierenden Funktion identifiziert. Windows stellt eine Reihe von Funktionstypen für Treiber bereit. Das Deklarieren einer Funktion mithilfe der Funktionstypen hilft der Codeanalyse für Treiber, der statischen Treiberüberprüfung (Static Driver Verifier , SDV) und anderen Überprüfungstools, Fehler zu finden, und es ist eine Anforderung zum Schreiben von Treibern für das Windows-Betriebssystem.Um beispielsweise eine MiniportSendNetBufferLists-Funktion mit dem Namen "MySendNetBufferLists" zu definieren, verwenden Sie den MINIPORT_SEND_NET_BUFFER_LISTS-Typ , wie in diesem Codebeispiel gezeigt:
MINIPORT_SEND_NET_BUFFER_LISTS MySendNetBufferLists;
Implementieren Sie dann Ihre Funktion wie folgt:
_Use_decl_annotations_
VOID
MySendNetBufferLists(
NDIS_HANDLE MiniportAdapterContext,
PNET_BUFFER_LIST NetBufferList,
NDIS_PORT_NUMBER PortNumber,
ULONG SendFlags
)
{...}
Der MINIPORT_SEND_NET_BUFFER_LISTS Funktionstyp ist in der Headerdatei Ndis.h definiert. Um Fehler beim Ausführen der Codeanalysetools genauer zu identifizieren, fügen Sie der Funktionsdefinition die Use_decl_annotations Anmerkung hinzu. Die Use_decl_annotations Anmerkung stellt sicher, dass die Anmerkungen verwendet werden, die auf den MINIPORT_SEND_NET_BUFFER_LISTS Funktionstyp in der Headerdatei angewendet werden. Weitere Informationen zu den Anforderungen für Funktionsdeklarationen finden Sie unter Deklarieren von Funktionen mithilfe von Funktionsrollentypen für NDIS-Treiber.
Informationen zu Use_decl_annotations finden Sie unter Verhalten von Funktionen mit Anmerkungen.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Unterstützt in NDIS 6.0 und höher. |
Zielplattform | Windows |
Kopfzeile | ndis.h (einschließlich Ndis.h) |
IRQL | <= DISPATCH_LEVEL |
DDI-Complianceregeln | NdisTimedDataHang, NdisTimedDataSend |