NDIS_PD_POST_AND_DRAIN_BUFFER_LIST Rückruffunktion (ndis.h)
Die PacketDirect(PD)-Plattform ruft die PDPostAndDrainBufferList-Funktion eines PDPostAndDrainBufferList- Treibers auf, um PD_BUFFER Strukturen in PD-Übermittlungswarteschlangen zu veröffentlichen und alle zuvor bereitgestellten PD_BUFFER Strukturen zu entwässern, die abgeschlossen wurden.
Syntax
NDIS_PD_POST_AND_DRAIN_BUFFER_LIST NdisPdPostAndDrainBufferList;
VOID() NdisPdPostAndDrainBufferList(
[in, out] NDIS_PD_QUEUE *Queue,
[in, out] PD_BUFFER **PostBufferListHead,
[in, out] PD_BUFFER ***DrainBufferListTail,
[in] ULONG MaxDrainCount
)
{...}
Parameter
[in, out] Queue
Ein Zeiger auf die Übertragungs- oder Empfangswarteschlange, die gepostete Puffer empfängt und abgeschlossene Puffer entfernt hat.
[in, out] PostBufferListHead
Der Kopf der Beitragsliste. Der Anbieter entfernt die Puffer in dieser Liste und fügt sie der Warteschlangehinzu.
[in, out] DrainBufferListTail
Der Schwanz der Entwässerungsliste. Der Anbieter entfernt alle abgeschlossenen Puffer aus der Warteschlange und fügt sie dieser Liste hinzu.
[in] MaxDrainCount
Die maximale Menge an PD_BUFFER Strukturen, die abgelassen werden sollen. Der Anbieter darf diesen Betrag nicht überschreiten. Eine Reihe teilweiser PD_BUFFER Strukturen, aus denen eine einzelne L2-Paketanzahl besteht, ist 1.
Rückgabewert
Diese Rückruffunktion gibt keinen Wert zurück.
Bemerkungen
Der Anbieter entfernt Puffer aus der PostBufferList und platziert sie in der Warteschlange, beginnend mit dem Kopfpuffer in der Liste und dem Weiterkommen zum nächsten Puffer, bis entweder die PostBufferList leer ist oder die Warteschlange voll ist (oder in der Nähe voll). Der Anbieter wurde zum PostListHead erweitert und gibt den neuen Listenkopf an den Aufrufer zurück. Der Anbieter entfernt auch alle abgeschlossenen Puffer aus der Warteschlange und fügt sie in den Tail des DrainBufferList ein und gibt den neuen DrainBufferList-Tail an den Client zurück.
beispiele für
Um eine PDPostAndDrainBufferList--Funktion zu definieren, müssen Sie zuerst eine Funktionsdeklaration bereitstellen, die den Typ der Funktion identifiziert, die Sie definieren. Windows stellt eine Reihe von Funktionstypen für Treiber bereit. Durch das Deklarieren einer Funktion mithilfe der Funktionstypen können Codeanalyse für Treiber, statische Treiberüberprüfung (SDV) und andere Überprüfungstools Fehler finden, und es ist eine Anforderung zum Schreiben von Treibern für das Windows-Betriebssystem.Um beispielsweise eine PDPostAndDrainBufferList Funktion zu definieren, die den Namen "MyPDPostAndDrainBufferList" hat, verwenden Sie den NDIS_PD_POST_AND_DRAIN_BUFFER_LIST Typ wie in diesem Codebeispiel gezeigt:
NDIS_PD_POST_AND_DRAIN_BUFFER_LIST MyPDPostAndDrainBufferList;
Implementieren Sie dann Ihre Funktion wie folgt:
_Use_decl_annotations_
VOID
MyPDPostAndDrainBufferList(
NDIS_PD_QUEUE* Queue,
PD_BUFFER** PostBufferListHead,
PD_BUFFER*** DrainBufferListTail,
ULONG MaxDrainCount
)
{...}
Der NDIS_PD_POST_AND_DRAIN_BUFFER_LIST Funktionstyp wird in der Headerdatei Ntddndis.h definiert. Um Fehler genauer zu identifizieren, wenn Sie die Codeanalysetools ausführen, müssen Sie der Funktionsdefinition die Use_decl_annotations Anmerkung hinzufügen. Die Use_decl_annotations Anmerkung stellt sicher, dass die Anmerkungen, die auf den Funktionstyp NDIS_PD_POST_AND_DRAIN_BUFFER_LIST in der Headerdatei angewendet werden, verwendet werden. Weitere Informationen zu den Anforderungen für Funktionsdeklarationen finden Sie unter Deklarieren von Funktionen mithilfe von Funktionsrollentypen für NDIS-Treiber.
Informationen zu Use_decl_annotationsfinden Sie unter Annotating Function Behavior.
Im Folgenden sehen Sie einen Beispielcodeausschnitt, der die Zeigerreferenzen für diese Funktion veranschaulicht.
PD_BUFFER* PostHead = NULL;
PD_BUFFER** PostTail = &PostHead;
PD_BUFFER* DrainHead = NULL;
PD_BUFFER** DrainTail = &DrainHead;
PD_BUFFER* bufX = <allocated PD_BUFFER>;
bufX->NextPDBuffer = NULL;
*PostTail = bufX;
PostTail = &bufX->NextPDBuffer;
// BEFORE:
//PostHead == bufX
//PostTail == &bufZ->NextPDBuffer
//DrainHead == NULL
//DrainTail == &DrainHead
NDIS_PD_POST_AND_DRAIN_BUFFER_LIST(
Queue,
&PostHead,
&DrainTail,
32);
// AFTER:
//PostHead == bufY
//PostTail == &bufZ->NextPDBuffer
//DrainHead == buf1
//DrainTail == &buf5->NextPDBuffer
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Windows 10 |
mindestens unterstützte Server- | Windows Server 2016 |
Zielplattform- | Fenster |
Header- | ndis.h |
IRQL- | <= DISPATCH_LEVEL |