NdisDprAcquireReadWriteLock-Funktion (ndis.h)
Die NdisDprAcquireReadWriteLock-Funktion ruft eine Sperre ab, die der Aufrufer entweder für den Schreib- oder Lesezugriff 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 TRUE ist, erhält diese Funktion Schreibzugriff auf freigegebene Ressourcen. wenn der Wert FALSE 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 freigibt. Der Aufrufer muss für jeden Versuch, die Sperre aus demselben Nicht-ISR-Treiberthread abzurufen, eine andere Variable vom Typ LOCK_STATE verwenden.
Rückgabewert
Keine
Bemerkungen
Der Treiber muss eine Variable vom Typ initialisieren, NDIS_RW_LOCK mit dem NdisInitializeReadWriteLock-Funktion , bevor der Treiber eine andere NdisXxxReadWriteLock-Funktion aufruft. Der Treiber muss einen residenten Speicher für die von er verwendeten Sperren bereitstellen.
Nach dem Abrufen einer Sperre mithilfe von NdisDprAcquireReadWriteLock muss der Aufrufer diese Sperre freigeben, indem er die NdisDprReleaseReadWriteLock-Funktion aufruft . Um die Verweisanzahl der Sperre zu verringern, muss ein Treiber aufrufen.
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, sodass die Sperre mit NdisDprAcquireReadWriteLock mit NdisDprReleaseReadWriteLock freigegeben werden muss. Wenn die Sperre mit NdisAcquireReadWriteLock abgerufen wird, muss sie mit NdisReleaseReadWriteLock freigegeben werden.
Bei einigen Architekturen ist NdisDprAcquireReadWriteLock schneller als NdisAcquireReadWriteLock. Treiber können NdisDprAcquireReadWriteLock anstelle von NdisAcquireReadWriteLock verwenden, wenn sicher ist, dass der aktuelle IRQL bereits DISPATCH_LEVEL ist. Es ist jedoch nicht erforderlich. Der Mehraufwand für das Aufrufen der KeGetCurrentIrql-Funktion ist größer als der Leistungsvorteil des Aufrufens von NdisDprAcquireReadWriteLock anstelle von NdisAcquireReadWriteLock.
Zum Ändern von Ressourcen, die von Treiberthreads gemeinsam genutzt werden, muss ein Treiberthread eine Schreibsperre erhalten. Um diese Ressourcen einfach zu überwachen, muss ein Treiberthread eine schreibgeschützte Sperre erhalten. Für den Lesezugriff sind keine verriegelten Vorgänge oder Konflikte für Drehsperren erforderlich. Die Verwendung des schreibgeschützten Zugriffs trägt dazu bei, eine gute Betriebssystem- und Treiberleistung zu erhalten.
Ein Treiberthread sollte niemals länger als 25 Mikrosekunden eine Schreibsperre enthalten. Wenn Sie eine Schreibsperre für einen längeren Zeitraum halten, wird die Leistung des Betriebssystems und des Treibers beeinträchtigt.
Der Treiber kann keine Sperre verwenden, um Ressourcen vor Lese- oder Schreibzugriff zu schützen, die seine anderen Funktionen mit dem MiniportInterrupt und/oder teilen. MiniportDisableInterruptEx-Funktionen . Stattdessen muss der Treiber NdisMSynchronizeWithInterruptEx aufrufen, damit MiniportSynchronizeInterrupt-Funktion greift auf diese freigegebenen Ressourcen mit demselben DIRQL zu, unter dem ihre
MiniportInterrupt und/oder MiniportDisableInterruptEx-Funktionen funktionieren.
Weitere Informationen zum Abrufen und Freigeben von NDIS-Spinsperren finden Sie unter Synchronisierung und Benachrichtigung in Netzwerktreibern.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Veraltet für NDIS 6.20- und höhere Treiber, die anstelle von NdisDprAcquireRWrite NdisAcquireRWlockRead oder NdisAcquireRWlockWrite verwenden sollten. Unterstützt in NDIS 6.0 und 6.1. |
Zielplattform | Universell |
Header | ndis.h (einschließlich Ndis.h) |
Bibliothek | Ndis.lib |
IRQL | = DISPATCH_LEVEL |