Compartir a través de


Función NdisAllocateRWLock (ndis.h)

La función NdisAllocateRWLock asigna una variable de bloqueo de lectura y escritura de tipo NDIS_RW_LOCK_EX.

Sintaxis

PNDIS_RW_LOCK_EX NdisAllocateRWLock(
  NDIS_HANDLE NdisHandle
);

Parámetros

NdisHandle

Identificador devuelto de una de las siguientes funciones:

NdisMRegisterMiniportDriver
MiniportInitializeEx
NdisRegisterProtocolDriver
NdisOpenAdapterEx
NdisFRegisterFilterDriver
FilterAttach
Windows 8 y Windows Server 2012 y versiones posteriores: si el bloqueo de lectura y escritura se asigna en DriverEntry antes de que haya disponible cualquier identificador NDIS, el autor de la llamada puede pasar un valor NULL para este parámetro.

Valor devuelto

NdisAllocateRWLock devuelve un puntero a una estructura NDIS_RW_LOCK_EX si se puede asignar una; de lo contrario, devuelve NULL.

Comentarios

Los controladores NDIS llaman a la función NdisAllocateRWLock para asignar una estructura de NDIS_RW_LOCK_EX que controla el acceso de lectura y escritura a los recursos que se comparten entre subprocesos de controlador. Los controladores usan un bloqueo de lectura y escritura para los recursos a los que se accede con frecuencia para leer y a los que se accede con poca frecuencia para escribir.

Cada bloqueo que asigna un controlador puede realizar una de las siguientes acciones:

  • Proteja un conjunto discreto de recursos compartidos de acceso de escritura y lectura simultáneos por subprocesos de controlador que se ejecutan en IRQL <= DISPATCH_LEVEL.
  • Exponga un conjunto discreto de recursos compartidos a acceso de lectura simultáneo por subprocesos de controlador que se ejecutan en IRQL <= DISPATCH_LEVEL.
El puntero NDIS_RW_LOCK_EX que devuelve NdisAllocateRWLock es un parámetro necesario para todas las demás funciones de bloqueo de lectura y escritura.

Un NDIS_RW_LOCK_EX no es justo. Es decir, un procesador que espera adquirir el bloqueo para el acceso exclusivo puede estar muerto por los procesadores que contienen el bloqueo para el acceso de lectura. Por lo tanto, no use un NDIS_RW_LOCK_EX en situaciones en las que la mayoría de los accesos serán para el acceso de escritura. Si la mayoría de los accesos necesitarán acceso de escritura, es más eficaz simplemente usar un bloqueo de número de kernel. Para obtener más información sobre los bloqueos de número, consulte Introducción a los bloqueos de número.

En situaciones en las que hay muchas adquisiciones para el acceso de lectura en más de un procesador, el NDIS_RW_LOCK_EX normalmente funciona mejor que un bloqueo de número de kernel. Use NDIS_RW_LOCK_EX cuando espere muchos accesos de lectura por segundo distribuidos en más de un procesador.

Una estructura NDIS_RW_LOCK_EX define atributos que limitan el acceso de escritura a los recursos compartidos a un subproceso de controlador que no es ISR a la vez. La estructura de NDIS_RW_LOCK_EX puede permitir que varios subprocesos de controladores que no son ISR tengan acceso de lectura simultáneo a los recursos asociados. Este acceso de lectura no se permite durante un acceso de escritura.

Para modificar los recursos protegidos, un subproceso de controlador debe obtener un bloqueo de escritura con la función NdisAcquireRWLockWrite . Para leer simplemente esos recursos, un subproceso de controlador debe obtener un bloqueo de solo lectura con la función NdisAcquireRWLockRead . El acceso de lectura no requiere operaciones interbloqueadas ni contención para bloqueos de número. El acceso de solo lectura ayuda a mantener un buen rendimiento del sistema operativo y del controlador.

Una vez completado el acceso al recurso, el controlador llama a la función NdisReleaseRWLock .

Un controlador debe llamar a la función NdisFreeRWLock para liberar la estructura NDIS_RW_LOCK_EX que asignó con la función NdisAllocateRWLock .

Puede usar la extensión del depurador !ndiskd.ndisrwlock para inspeccionar un NDIS_RW_LOCK_EX, ver cuántos lectores tiene y ver quién es su sistema de escritura actual. Para obtener más información, vea Extensiones NDIS (Ndiskd.dll).

Requisitos

Requisito Value
Cliente mínimo compatible Se admite en NDIS 6.20 y versiones posteriores.
Plataforma de destino Universal
Encabezado ndis.h (incluya Ndis.h)
Library Ndis.lib
IRQL <=DISPATCH_LEVEL

Consulte también

FilterAttach

Introducción a los bloqueos de número

MiniportInitializeEx

Extensiones NDIS (Ndiskd.dll)

NDIS_RW_LOCK_EX

NdisAcquireRWLockRead

NdisAcquireRWLockWrite

NdisFRegisterFilterDriver

NdisFreeRWLock

NdisMRegisterMiniportDriver

NdisOpenAdapterEx

NdisRegisterProtocolDriver

NdisReleaseRWLock