Empfangen von Netzwerkdaten
Die folgende Abbildung veranschaulicht einen einfachen Empfangsvorgang, der einen Miniporttreiber, NDIS und einen Protokolltreiber umfasst.
Miniport-Treiber rufen die NdisMIndicateReceiveNetBufferLists-Funktion auf, um NET_BUFFER Strukturen für Treiber höherer Ebene anzugeben. Jede NET_BUFFER Struktur sollte normalerweise an eine separate NET_BUFFER_LIST-Struktur angefügt werden. Dadurch können Protokolltreiber eine Teilmenge der ursprünglichen Liste der NET_BUFFER_LIST Strukturen erstellen und an verschiedene Clients weiterleiten. Einige Treiber, z. B. native IEEE 802.11-Miniporttreiber, fügen möglicherweise mehr als eine NET_BUFFER-Struktur an eine NET_BUFFER_LIST-Struktur an.
Nach dem Verknüpfen aller NET_BUFFER_LIST-Strukturen übergibt ein Miniporttreiber einen Zeiger auf die erste NET_BUFFER_LIST Struktur in der Liste an die NdisMIndicateReceiveNetBufferLists-Funktion . NDIS untersucht die NET_BUFFER_LIST-Strukturen und ruft die ProtocolReceiveNetBufferLists-Funktion jedes Protokolltreibers auf, der den NET_BUFFER_LIST-Strukturen zugeordnet ist. NDIS übergibt eine Teilmenge der Liste, die nur die NET_BUFFER_LIST Strukturen enthält, die der richtigen Bindung zu jedem Protokolltreiber zugeordnet sind. NDIS entspricht dem NetBufferListFrameType-Wert , der in der NET_BUFFER_LIST-Struktur angegeben ist, mit dem Frametyp, den jeder Protokolltreiber registriert.
Wenn das NDIS_RECEIVE_FLAGS_RESOURCES-Flag im ReceiveFlags-Parameter festgelegt ist, das an die ProtocolReceiveNetBufferLists-Funktion eines Protokolltreibers übergeben wird, erhält NDIS den Besitz der NET_BUFFER_LIST-Strukturen sofort nach der Rückgabe des ProtocolReceiveNetBufferLists-Aufrufs zurück.
Hinweis Wenn das NDIS_RECEIVE_FLAGS_RESOURCES-Flag festgelegt ist, muss der Protokolltreiber den ursprünglichen Satz von NET_BUFFER_LIST Strukturen in der verknüpften Liste beibehalten. Wenn dieses Flag beispielsweise festgelegt ist, kann der Treiber die Strukturen verarbeiten und sie einzeln im Stapel angeben, aber bevor die Funktion zurückgibt, muss sie die ursprüngliche verknüpfte Liste wiederherstellen.
Wenn das NDIS_RECEIVE_FLAGS_RESOURCES-Flag im ReceiveFlags-Parameter , das an die ProtocolReceiveNetBufferLists-Funktion eines Protokolltreibers übergeben wird, nicht festgelegt ist, kann der Protokolltreiber den Besitz der NET_BUFFER_LIST-Strukturen behalten. In diesem Fall muss der Protokolltreiber die NET_BUFFER_LIST-Strukturen zurückgeben, indem die NdisReturnNetBufferLists-Funktion aufgerufen wird.
Wenn ein Miniporttreiber für Empfangsressourcen knapp ist, kann er das NDIS_RECEIVE_FLAGS_RESOURCES-Flag im ReceiveFlags-Parameter im Aufruf von NdisMIndicateReceiveNetBufferLists festlegen. In diesem Fall kann der Treiber den Besitz aller angegebenen NET_BUFFER_LIST-Strukturen und eingebetteten NET_BUFFER-Strukturen zurückerobern, sobald NdisMIndicateReceiveNetBufferLists zurückgibt. Das Angeben NET_BUFFER Strukturen mit dem NDIS_RECEIVE_FLAGS_RESOURCES Flagsatz zwingt die Protokolltreiber, die Daten zu kopieren und sollte daher vermieden werden. Ein Miniporttreiber sollte erkennen, wann die Empfangsressourcen auslaufen, und alle erforderlichen Schritte ergreifen, um diese Situation zu vermeiden.
NDIS ruft die MiniportReturnNetBufferLists-Funktion eines Miniporttreibers auf, nachdem der Protokolltreiber NdisReturnNetBufferLists aufgerufen hat.
Hinweis Wenn ein Miniporttreiber eine NET_BUFFER_LIST-Struktur mit dem NDIS_RECEIVE_FLAGS_RESOURCES-Flag angibt, bedeutet dies nicht, dass NDIS die NET_BUFFER_LIST Struktur dem Protokolltreiber mit demselben status angibt. Beispielsweise könnte NDIS eine NET_BUFFER_LIST-Struktur mit dem NDIS_RECEIVE_FLAGS_RESOURCES-Flags kopieren und die Kopie in den Protokolltreiber mit deaktiviertem Flag angeben.
NDIS kann NET_BUFFER_LIST Strukturen in beliebiger Reihenfolge und in beliebiger Kombination an den Miniporttreiber zurückgeben. Das heißt, die verknüpfte Liste der NET_BUFFER_LIST Strukturen, die durch einen Aufruf der MiniportReturnNetBufferLists-Funktion an einen Miniporttreiber zurückgegeben wurden, kann NET_BUFFER_LIST Strukturen aus verschiedenen vorherigen Aufrufen von NdisMIndicateReceiveNetBufferLists aufweisen.
Miniporttreiber sollten den SourceHandle-Member in den NET_BUFFER_LIST-Strukturen auf das MiniportAdapterHandle festlegen, das NDIS dem Miniporttreiber in der Funktion MiniportInitializeEx bereitgestellt hat. Filtertreiber müssen den SourceHandle-Member jeder NET_BUFFER_LIST Struktur festlegen, die der Filtertreiber für das NdisFilterHandle des Filters erstellt hat, das NDIS dem Filtertreiber in der FilterAttach-Funktion bereitgestellt hat. Filtertreiber dürfen den SourceHandle-Member nicht in NET_BUFFER_LIST Strukturen ändern, die nicht vom Filtertreiber stammen.
Zwischentreiber legen auch den SourceHandle-Member in der NET_BUFFER_LIST-Struktur auf den Wert MiniportAdapterHandle fest, den NDIS dem Zwischentreiber in der Funktion MiniportInitializeEx bereitgestellt hat. Wenn ein Zwischentreiber eine Empfangsanzeige weiterleitet, muss der Treiber den SourceHandle-Wert speichern, den der zugrunde liegende Treiber bereitgestellt hat, bevor er in den SourceHandle-Member schreibt. Wenn NDIS eine weitergeleitete NET_BUFFER_LIST-Struktur an den Zwischentreiber zurückgibt, muss der zwischengeschaltete Treiber den gespeicherten SourceHandle wiederherstellen.