Freigeben über


NdisDprAcquireReadWriteLock-Funktion (ndis.h)

Die NdisDprAcquireReadWriteLock-Funktion erhält eine Sperre, die der Aufrufer zum Schreiben oder Lesen des Zugriffs auf die Ressourcen verwendet, die von Treiberthreads gemeinsam genutzt werden.

Hinweis Die Lese-/Schreibsperrschnittstelle ist für NDIS 6.20 und höhere Treiber veraltet, die NdisAcquireRWLockRead oder NdisAcquireRWLockWrite (Einstellung NDIS_RWL_AT_DISPATCH_LEVEL im parameter Flags) anstelle von NdisDprAcquireReadWriteLockverwenden soll.
 

Syntax

void NdisDprAcquireReadWriteLock(
  [in, out] PNDIS_RW_LOCK Lock,
  [in]      BOOLEAN       fWrite,
  [out]     PLOCK_STATE   LockState
);

Parameter

[in, out] Lock

Ein Zeiger auf eine undurchsichtige Variable, die eine Sperre darstellt. Der Aufrufer kann diese Sperre verwenden, um auf freigegebene Ressourcen zuzugreifen.

[in] fWrite

Ein boolescher Wert. Wenn der Wert WAHR ist, wird diese Funktion mit Schreibzugriff auf freigegebene Ressourcen bereitgestellt. wenn der Wert FALSCH ist, wird diese Funktion mit Lesezugriff bereitgestellt.

[out] LockState

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

Rückgabewert

Nichts

Bemerkungen

Der Treiber muss eine Variable vom Typ initialisieren, NDIS_RW_LOCK unter Verwendung der NdisInitializeReadWriteLock--Funktion, bevor der Treiber andere NdisXxxReadWriteLock-Funktion aufruft. Der Treiber muss einen residenten Speicher für die von ihr verwendeten Sperren bereitstellen.

Nach dem Abrufen einer Sperre mithilfe von NdisDprAcquireReadWriteLockmuss der Aufrufer diese Sperre freigeben, indem die NdisDprReleaseReadWriteLock Funktion aufgerufen wird. Um die Referenzanzahl der Sperre zu erhöhen, muss ein Treiber anrufen
NdisDprReleaseReadWriteLock einmal für jeden Aufruf von NdisDprAcquireReadWriteLock.

Es ist sicher, sowohl NdisDprAcquireReadWriteLock als auch NdisDprAcquireReadWriteLock auf derselben Sperre zu verwenden. Aufrufe müssen jedoch ausgeglichen werden, damit die Sperre bei NdisDprAcquireReadWriteLock-mit NdisDprReleaseReadWriteLockfreigegeben werden muss. Ebenso muss die Sperre bei NdisAcquireReadWriteLockmit NdisReleaseReadWriteLockfreigegeben werden.

Mit einigen Architekturen führt NdisDprAcquireReadWriteLock schneller als NdisAcquireReadWriteLock. Treiber können NdisDprAcquireReadWriteLock anstelle NdisAcquireReadWriteLock verwenden, wenn sie sicher ist, dass die aktuelle IRQL bereits DISPATCH_LEVEList. Es ist jedoch nicht erforderlich. Der Aufwand für den Aufruf der KeGetCurrentIrql--Funktion ist größer als der Leistungsvorteil beim Aufrufen NdisDprAcquireReadWriteLock und nicht NdisAcquireReadWriteLock.

Um Ressourcen zu ändern, die für Treiberthreads freigegeben sind, muss ein Treiberthread eine Schreibsperre abrufen. Um diese Ressourcen einfach zu überwachen, muss ein Treiberthread eine schreibgeschützte Sperre abrufen. Lesezugriff erfordert keine verriegelten Vorgänge oder Konflikte für Drehsperren. Die Verwendung des schreibgeschützten Zugriffs trägt dazu bei, eine gute Leistung des Betriebssystems und treibers zu gewährleisten.

Ein Treiberthread sollte niemals eine Schreibsperre für mehr als 25 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 mit dem MiniportInterrupt und/oder MiniportDisableInterruptEx Funktionen. Stattdessen muss der Treiber NdisMSynchronizeWithInterruptEx- aufrufen, damit er MiniportSynchronizeInterrupt Funktion greift auf solche gemeinsam genutzten Ressourcen in derselben DIRQL zu, an der sie sich befinden
MiniportInterrupt und/oder MiniportDisableInterruptEx- Funktionen ausführen.

Weitere Informationen zum Abrufen und Freigeben von NDIS-Drehsperren finden Sie unter Synchronisierung und Benachrichtigung in Netzwerktreibern.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Veraltet für NDIS 6.20 und höhere Treiber, die NdisAcquireRWLockRead oder NdisAcquireRWLockWrite anstelle von NdisDprAcquireReadWriteLock verwenden sollten. Unterstützt in NDIS 6.0 und 6.1.
Zielplattform- Universal
Header- ndis.h (include Ndis.h)
Library Ndis.lib
IRQL- = DISPATCH_LEVEL

Siehe auch

LOCK_STATE

MiniportDisableInterruptEx

MiniportInterrupt-

MiniportSynchronizeInterrupt

NdisAcquireRWLockRead

NdisAcquireRWLockWrite

NdisDprReleaseReadWriteLock

NdisInitializeReadWriteLock-

NdisMSynchronizeWithInterruptEx