Freigeben über


NdisInterlockedInsertHeadList-Makro (ndis.h)

Die NdisInterlockedInsertHeadList-Funktion fügt einen Eintrag( in der Regel ein Paket) am Anfang einer doppelt verknüpften Liste ein, sodass der Zugriff auf die Liste auf multiprozessorsichere Weise synchronisiert wird.

Syntax

void NdisInterlockedInsertHeadList(
  [in]  _ListHead,
  [in]  _ListEntry,
  [in]  _SpinLock
);

Parameter

[in] _ListHead

Ein Zeiger auf den Kopf der doppelt verknüpften Liste, in die ein Eintrag eingefügt werden soll.

[in] _ListEntry

Ein Zeiger auf den Eintrag, der am Anfang der Liste eingefügt werden soll.

[in] _SpinLock

Ein Zeiger auf eine vom Aufrufer bereitgestellte Drehsperre, die zum Synchronisieren des Zugriffs auf die Liste verwendet wird.

Rückgabewert

Keine

Bemerkungen

Vor dem Aufrufen von NdisInterlockedInsertHeadList muss ein Treiber die Variable bei ListHead mit der Funktion NdisInitializeListHead und der Variablen bei SpinLock mit der Funktion NdisAllocateSpinLock initialisieren. Der Treiber muss auch residenten Speicher für diese Variablen und für die interne Warteschlange bereitstellen.

Die vom Aufrufer bereitgestellte Drehsperre verhindert, dass eine andere Funktion auf die interne Warteschlange des Treibers zugreift, während NdisInterlockedInsertHeadList den angegebenen Eintrag einfügt, auch wenn der Treiber auf einem Multiprozessorcomputer ausgeführt wird.

NdisInterlockedInsertHeadList hebt IRQL auf DISPATCH_LEVEL, wenn die angegebene Drehsperre abgerufen wird, und stellt die ursprüngliche IRQL wieder her, bevor die Steuerung zurückgegeben wird. Folglich kann jede Treiberfunktion, die NdisInterlockedInsertHeadList aufruft , nicht ausgelagerter Code sein.

Die meisten NDIS-Treiber verarbeiten Pakete in FIFO-Reihenfolge, sodass jeder Treiber, der eine verriegelte Warteschlange verwendet, dazu neigt, die Daten zu berechnen. Die NdisInterlockedInsertTailList-Funktion ist weitaus häufiger als NdisInterlockedInsertHeadList. Ein solcher Treiber ruft normalerweise NdisInterlockedInsertHeadList nur auf, um ein Paket für einen Wiederholungsvorgang erneut in die Warteschlange zu stellen.

Um einen zurückgegebenen Wert wieder in die Adresse des eingefügten Eintrags zu konvertieren, kann ein Treiber das Makro CONTAINING_RECORD verwenden.

Wenn NdisInterlockedInsertHeadList unter IRQL >= DISPATCH_LEVEL aufgerufen wird, müssen der Speicher für den ListHead-Parameter und die Listeneinträge resident sein.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Unterstützt für NDIS 6.0- und NDIS 5.1-Treiber (siehe NdisInterlockedInsertHeadList (NDIS 5.1)) in Windows Vista. Unterstützt für NDIS 5.1-Treiber (siehe NdisInterlockedInsertHeadList (NDIS 5.1)) in Windows XP.
Zielplattform Universell
Header ndis.h (include Ndis.h)
Bibliothek Ndis.lib
IRQL Beliebige Ebene

Weitere Informationen

CONTAINING_RECORD

NdisAllocateSpinLock

NdisInitializeListHead

NdisInterlockedInsertTailList NdisInterlockedRemoveHeadList