Senden von Netzwerkdaten
Die folgende Abbildung veranschaulicht einen einfachen Sendevorgang, der einen Protokolltreiber, eine NDIS und einen Miniporttreiber umfasst.
Protokolltreiber rufen die NdisSendNetBufferLists-Funktion auf, um NET_BUFFER_LIST Strukturen für eine Bindung zu senden. NDIS ruft die MiniportSendNetBufferLists-Funktion des Miniporttreibers auf, um die NET_BUFFER_LIST Strukturen an einen zugrunde liegenden Miniporttreiber weiterzuleiten.
Alle NET_BUFFER-basierten Sendevorgänge sind asynchron. Der Miniporttreiber ruft die NdisMSendNetBufferListsComplete-Funktion mit einem geeigneten status Code auf, wenn er fertig ist. Der Versand jeder NET_BUFFER_LIST Struktur kann einzeln abgeschlossen werden. NDIS ruft die ProtocolSendNetBufferListsComplete-Funktion des Protokolltreibers jedes Mal auf, wenn der Miniporttreiber NdisMSendNetBufferListsComplete aufruft.
Protokolltreiber können den Besitz der NET_BUFFER_LIST-Strukturen und aller zugehörigen Strukturen und Daten freigeben, sobald die NDIS die ProtocolSendNetBufferListsComplete-Funktion des Protokolltreibers aufruft .
Der Miniporttreiber oder NDIS kann die NET_BUFFER_LIST Strukturen in beliebiger Reihenfolge zurückgeben. Protokolltreibern wird garantiert, dass die Liste der NET_BUFFER Strukturen, die an jede NET_BUFFER_LIST-Struktur angefügt sind, nicht geändert wurde.
Jeder NDIS-Treiber kann die NET_BUFFER-Strukturen in einer NET_BUFFER_LIST-Struktur trennen. Jeder NDIS-Treiber kann die MDLs auch in einer NET_BUFFER-Struktur trennen. Der Treiber muss jedoch immer die NET_BUFFER_LIST-Strukturen mit den NET_BUFFER-Strukturen und MDLs in der ursprünglichen Form zurückgeben. Beispielsweise kann ein Zwischentreiber einen NET_BUFFER_LIST in zwei neue NET_BUFFER_LIST-Strukturen aufteilen und einen Teil der ursprünglichen Daten an den nächsten Treiber übergeben. Wenn der Zwischentreiber jedoch die Verarbeitung des ursprünglichen NET_BUFFER_LIST muss er den vollständigen NET_BUFFER_LIST mit den ursprünglichen NET_BUFFER-Strukturen und MDLs zurückgeben.
Protokolltreiber legen den SourceHandle-Member in der NET_BUFFER_LIST-Struktur auf die NdisBindingHandle fest, die NDIS in einem Aufruf der NdisOpenAdapterEx-Funktion bereitgestellt hat. NDIS verwendet den SourceHandle-Member , um die NET_BUFFER_LIST Strukturen an den Protokolltreiber zurückzugeben, der die NET_BUFFER_LIST-Strukturen gesendet hat.
Zwischentreiber legen auch den SourceHandle-Member in der NET_BUFFER_LIST-Struktur auf den NdisBindingHandle-Wert fest, den NDIS in einem Aufruf von NdisOpenAdapterEx bereitgestellt hat. Wenn ein Zwischentreiber eine Sendeanforderung weiterleitet, muss der Treiber den SourceHandle-Wert speichern, den der überlappende 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 Zwischentreiber den gespeicherten SourceHandle wiederherstellen.