ExAcquireSharedWaitForExclusive-Funktion (wdm.h)
Die ExAcquireSharedWaitForExclusive-Routine ruft die angegebene Ressource für den gemeinsamen Zugriff ab, wenn freigegebener Zugriff gewährt werden kann und keine exklusiven Kellner vorhanden sind.
Syntax
BOOLEAN ExAcquireSharedWaitForExclusive(
[in, out] PERESOURCE Resource,
[in] BOOLEAN Wait
);
Parameter
[in, out] Resource
Ein Zeiger auf die Ressource, die für den gemeinsamen Zugriff abgerufen werden soll.
[in] Wait
Gibt das Verhalten der Routine an, wenn die Ressource nicht sofort abgerufen werden kann. Bei TRUE wird der Aufrufer in einen Wartezustand versetzt, bis die Ressource abgerufen werden kann. False gibt die Routine sofort zurück, unabhängig davon, ob die Ressource abgerufen werden kann.
Rückgabewert
ExAcquireSharedWaitForExclusive gibt TRUE zurück, wenn der angeforderte Zugriff gewährt wird oder ein exklusiver Besitzer die Ressource freigibt. Diese Routine gibt FALSE zurück, wenn die Eingabe Waitden Wert FALSE aufweist und der freigegebene Zugriff nicht sofort gewährt werden kann.
Hinweise
Die meisten Treiber sollten ExAcquireResourceSharedLite anstelle von ExAcquireSharedWaitForExclusive verwenden.
Der Aufrufer kann die Ressource freigeben, indem er entweder ExReleaseResourceLite oder ExReleaseResourceForThreadLite aufruft.
Wenn der freigegebene Zugriff nicht sofort gewährt werden kann, kann der Aufrufer warten, bis andere Threads den exklusiven Besitz der Ressource erwerben und freigeben.
Ob oder wann der Aufrufer freigegebenen Zugriff auf die angegebene Ressource erhält, hängt von Folgendem ab:
- Wenn die Ressource derzeit nicht vorhanden ist, wird dem aktuellen Thread sofort freigegebener Zugriff gewährt.
- Wenn der Aufrufer bereits über exklusiven Zugriff auf die Ressource verfügt, wird dem aktuellen Thread rekursiv derselbe Zugriffstyp gewährt.
- Wenn sich die Ressource derzeit im Besitz von freigegeben befindet und keine versuche ausstehen, exklusiven Zugriff zu erhalten, wird dem Aufrufer sofort freigegebener Zugriff gewährt.
-
Wenn die Ressource derzeit freigegeben ist, aber ein ausstehender Versuch besteht, exklusiven Zugriff zu erhalten, wird der Aufrufer entweder in einen Wartezustand versetzt (Wait set to TRUE) oder ExAcquireSharedWaitForExclusive gibt FALSE zurück.
Wenn der aktuelle Thread auf den Abruf der Ressource wartet, bis ein ausstehender exklusiver Besitz freigegeben wurde, gibt ExAcquireSharedWaitForExclusiveTRUE zurück, wenn dem aktuellen Thread freigegebener Zugriff auf die Ressource gewährt wird und die Ausführung fortgesetzt wird.
Wenn der Aufrufer TRUE für den Wait-Parameter angibt, blockiert der Aufrufer, bis ein anderer Thread die Ressource im Namen des Aufrufers mit ExReleaseResourceForThread freigibt. Treiberautoren müssen darauf achten, dass die Ressource tatsächlich von einem anderen Thread freigegeben wird. Andernfalls wird der Aufrufer deadlocked. ExAcquireResourceSharedLite verfügt nicht über diese Eigenschaft, daher sollten Treiber diese Routine verwenden, es sei denn, sie erfordern das bestimmte Verhalten von ExAcquireSharedWaitForExclusive.
Die normale Kernel-APC-Übermittlung muss vor dem Aufruf dieser Routine deaktiviert werden. Deaktivieren Sie die normale Kernel-APC-Übermittlung, indem Sie KeEnterCriticalRegion aufrufen. Die Übermittlung muss deaktiviert bleiben, bis die Ressource freigegeben wird. An diesem Punkt kann sie durch Aufrufen von KeLeaveCriticalRegion erneut aktiviert werden. Weitere Informationen finden Sie unter Deaktivieren von APCs.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Verfügbar ab Windows 2000. |
Zielplattform | Universell |
Header | wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h) |
Bibliothek | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |
DDI-Complianceregeln | HwStorPortProhibitedDIs(storport), IrqlExApcLte3(wdm), SpNoWait(storport), WithinCriticalRegion(storport), WithinCriticalRegion(storport), WithinCriticalRegion(wdm) |
Weitere Informationen
ExAcquireSharedStarveExclusive
ExConvertExclusiveToSharedLite
ExIsResourceAcquiredExclusiveLite