Fonction ExAcquireSharedWaitForExclusive (wdm.h)

La routine ExAcquireSharedWaitForExclusive acquiert la ressource donnée pour l’accès partagé si l’accès partagé peut être accordé et qu’il n’y a pas de serveurs exclusifs.

Syntaxe

BOOLEAN ExAcquireSharedWaitForExclusive(
  [in, out] PERESOURCE Resource,
  [in]      BOOLEAN    Wait
);

Paramètres

[in, out] Resource

Pointeur vers la ressource à acquérir pour l’accès partagé.

[in] Wait

Spécifie le comportement de la routine chaque fois que la ressource ne peut pas être acquise immédiatement. Si la valeur est TRUE, l’appelant est placé dans un état d’attente jusqu’à ce que la ressource puisse être acquise. Si la valeur est FALSE, la routine retourne immédiatement, que la ressource puisse ou non être acquise.

Valeur retournée

ExAcquireSharedWaitForExclusive retourne TRUE si l’accès demandé est accordé ou si un propriétaire exclusif libère la ressource. Cette routine retourne FALSE si l’entrée Wait est FALSE et que l’accès partagé ne peut pas être accordé immédiatement.

Remarques

La plupart des pilotes doivent utiliser ExAcquireResourceSharedLite au lieu d’ExAcquireSharedWaitForExclusive.

L’appelant peut libérer la ressource en appelant ExReleaseResourceLite ou ExReleaseResourceForThreadLite.

Si l’accès partagé ne peut pas être accordé immédiatement, l’appelant peut attendre que d’autres threads acquièrent et libèrent la propriété exclusive de la ressource.

Si ou quand l’appelant reçoit un accès partagé à la ressource donnée dépend des éléments suivants :

  • Si la ressource n’est actuellement pas propriétaire, l’accès partagé est accordé immédiatement au thread actif.
  • Si l’appelant dispose déjà d’un accès exclusif à la ressource, le thread actuel se voit accorder le même type d’accès de manière récursive.
  • Si la ressource est actuellement partagée et qu’aucune tentative d’accès exclusif n’est en attente, l’accès partagé est immédiatement accordé à l’appelant.
  • Si la ressource est actuellement partagée, mais qu’une tentative d’accès exclusif est en attente, l’appelant est placé dans un état d’attente (wait défini sur TRUE) ou ExAcquireSharedWaitForExclusive retourne FALSE.

    Lorsque le thread actuel attend d’acquérir la ressource jusqu’à ce qu’une propriété exclusive en attente ait été publiée, ExAcquireSharedWaitForExclusive retourne TRUE lorsque le thread actuel se voit accorder un accès partagé à la ressource et reprend l’exécution.

Le comportement d’ExAcquireSharedWaitForExclusive est identique à celui d’ExAcquireResourceSharedLite , sauf si le thread appelant possède déjà la ressource en tant que partagée et qu’il existe des serveurs exclusifs. Dans ce cas, ExAcquireSharedWaitForExclusive permet aux serveurs exclusifs d’acquérir la propriété exclusive de la ressource.

Si l’appelant spécifie TRUE pour le paramètre Wait , l’appelant bloque jusqu’à ce qu’un autre thread libère la ressource au nom de l’appelant, à l’aide d’ExReleaseResourceForThread. Les enregistreurs de pilotes doivent veiller à ce qu’un autre thread libère réellement la ressource ; sinon, l’appelant est bloqué. ExAcquireResourceSharedLite n’ayant pas cette propriété, les pilotes doivent utiliser cette routine, sauf s’ils nécessitent le comportement particulier d’ExAcquireSharedWaitForExclusive.

La remise d’APC du noyau normal doit être désactivée avant d’appeler cette routine. Désactivez la remise APC du noyau normal en appelant KeEnterCriticalRegion. La remise doit rester désactivée jusqu’à ce que la ressource soit libérée. À ce stade, elle peut être réactivée en appelant KeLeaveCriticalRegion. Pour plus d’informations, consultez Désactivation des API.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Disponible à partir de Windows 2000.
Plateforme cible Universal
En-tête wdm.h (inclure Wdm.h, Ntddk.h, Ntifs.h)
Bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
Règles de conformité DDI HwStorPortProhibitedDDIs(storport),IrqlExApcLte3(wdm), SpNoWait(storport),WithinCriticalRegion(storport), WithinCriticalRegion(storport), WithinCriticalRegion(wdm)

Voir aussi

ExAcquireResourceSharedLite

ExAcquireSharedStarveExclusive

ExConvertExclusiveToSharedLite

ExGetExclusiveWaiterCount

ExIsResourceAcquiredExclusiveLite

ExIsResourceAcquiredSharedLite

ExReleaseResourceForThread