ExAcquireSharedWaitForExclusive-Funktion (wdm.h)
Die ExAcquireSharedWaitForExclusive Routine erwirbt die angegebene Ressource für den freigegebenen Zugriff, wenn freigegebener Zugriff gewährt werden kann und es keine exklusiven Warteprogramme gibt.
Syntax
BOOLEAN ExAcquireSharedWaitForExclusive(
[in, out] PERESOURCE Resource,
[in] BOOLEAN Wait
);
Parameter
[in, out] Resource
Ein Zeiger auf die Ressource, die für den freigegebenen Zugriff abgerufen werden soll.
[in] Wait
Gibt das Verhalten der Routine an, wenn die Ressource nicht sofort abgerufen werden kann. Wenn TRUE, wird der Aufrufer in einen Wartezustand versetzt, bis die Ressource abgerufen werden kann. Wenn FALSE, gibt die Routine sofort zurück, unabhängig davon, ob die Ressource erworben 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 WaitFALSE ist und der freigegebene Zugriff nicht sofort gewährt werden kann.
Bemerkungen
Die meisten Treiber sollten ExAcquireResourceSharedLite- anstelle von ExAcquireSharedWaitForExclusiveverwenden.
Der Aufrufer kann die Ressource freigeben, indem entweder ExReleaseResourceLite oder ExReleaseResourceForThreadLiteaufgerufen wird.
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.
Gibt an, ob der Aufrufer freigegebenen Zugriff auf die angegebene Ressource erhält, hängt von folgenden Faktoren ab:
- Wenn die Ressource zurzeit nicht freigegeben ist, wird der freigegebene Zugriff sofort auf den aktuellen Thread gewährt.
- Wenn der Aufrufer bereits exklusiven Zugriff auf die Ressource hat, wird dem aktuellen Thread derselbe Zugriffstyp rekursiv gewährt.
- Wenn die Ressource zurzeit im Besitz der freigegebenen Ressource ist und es keine ausstehenden Versuche gibt, exklusiven Zugriff zu erhalten, wird dem Anrufer sofort der freigegebene Zugriff gewährt.
-
Wenn die Ressource zurzeit als freigegeben verwendet wird, aber es einen ausstehenden Versuch gibt, exklusiven Zugriff zu erhalten, wird der Aufrufer entweder in einen Wartezustand versetzt (Wait auf TRUEfestgelegt) oder ExAcquireSharedWaitForExclusive gibt FALSEzurück.
Wenn der aktuelle Thread wartet, bis die Ressource abgerufen wird, 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 Parameter Wait angibt, wird der Aufrufer blockiert, bis ein anderer Thread die Ressource im Namen des Aufrufers freigibt, indem ExReleaseResourceForThreadverwendet wird. Treiberautoren müssen darauf achten, dass ein anderer Thread die Ressource tatsächlich freigibt; andernfalls wird der Aufrufer deadlocked. ExAcquireResourceSharedLite hat diese Eigenschaft nicht, sodass Treiber diese Routine verwenden sollten, es sei denn, sie erfordern das bestimmte Verhalten von ExAcquireSharedWaitForExclusive.
Die normale Kernel-APC-Übermittlung muss vor dem Aufrufen dieser Routine deaktiviert werden. Deaktivieren Sie die normale Kernel-APC-Übermittlung, indem Sie KeEnterCriticalRegionaufrufen. Die Zustellung muss deaktiviert bleiben, bis die Ressource freigegeben wird. An diesem Punkt kann sie durch Aufrufen von KeLeaveCriticalRegionerneut aktiviert werden. Weitere Informationen finden Sie unter Deaktivieren von APCs.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Ab Windows 2000 verfügbar. |
Zielplattform- | Universal |
Header- | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | <= APC_LEVEL |
DDI-Complianceregeln | HwStorPortProhibitedDDIs(storport), IrqlExApcLte3(wdm), SpNoWait(storport), WithinCriticalRegion(storport), WithinCriticalRegion(storport), WithinCriticalRegion(wdm) |
Siehe auch
ExAcquireSharedStarveExclusive
ExConvertExclusiveToSharedLite-
ExIsResourceAcquiredExclusiveLite