Freigeben über


Abbrechen einer Sendeanforderung in einem Filtertreiber

Filtertreiber können Sendeanforderungen abbrechen, die vom Filtertreiber stammen oder von überlasteten Treibern stammen.

Abbrechen des Sendens von Anforderungen des Filtertreibers

Die folgende Abbildung veranschaulicht das Abbrechen einer Sendeanforderung, die von einem Filtertreiber stammt.

Flussdiagramm, das den Vorgang zum Abbrechen einer Sendeanforderung zeigt, die von einem Filtertreiber stammt.

Ein Filtertreiber ruft das NDIS_SET_NET_BUFFER_LIST_CANCEL_ID Makro für jede NET_BUFFER_LIST-Struktur auf, die er für Sendevorgänge erstellt. Die NDIS_SET_NET_BUFFER_LIST_CANCEL_ID-Funktion kennzeichnet die angegebenen Daten mit einem Abbruchbezeichner.

Vor dem Zuweisen von Abbruch-IDs zu Netzwerkdaten muss ein Filtertreiber NdisGeneratePartialCancelId aufrufen, um das hochgeordnete Byte jeder zuweisungsbasierten Abbruch-ID abzurufen. 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 Filtertreiber die Abbruch-ID an die Funktion NdisFCancelSendNetBufferLists . 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 Filtertreiber alle NET_BUFFER_LIST Strukturen mit demselben Abbruchbezeichner markiert, kann er alle ausstehenden Übertragungen mit einem einzigen Aufruf von NdisFCancelSendNetBufferLists abbrechen. Wenn ein Filtertreiber 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 einzigen Aufruf von NdisFCancelSendNetBufferLists abbrechen.

NDIS ruft die Funktion "Senden abbrechen" der zugrunde liegenden Treiber auf. Nach dem Abbrechen der ausstehenden Übertragung rufen die zugrunde liegenden Treiber eine funktion zum senden abgeschlossen auf (z. B. NdisMSendNetBufferListsComplete), um die NET_BUFFER_LIST-Strukturen mit einem Abschluss status NDIS_STATUS_SEND_ABORTED zurückzugeben. NDIS ruft wiederum die FilterSendNetBufferListsComplete-Funktion des Filtertreibers auf.

In FilterSendNetBufferListsComplete kann ein Filtertreiber NDIS_SET_NET_BUFFER_LIST_CANCEL_ID aufrufen, wobei CancelId auf NULL festgelegt ist. Dadurch wird verhindert, dass die NET_BUFFER_LIST versehentlich mit einer veralteten Abbruch-ID erneut verwendet wird.

Abbrechen von Sendeanforderungen, die von überlasteten Treibern stammen

Die folgende Abbildung veranschaulicht das Abbrechen einer Sendeanforderung, die von einem überlastenden Treiber ausgelöst wurde.

Flussdiagramm, das den Vorgang zum Abbrechen einer Sendeanforderung zeigt, die von einem überlastenden Treiber stammt.

Überlastende Treiber rufen eine Cancel Send-Funktion ( NdisFCancelSendNetBufferLists oder NdisCancelSendNetBufferLists) auf, um ausstehende Sendeanforderungen abzubrechen. Diese überlastenden Treiber müssen die Sendedaten mit einer Abbruch-ID markieren, bevor sie eine Sendeanforderung stellen.

NDIS ruft die FilterCancelSendNetBufferLists-Funktion eines Filtertreibers auf, um die Übertragung aller NET_BUFFER_LIST Strukturen abzubrechen, die mit einem angegebenen Abbruchbezeichner gekennzeichnet sind.

FilterCancelSendNetBufferLists führt die folgenden Vorgänge aus:

  1. Durchläuft die Liste der NET_BUFFER_LIST Strukturen des Filtertreibers für das angegebene Filtermodul und ruft das makro NDIS_GET_NET_BUFFER_LIST_CANCEL_ID auf, um den Abbruchbezeichner für jede Struktur abzurufen. Der Filtertreiber vergleicht die Abbruch-ID, die NDIS_GET_NET_BUFFER_LIST_CANCEL_ID zurückgibt, mit der Abbruch-ID, die NDIS an FilterCancelSendNetBufferLists übergeben hat.

  2. Entfernt alle NET_BUFFER_LIST Strukturen, deren Abbruchbezeichner mit dem angegebenen Abbruchbezeichner übereinstimmen, aus der Sendewarteschlange (entlinkt).

  3. Ruft die NdisFSendNetBufferListsComplete-Funktion für alle nicht verknüpften NET_BUFFER_LIST-Strukturen auf, um die Strukturen zurückzugeben. Der Filtertreiber legt das status Feld der NET_BUFFER_LIST-Strukturen auf NDIS_STATUS_SEND_ABORTED fest.

  4. Ruft die Funktion NdisFCancelSendNetBufferLists auf , um die Anforderung zum Senden des Abbrechens an zugrunde liegende Treiber zu übergeben. Der Filtertreiber übergibt den Abbruchbezeichner, den er vom überlastenden Treiber erhalten hat. Der Abbruchvorgang wird wie bei einem vom Filtertreiber stammenden Abbruchssendevorgang fortgesetzt.