Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article décrit la structure ERESOURCE et les routines fournies par le système qui fonctionnent dessus. Vous pouvez utiliser des structures ERESOURCE pour implémenter le verrouillage en lecture/écriture dans votre pilote.
Structure ERESOURCE
La structure ERESOURCE est utilisée pour gérer l’accès aux ressources partagées. Il fournit un mécanisme permettant de synchroniser l’accès aux ressources qui peuvent être partagées entre plusieurs threads.
La structure ERESOURCE est opaque ; c’est-à-dire que ses membres sont réservés à une utilisation système.
Le stockage pour ERESOURCE doit être alloué à partir du pool non paginé.
Routines ERESOURCE
Le système fournit des routines pour acquérir et libérer des structures ERESOURCE et examiner leur état actuel.
Acquisition et publication d’une structure ERESOURCE
Les pilotes peuvent utiliser les structures ERESOURCE pour implémenter une synchronisation exclusive/partagée. La synchronisation exclusive/partagée fonctionne comme suit :
N’importe quel nombre de threads peuvent acquérir un ERESOURCE en tant que partagé.
Un seul thread peut acquérir un ERESOURCE exclusivement. L’ERESOURCE ne peut être acquis que si aucun thread ne l’a déjà acquis comme partagé.
Un thread qui ne peut pas acquérir d’ERESOURCE peut éventuellement être placé dans un état d’attente jusqu’à ce que l’ERESOURCE puisse être acquis. Le système gère deux listes de threads qui attendent une instance ERESOURCE : une liste de serveurs exclusifs et une liste de serveurs partagés.
Une utilisation classique pour la synchronisation exclusive/partagée consiste à implémenter un verrou en lecture/écriture. Un verrou en lecture/écriture permet à plusieurs threads d’effectuer une opération de lecture, mais un seul thread peut écrire à la fois. Ce scénario peut être implémenté directement en termes d’acquisition d’un ERESOURCE.
Un pilote alloue le stockage pour une ERESOURCE et l’initialise avec ExInitializeResourceLite. Le système gère une liste de toutes les structures ERESOURCE en cours d’utilisation. Lorsque le pilote n’a plus besoin d’un ERESOURCE particulier, il doit appeler ExDeleteResourceLite pour le supprimer de la liste du système. Le pilote peut également réutiliser une ERESOURCE en appelant ExReinitializeResourceLite.
Les pilotes peuvent effectuer les opérations de base suivantes sur un ERESOURCE :
Acquérir un ERESOURCE en tant que partagé avec ExAcquireResourceSharedLite. Cette routine acquiert la ressource uniquement si la ressource n’a pas été acquise exclusivement et qu’il n’y a pas d’serveurs exclusifs.
Acquérir une ERESOURCE exclusivement avec ExAcquireResourceExclusiveLite. Cette routine acquiert la ressource tant qu’elle n’a pas été acquise exclusivement ou en tant que partagée.
Convertissez une acquisition exclusive en acquisition partagée avec ExConvertExclusiveToSharedLite.
Relâchez une ressource acquise avec ExReleaseResourceLite.
Le paramètre Waitd’ExAcquireResourceSharedLite et ExAcquireResourceExclusiveLite détermine si le thread actuel attend que l’ERESOURCE soit acquis. Si vous spécifiez la valeur FALSE et que l’ERESOURCE ne peut pas être acquis, la routine retourne FALSE. Si vous spécifiez la valeur TRUE, le thread actuel est placé dans la liste d’attente appropriée pour l’ERESOURCE.
Examen de l’état d’une structure ERESOURCE
Un pilote peut également déterminer l’état actuel d’une ERESOURCE, comme suit :
Utilisez ExIsResourceAcquiredLite ou ExIsResourceAcquiredSharedLite pour déterminer si l’ERESOURCE a déjà été acquis comme partagé ou exclusif. Utilisez ExIsResourceAcquiredExclusiveLite pour vérifier si l’ERESOURCE a été spécifiquement acquis exclusivement.
Utilisez ExGetSharedWaiterCount pour déterminer le nombre de serveurs partagés pour l’ERESOURCE et utilisez ExGetExclusiveWaiterCount pour déterminer le nombre de serveurs exclusifs pour l’ERESOURCE.