Freigeben über


Senden von Daten von einem Protokolltreiber

Die folgende Abbildung veranschaulicht einen Protokolltreiber-Sendevorgang, der einen Protokolltreiber, eine NDIS und zugrunde liegende Treiber in einem Treiberstapel umfasst.

Diagramm: Sendevorgang eines Protokolltreibers mit einem Protokolltreiber, einer NDIS und zugrunde liegenden Treibern in einem Treiberstapel.

Protokolltreiber rufen die NdisSendNetBufferLists-Funktion auf, um die Netzwerkdaten zu senden, die in einer Liste von NET_BUFFER_LIST-Strukturen definiert sind.

Ein Protokolltreiber muss den SourceHandle-Member jeder NET_BUFFER_LIST-Struktur auf denselben Wert festlegen, den er an den NdisBindingHandle-Parameter übergibt. Das Bindungshandle stellt die Informationen bereit, die NDIS benötigt, um die NET_BUFFER_LIST-Struktur an den Protokolltreiber zurückzugeben, nachdem der zugrunde liegende Miniporttreiber NdisMSendNetBufferListsComplete aufgerufen hat.

Vor dem Aufruf von NdisSendNetBufferLists kann ein Protokolltreiber Informationen festlegen, die die Sendeanforderung mit dem makro NET_BUFFER_LIST_INFO begleiten. Die zugrunde liegenden Treiber können diese Informationen mit dem makro NET_BUFFER_LIST_INFO abrufen.

Sobald ein Protokolltreiber NdisSendNetBufferLists aufruft, gibt er den Besitz der NET_BUFFER_LIST-Strukturen und aller zugehörigen Ressourcen auf. NDIS ruft die ProtocolSendNetBufferListsComplete-Funktion auf, um die Strukturen und Daten an den Protokolltreiber zurückzugeben. NDIS kann die Strukturen und Daten aus mehreren Sendeanforderungen in einer einzigen verknüpften Liste von NET_BUFFER_LIST Strukturen sammeln, bevor die Liste an ProtocolSendNetBufferListsComplete übergeben wird.

Bis NDIS ProtocolSendNetBufferListsComplete aufruft, ist die aktuelle status eines vom Protokolltreiber initiierten Sendens unbekannt. Ein Protokolltreiber gibt vorübergehend den Besitz aller Ressourcen frei, die er für eine Sendeanforderung zugeordnet hat, wenn er NdisSendNetBufferLists aufruft. Ein Protokolltreiber sollte niemals versuchen, die NET_BUFFER_LIST Strukturen oder zugeordneten Daten zu untersuchen, bevor NDIS die Strukturen an ProtocolSendNetBufferListsComplete zurückgibt.

ProtocolSendNetBufferListsComplete führt alle Nachverarbeitungsvorgänge aus, die zum Abschließen eines Sendevorgangs erforderlich sind. Der Protokolltreiber kann beispielsweise die Clients benachrichtigen, die den Protokolltreiber zum Senden der Netzwerkdaten aufgefordert haben, dass der Sendevorgang abgeschlossen ist.

Wenn NDIS ProtocolSendNetBufferListsComplete aufruft, erhält der Protokolltreiber den Besitz aller Ressourcen zurück, die den durch den NetBufferLists-Parameter angegebenen NET_BUFFER_LIST Strukturen zugeordnet sind. ProtocolSendNetBufferListsComplete kann diese Ressourcen entweder freigeben (z. B. durch Aufrufen von NdisFreeNetBuffer und NdisFreeNetBufferList) oder sie für die Wiederverwendung in einem nachfolgenden Aufruf von NdisSendNetBufferLists vorbereiten.

Obwohl NDIS immer vom Protokoll bereitgestellte Netzwerkdaten an den zugrunde liegenden Miniporttreiber in der protokollbestimmten Reihenfolge übermittelt, die an NdisSendNetBufferLists übergeben wird, kann der zugrunde liegende Treiber die Sendeanforderungen in zufälliger Reihenfolge abschließen. Das heißt, jeder gebundene Protokolltreiber kann sich auf NDIS verlassen, um die Netzwerkdaten zu übermitteln, die der Protokolltreiber an NdisSendNetBufferLists in FIFO-Reihenfolge an den zugrunde liegenden Treiber übergibt. Kein Protokolltreiber kann sich jedoch darauf verlassen, dass der zugrunde liegende Treiber NdisMSendNetBufferListsComplete in derselben Reihenfolge aufruft.