Compartir a través de


Función NdisAcquireRWLockWrite (ndis.h)

La función NdisAcquireRWLockWrite obtiene un bloqueo de escritura que el autor de la llamada usa para el acceso de escritura a los recursos que se comparten entre subprocesos de controlador.

Sintaxis

void NdisAcquireRWLockWrite(
  [in]  PNDIS_RW_LOCK_EX Lock,
  [out] PLOCK_STATE_EX   LockState,
  [in]  UCHAR            Flags
);

Parámetros

[in] Lock

Puntero a una variable de NDIS_RW_LOCK_EX opaca que representa un bloqueo. El autor de la llamada puede usar este bloqueo para obtener acceso de escritura o lectura a los recursos que se comparten entre subprocesos de controladores que no son ISR.

[out] LockState

Puntero a una variable de LOCK_STATE_EX opaca que realiza un seguimiento del estado del bloqueo. Esta variable existe en el intervalo entre las veces que el autor de la llamada obtiene y libera el bloqueo. El autor de la llamada debe usar una variable diferente de tipo LOCK_STATE_EX para cada intento que realice para obtener el bloqueo del mismo subproceso de controlador que no es ISR.

[in] Flags

Valor de ULONG que contiene marcas de bloqueo. Establezca este parámetro en NDIS_RWL_AT_DISPATCH_LEVEL si el IRQL actual del autor de la llamada está DISPATCH_LEVEL. De lo contrario, establezca este parámetro en cero. Para obtener más información sobre el seguimiento irQL de distribución, vea Dispatch IRQL Tracking.

Nota Si el autor de la llamada sabe que el IRQL actual está DISPATCH_LEVEL, establezca este parámetro en NDIS_RWL_AT_DISPATCH_LEVEL. Esta marca hace que el bloqueo sea aún más eficaz haciendo que se omita una comprobación para el IRQL actual. Si se desconoce el IRQL actual, no pruebe el IRQL actual con KeGetCurrentIrql únicamente para determinar si se debe establecer esta marca, ya que es más eficaz permitir que la función NdisAcquireRWLockWrite pruebe el propio IRQL.
 

Valor devuelto

None

Observaciones

Los controladores NDIS llaman a la función NdisAcquireRWLockWrite para modificar los recursos que se comparten entre subprocesos de controlador.

El controlador debe asignar una variable de tipo NDIS_RW_LOCK_EX con la función NdisAllocateRWLock antes de que el controlador llame a la función NdisAcquireRWLockWrite . El controlador debe proporcionar un identificador a NdisAllocateRWLock para el almacenamiento residente para los bloqueos que usa.

Una vez que el controlador llama a NdisAllocateRWLock, puede llamar a NdisAcquireRWLockWrite o NdisAcquireRWLockRead para obtener acceso de escritura o lectura al recurso. Solo un subproceso de controlador que no es ISR a la vez puede obtener acceso de escritura al recurso. Cuando un subproceso que no es ISR tiene acceso de escritura, todos los accesos de lectura y escritura por otros subprocesos que no son ISR deben esperar hasta que el titular de acceso de escritura libere el bloqueo. Sin embargo, si un subproceso que no es ISR tiene acceso de lectura, otros subprocesos que no son ISR pueden obtener acceso de lectura simultáneamente.

El bloqueo de NDIS_RW_LOCK_EX no admite la promoción de lectura a escritura. Una vez que un procesador ha adquirido un NDIS_RW_LOCK_EX para el acceso de lectura (llamando a NdisAcquireRWLockRead), el mismo procesador no debe intentar adquirir acceso de escritura (llamando a NdisAcquireRWLockWrite) hasta que se libere el acceso de lectura anterior.

Un bloqueo de escritura NDIS_RW_LOCK_EX se puede adquirir de forma recursiva en el mismo procesador. Para cada llamada a NdisAcquireRWLockWrite, debe haber una llamada correspondiente a NdisReleaseRWLock. El bloqueo solo se libera después de la última llamada a NdisReleaseRWLock.

Un subproceso de controlador nunca debe contener un bloqueo de escritura para más de unos pocos microsegundos. Mantener un bloqueo de escritura durante un período prolongado de tiempo degrada el rendimiento del sistema operativo y del controlador.

El controlador no puede usar un bloqueo para proteger los recursos del acceso de lectura o escritura que sus otras funciones comparten con MiniportInterrupt o Funciones MiniportDisableInterruptEx o ambas. En su lugar, el controlador debe llamar a NdisMSynchronizeWithInterruptEx para que su La función MiniportSynchronizeInterrupt accede a estos recursos compartidos en el mismo DIRQL que su MiniportInterrupt o Las funciones MiniportDisableInterruptEx , o ambas, sí.

NdisAcquireRWLockWrite genera el IRQL para DISPATCH_LEVEL mediante la obtención de un bloqueo de número.

Requisitos

Requisito Value
Cliente mínimo compatible Compatible con 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

LOCK_STATE_EX

MiniportDisableInterruptEx

MiniportInterrupt

MiniportSynchronizeInterrupt

NDIS_RW_LOCK_EX

NdisAcquireRWLockRead

NdisAllocateRWLock

NdisMSynchronizeWithInterruptEx

NdisReleaseRWLock