Partager via


NdisAllocateRWLock, fonction (ndis.h)

La fonction NdisAllocateRWLock alloue une variable de verrouillage en lecture/écriture de type NDIS_RW_LOCK_EX.

Syntaxe

PNDIS_RW_LOCK_EX NdisAllocateRWLock(
  NDIS_HANDLE NdisHandle
);

Paramètres

NdisHandle

Handle retourné par l’une des fonctions suivantes :

NdisMRegisterMiniportDriver
MiniportInitializeEx
NdisRegisterProtocolDriver
NdisOpenAdapterEx
NdisFRegisterFilterDriver
FilterAttach
Windows 8 et Windows Server 2012 et versions ultérieures : si le verrou en lecture/écriture est alloué dans DriverEntry avant qu’un handle NDIS ne soit disponible, l’appelant peut passer une valeur NULL pour ce paramètre.

Valeur retournée

NdisAllocateRWLock retourne un pointeur vers une structure NDIS_RW_LOCK_EX si elle peut être allouée ; sinon, elle retourne LA VALEUR NULL.

Remarques

Les pilotes NDIS appellent la fonction NdisAllocateRWLock pour allouer une structure de NDIS_RW_LOCK_EX qui contrôle l’accès en lecture/écriture aux ressources partagées entre les threads de pilote. Les pilotes utilisent un verrou en lecture/écriture pour les ressources fréquemment consultées à des fins de lecture et rarement utilisées pour l’écriture.

Chaque verrou qu’un pilote alloue peut effectuer l’une des opérations suivantes :

  • Protégez un ensemble discret de ressources partagées contre l’accès simultané en écriture et en lecture par des threads de pilote qui s’exécutent au
  • Exposer un ensemble discret de ressources partagées à un accès en lecture simultané par des threads de pilote qui s’exécutent au
Le pointeur NDIS_RW_LOCK_EX retourné par NdisAllocateRWLock est un paramètre obligatoire pour toutes les autres fonctions de verrouillage en lecture/écriture.

Une NDIS_RW_LOCK_EX n’est pas juste. Autrement dit, un processeur qui attend d’acquérir le verrou pour l’accès exclusif peut être privé par les processeurs qui détiennent le verrou pour l’accès en lecture. Par conséquent, n’utilisez pas de NDIS_RW_LOCK_EX dans les situations où la majorité des accès sont destinés à l’accès en écriture. Si la majorité des accès ont besoin d’un accès en écriture, il est plus efficace d’utiliser simplement un verrou de rotation du noyau. Pour plus d’informations sur les verrous de rotation, consultez Présentation des verrous de rotation.

Dans les situations où il existe de nombreuses acquisitions pour l’accès en lecture sur plusieurs processeurs, le NDIS_RW_LOCK_EX fonctionne généralement mieux qu’un verrou de rotation du noyau. Utilisez NDIS_RW_LOCK_EX lorsque vous attendez de nombreux accès en lecture par seconde répartis sur plusieurs processeurs.

Une structure NDIS_RW_LOCK_EX définit des attributs qui limitent l’accès en écriture aux ressources partagées à un thread de pilote non-ISR à la fois. La structure NDIS_RW_LOCK_EX peut autoriser plusieurs threads de pilote non-ISR à avoir un accès en lecture simultané aux ressources associées. Cet accès en lecture n’est pas autorisé pendant un accès en écriture.

Pour modifier les ressources protégées, un thread de pilote doit obtenir un verrou d’écriture avec la fonction NdisAcquireRWLockWrite . Pour lire simplement ces ressources, un thread de pilote doit obtenir un verrou en lecture seule avec la fonction NdisAcquireRWLockRead . L’accès en lecture ne nécessite pas d’opérations verrouillées ou de contention pour les verrous de rotation. L’accès en lecture seule permet de maintenir de bonnes performances du système d’exploitation et des pilotes.

Une fois l’accès aux ressources terminé, le pilote appelle la fonction NdisReleaseRWLock .

Un pilote doit appeler la fonction NdisFreeRWLock pour libérer la structure NDIS_RW_LOCK_EX qu’il a allouée avec la fonction NdisAllocateRWLock .

Vous pouvez utiliser l’extension de débogueur !ndiskd.ndisrwlock pour inspecter un NDIS_RW_LOCK_EX, voir le nombre de lecteurs qu’il contient et voir qui est son enregistreur actuel. Pour plus d’informations, consultez Extensions NDIS (Ndiskd.dll).

Configuration requise

Condition requise Valeur
Client minimal pris en charge Pris en charge dans NDIS 6.20 et versions ultérieures.
Plateforme cible Universal
En-tête ndis.h (inclure Ndis.h)
Bibliothèque Ndis.lib
IRQL <=DISPATCH_LEVEL

Voir aussi

FilterAttach

Présentation des verrous de rotation

MiniportInitializeEx

Extensions NDIS (Ndiskd.dll)

NDIS_RW_LOCK_EX

NdisAcquireRWLockRead

NdisAcquireRWLockWrite

NdisFRegisterFilterDriver

NdisFreeRWLock

NdisMRegisterMiniportDriver

NdisOpenAdapterEx

NdisRegisterProtocolDriver

NdisReleaseRWLock