Abbrechen eines Sendevorgangs
Die folgende Abbildung veranschaulicht das Abbrechen eines Sendevorgangs.
Ein Treiber ruft das NDIS_SET_NET_BUFFER_LIST_CANCEL_ID-Makro für jede NET_BUFFER_LIST Struktur auf, die er für die Übertragung an Treiber auf niedrigerer Ebene übergibt. Die NDIS_SET_NET_BUFFER_LIST_CANCEL_ID-Funktion kennzeichnet das angegebene Paket mit einem Abbruchbezeichner.
Vor dem Zuweisen von Abbruch-IDs zu Paketen sollte ein Treiber NdisGeneratePartialCancelId aufrufen, um das hochgeordnete Byte jeder Abbruch-ID abzurufen, die er zuweist. Dadurch wird sichergestellt, dass der Treiber keine Abbruch-IDs dupliziert, die von anderen Treibern im System zugewiesen wurden. Treiber rufen NdisGeneratePartialCancelId in der Regel einmal aus der DriverEntry-Routine auf. Treiber können jedoch mehr als einen Partiellen Abbruchbezeichner abrufen, indem sie NdisGeneratePartialCancelId mehrmals aufrufen.
Um die ausstehende Übertragung von Daten in einer markierten NET_BUFFER_LIST-Struktur abzubrechen, übergibt ein Treiber die Abbruch-ID an die NdisCancelSendNetBufferLists-Funktion . Treiber können die Abbruch-ID einer NET_BUFFER_LIST Struktur abrufen, indem sie das makro NDIS_GET_NET_BUFFER_LIST_CANCEL_ID aufrufen.
Wenn ein Treiber alle NET_BUFFER_LIST Strukturen mit demselben Abbruchbezeichner markiert, kann er alle ausstehenden Übertragungen mit einem einzigen Aufruf von NdisCancelSendNetBufferLists abbrechen. Wenn ein Treiber alle NET_BUFFER_LIST Strukturen innerhalb einer Untergruppe von NET_BUFFER_LIST Strukturen mit einem eindeutigen Bezeichner markiert, kann er alle ausstehenden Übertragungen innerhalb dieser Untergruppe mit einem einzelnen Aufruf von NdisCancelSendNetBufferLists abbrechen.
NDIS ruft die MiniportCancelSend-Funktion des entsprechenden Treibers der unteren Ebene für die Bindung auf. Nach dem Abbrechen der ausstehenden Übertragung ruft der zugrunde liegende Miniporttreiber die NdisMSendNetBufferListsComplete-Funktion auf, um die NET_BUFFER_LIST Strukturen und einen Abschluss status von NDIS_STATUS_SEND_ABORTED zurückzugeben. NDIS ruft wiederum die ProtocolSendNetBufferListsComplete-Funktion des entsprechenden Treibers auf.
In der Funktion ProtocolSendNetBufferListsComplete kann ein Protokolltreiber NDIS_SET_NET_BUFFER_LIST_CANCEL_ID aufrufen, wobei CancelId auf NULL festgelegt ist. Dadurch wird verhindert, dass der NET_BUFFER_LIST versehentlich mit einer veralteten Abbruch-ID erneut verwendet wird.