Freigeben über


NdisAcquireRWLockWrite-Funktion (ndis.h)

Die NdisAcquireRWLockWrite-Funktion ruft eine Schreibsperre ab, die der Aufrufer für schreibzugriff auf Ressourcen verwendet, die zwischen Treiberthreads gemeinsam genutzt werden.

Syntax

void NdisAcquireRWLockWrite(
  [in]  PNDIS_RW_LOCK_EX Lock,
  [out] PLOCK_STATE_EX   LockState,
  [in]  UCHAR            Flags
);

Parameter

[in] Lock

Ein Zeiger auf eine undurchsichtige NDIS_RW_LOCK_EX Variable, die eine Sperre darstellt. Der Aufrufer kann diese Sperre verwenden, um Schreib- oder Lesezugriff auf Ressourcen zu erhalten, die zwischen Nicht-ISR-Treiberthreads gemeinsam genutzt werden.

[out] LockState

Ein Zeiger auf eine undurchsichtige LOCK_STATE_EX Variable, die den Zustand der Sperre nachverfolgt. Diese Variable ist im Intervall zwischen den Zeiten vorhanden, die der Aufrufer abruft und die Sperre loslässt. Der Aufrufer muss eine andere Variable vom Typ LOCK_STATE_EX für jeden Versuch verwenden, den er zum Abrufen der Sperre aus demselben Nicht-ISR-Treiberthread vorgibt.

[in] Flags

Ein ULONG- Wert, der Sperrkennzeichnungen enthält. Legen Sie diesen Parameter auf NDIS_RWL_AT_DISPATCH_LEVEL fest, wenn der aktuelle IRQL-Wert des Aufrufers DISPATCH_LEVEList. Legen Sie andernfalls diesen Parameter auf Null fest. Weitere Informationen zur IRQL-Verteilerverfolgung finden Sie unter IRQL Tracking.

Hinweis Wenn der Aufrufer weiß, dass der aktuelle IRQL DISPATCH_LEVEList, legen Sie diesen Parameter auf NDIS_RWL_AT_DISPATCH_LEVELfest. Mit diesem Kennzeichen wird die Sperre noch effizienter, da dadurch eine Überprüfung auf die aktuelle IRQL weggelassen wird. Wenn die aktuelle IRQL unbekannt ist, testen Sie den aktuellen IRQL nicht mit KeGetCurrentIrql ausschließlich, um festzustellen, ob dieses Flag festgelegt werden soll, da es effizienter ist, die NdisAcquireRWLockWrite--Funktion zum Testen des IRQL selbst zuzulassen.
 

Rückgabewert

Nichts

Bemerkungen

NDIS-Treiber rufen die NdisAcquireRWLockWrite Funktion auf, um Ressourcen zu ändern, die zwischen Treiberthreads gemeinsam genutzt werden.

Der Treiber muss eine Variable vom Typ NDIS_RW_LOCK_EX mit der NdisAllocateRWLock--Funktion zuweisen, bevor der Treiber die NdisAcquireRWLockWrite-Funktion aufruft. Der Treiber muss ein Handle für NdisAllocateRWLock- für den residenten Speicher für die von ihr verwendeten Sperren bereitstellen.

Nachdem der Treiber NdisAllocateRWLock-aufgerufen hat, kann er NdisAcquireRWLockWrite oder NdisAcquireRWLockRead- aufrufen, um schreib- oder lesezugriff auf die Ressource abzurufen. Nur jeweils ein Nicht-ISR-Treiberthread kann Schreibzugriff auf die Ressource erhalten. Wenn ein Nicht-ISR-Thread Schreibzugriff hat, müssen alle Lese- und Schreibzugriffe von anderen Nicht-ISR-Threads warten, bis der Schreibzugriffshalter die Sperre loslässt. Wenn jedoch ein Nicht-ISR-Thread Lesezugriff hat, können andere Nicht-ISR-Threads gleichzeitig Lesezugriff erhalten.

Die NDIS_RW_LOCK_EX-Sperre unterstützt keine Heraufsteufung von Lese-zu-Schreibzugriff. Nachdem ein Prozessor eine NDIS_RW_LOCK_EX für den Lesezugriff erworben hat (durch Aufrufen von NdisAcquireRWLockRead), darf derselbe Prozessor nicht versuchen, Schreibzugriff (durch Aufrufen von NdisAcquireRWLockWrite) zu erhalten, bis der vorherige Lesezugriff freigegeben wird.

Eine NDIS_RW_LOCK_EX Schreibsperre kann rekursiv auf demselben Prozessor abgerufen werden. Für jeden Aufruf von NdisAcquireRWLockWritemuss ein entsprechender Aufruf an NdisReleaseRWLockvorhanden sein. Die Sperre wird erst nach dem letzten Aufruf von NdisReleaseRWLockfreigegeben.

Ein Treiberthread sollte nie eine Schreibsperre für mehr als ein paar Mikrosekunden enthalten. Das Halten einer Schreibsperre für einen längeren Zeitraum beeinträchtigt sowohl die Leistung des Betriebssystems als auch des Treibers.

Der Treiber kann keine Sperre verwenden, um Ressourcen vor Lese- oder Schreibzugriff zu schützen, die seine anderen Funktionen für die MiniportInterrupt- oder MiniportDisableInterruptEx Funktionen oder beides. Stattdessen muss der Treiber anrufen NdisMSynchronizeWithInterruptEx so, dass sie MiniportSynchronizeInterrupt-Funktion greift auf solche freigegebenen Ressourcen in derselben DIRQL zu, die MiniportInterrupt oder MiniportDisableInterruptEx Funktionen oder beides ausführen.

NdisAcquireRWLockWrite löst die IRQL auf DISPATCH_LEVEL durch Abrufen einer Drehsperre aus.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Unterstützt in NDIS 6.20 und höher.
Zielplattform- Universal
Header- ndis.h (include Ndis.h)
Library Ndis.lib
IRQL- <= DISPATCH_LEVEL

Siehe auch

LOCK_STATE_EX

MiniportDisableInterruptEx

MiniportInterrupt-

MiniportSynchronizeInterrupt

NDIS_RW_LOCK_EX

NdisAcquireRWLockRead

NdisAllocateRWLock

NdisMSynchronizeWithInterruptEx

NdisReleaseRWLock-