NdisAcquireRWLockWrite, fonction (ndis.h)
La fonction NdisAcquireRWLockWrite obtient un verrou d’écriture que l’appelant utilise pour l’accès en écriture aux ressources partagées entre les threads de pilote.
Syntaxe
void NdisAcquireRWLockWrite(
[in] PNDIS_RW_LOCK_EX Lock,
[out] PLOCK_STATE_EX LockState,
[in] UCHAR Flags
);
Paramètres
[in] Lock
Pointeur vers une variable de NDIS_RW_LOCK_EX opaque qui représente un verrou. L’appelant peut utiliser ce verrou pour obtenir un accès en écriture ou en lecture aux ressources partagées entre des threads de pilote non-ISR.
[out] LockState
Pointeur vers une variable de LOCK_STATE_EX opaque qui suit l’état du verrou. Cette variable existe dans l’intervalle entre les heures que l’appelant obtient et libère le verrou. L’appelant doit utiliser une variable de type différente LOCK_STATE_EX pour chaque tentative qu’il effectue pour obtenir le verrou à partir du même thread de pilote non-ISR.
[in] Flags
Valeur ULONG qui contient des indicateurs de verrou. Définissez ce paramètre sur NDIS_RWL_AT_DISPATCH_LEVEL si l’irQL actuel de l’appelant est DISPATCH_LEVEL. Sinon, définissez ce paramètre sur zéro. Pour plus d’informations sur le suivi IRQL de dispatch, consultez Dispatch IRQL Tracking.
Valeur de retour
Aucun
Remarques
Les pilotes NDIS appellent la fonction NdisAcquireRWLockWrite pour modifier les ressources partagées entre les threads de pilote.
Le pilote doit allouer une variable de type NDIS_RW_LOCK_EX avec la fonction NdisAllocateRWLock avant que le pilote appelle la fonction NdisAcquireRWLockWrite. Le pilote doit fournir un handle pour NdisAllocateRWLock pour le stockage résident pour les verrous qu’il utilise.
Une fois que le pilote appelle NdisAllocateRWLock, il peut appeler NdisAcquireRWLockWrite ou NdisAcquireRWLockRead pour obtenir l’accès en écriture ou en lecture à la ressource. Un seul thread de pilote non-ISR à la fois peut obtenir l’accès en écriture à la ressource. Lorsqu’un thread non-ISR dispose d’un accès en écriture, tous les accès en lecture et en écriture par d’autres threads non-ISR doivent attendre que le titulaire de l’accès en écriture libère le verrou. Toutefois, si un thread non-ISR dispose d’un accès en lecture, d’autres threads non-ISR peuvent obtenir simultanément l’accès en lecture.
Le verrou NDIS_RW_LOCK_EX ne prend pas en charge la promotion de la lecture à l’écriture. Une fois qu’un processeur a acquis un NDIS_RW_LOCK_EX pour l’accès en lecture (en appelant NdisAcquireRWLockRead), le même processeur ne doit pas tenter d’acquérir l’accès en écriture (en appelant NdisAcquireRWLockWrite) jusqu’à ce que l’accès en lecture précédent soit libéré.
Un NDIS_RW_LOCK_EX verrou d’écriture peut être acquis de manière récursive sur le même processeur. Pour chaque appel à NdisAcquireRWLockWrite, il doit y avoir un appel correspondant à NdisReleaseRWLock. Le verrou est libéré uniquement après le dernier appel à NdisReleaseRWLock.
Un thread de pilote ne doit jamais contenir de verrou d’écriture pendant plus de quelques microsecondes. La conservation d’un verrou d’écriture pendant une période prolongée dégrade à la fois les performances du système d’exploitation et du pilote.
Le pilote ne peut pas utiliser de verrou pour protéger les ressources contre l’accès en lecture ou en écriture que ses autres fonctions partagent avec la MiniportInterrupt ou fonctions MiniportDisableInterruptEx, ou les deux. Au lieu de cela, le pilote doit appeler NdisMSynchronizeWithInterruptEx afin que son MiniportSynchronizeInterrupt fonction accède à ces ressources partagées au même niveau DIRQL que son MiniportInterrupt ou fonctions MiniportDisableInterruptEx, ou les deux, effectuez.
NdisAcquireRWLockWrite déclenche l’IRQL à DISPATCH_LEVEL en obtenant un verrou de rotation.
Exigences
Exigence | Valeur |
---|---|
client minimum pris en charge | Pris en charge dans NDIS 6.20 et versions ultérieures. |
plateforme cible | Universel |
d’en-tête | ndis.h (include Ndis.h) |
bibliothèque | Ndis.lib |
IRQL | <= DISPATCH_LEVEL |