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.
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 |