Función NdisDprAcquireReadWriteLock (ndis.h)
La función NdisDprAcquireReadWriteLock adquiere un bloqueo que el autor de la llamada usa para el acceso de escritura o lectura a los recursos que se comparten entre subprocesos de controlador.
Sintaxis
void NdisDprAcquireReadWriteLock(
[in, out] PNDIS_RW_LOCK Lock,
[in] BOOLEAN fWrite,
[out] PLOCK_STATE LockState
);
Parámetros
[in, out] Lock
Puntero a una variable opaca que representa un bloqueo. El autor de la llamada puede usar este bloqueo para acceder a los recursos compartidos.
[in] fWrite
Valor booleano. Si el valor es TRUE, esta función se proporciona con acceso de escritura a los recursos compartidos; si el valor es FALSE, esta función se proporciona con acceso de lectura.
[out] LockState
Puntero a una variable opaca que realiza un seguimiento del estado del bloqueo. Esta variable existe en el intervalo entre el momento en que el autor de la llamada adquiere y libera el bloqueo. El autor de la llamada debe usar una variable diferente de tipo LOCK_STATE para cada intento que realice para adquirir el bloqueo del mismo subproceso de controlador que no sea ISR.
Valor devuelto
None
Observaciones
El controlador debe inicializar una variable de tipo NDIS_RW_LOCK mediante . Función NdisInitializeReadWriteLock antes de que el controlador llame a cualquier otra función NdisXxxReadWriteLock. El controlador debe proporcionar almacenamiento residente para los bloqueos que usa.
Después de adquirir un bloqueo mediante NdisDprAcquireReadWriteLock, el autor de la llamada debe liberar ese bloqueo llamando a la función NdisDprReleaseReadWriteLock . Para disminuir el recuento de referencias del bloqueo, un controlador debe llamar a
NdisDprReleaseReadWriteLock una vez para cada llamada a NdisDprAcquireReadWriteLock.
Es seguro usar NdisDprAcquireReadWriteLock y NdisDprAcquireReadWriteLock en el mismo bloqueo. Sin embargo, las llamadas deben equilibrarse para que si el bloqueo se adquiere con NdisDprAcquireReadWriteLock, debe liberarse con NdisDprReleaseReadWriteLock. Del mismo modo, si el bloqueo se adquiere con NdisAcquireReadWriteLock, debe liberarse con NdisReleaseReadWriteLock.
Con algunas arquitecturas, NdisDprAcquireReadWriteLock funciona más rápido que NdisAcquireReadWriteLock. Los controladores pueden usar NdisDprAcquireReadWriteLock en lugar de NdisAcquireReadWriteLock cuando está seguro de que el IRQL actual ya está DISPATCH_LEVEL. Sin embargo, no es necesario. La sobrecarga de llamar a la función KeGetCurrentIrql es mayor que la ventaja de rendimiento de llamar a NdisDprAcquireReadWriteLock en lugar de a NdisAcquireReadWriteLock.
Para modificar los recursos que se comparten entre subprocesos de controlador, un subproceso de controlador debe adquirir un bloqueo de escritura. Para supervisar simplemente esos recursos, un subproceso de controlador debe adquirir un bloqueo de solo lectura. El acceso de lectura no requiere operaciones interbloqueadas ni contención para bloqueos de número. El uso del acceso de solo lectura ayuda a mantener un buen rendimiento del sistema operativo y del controlador.
Un subproceso de controlador nunca debe contener un bloqueo de escritura para más de 25 microsegundos. Mantener un bloqueo de escritura durante un período prolongado degrada tanto el rendimiento del sistema operativo como 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 . 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 en el que su
MiniportInterrupt y/o Las funciones MiniportDisableInterruptEx hacen.
Para obtener más información sobre cómo adquirir y liberar bloqueos de número NDIS, consulte Sincronización y notificación en controladores de red.
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | En desuso para los controladores NDIS 6.20 y versiones posteriores, que deben usar NdisAcquireRWLockRead o NdisAcquireRWLockWrite en lugar de NdisDprAcquireReadWriteLock. Compatible con NDIS 6.0 y 6.1. |
Plataforma de destino | Universal |
Encabezado | ndis.h (incluya Ndis.h) |
Library | Ndis.lib |
IRQL | = DISPATCH_LEVEL |