Função NdisDprAcquireReadWriteLock (ndis.h)

A função NdisDprAcquireReadWriteLock adquire um bloqueio que o chamador usa para gravação ou acesso de leitura aos recursos compartilhados entre threads do driver.

Nota A interface de bloqueio de leitura e gravação é preterida para drivers NDIS 6.20 e posteriores, que devem usar NdisAcquireRWLockRead ou NdisAcquireRWLockWrite (configurando NDIS_RWL_AT_DISPATCH_LEVEL no parâmetro Flags ) em vez de NdisDprAcquireReadWriteLock.
 

Sintaxe

void NdisDprAcquireReadWriteLock(
  [in, out] PNDIS_RW_LOCK Lock,
  [in]      BOOLEAN       fWrite,
  [out]     PLOCK_STATE   LockState
);

Parâmetros

[in, out] Lock

Um ponteiro para uma variável opaca que representa um bloqueio. O chamador pode usar esse bloqueio para acessar recursos compartilhados.

[in] fWrite

Um valor booliano. Se o valor for TRUE, essa função será fornecida com acesso de gravação a recursos compartilhados; se o valor for FALSE, essa função será fornecida com acesso de leitura.

[out] LockState

Um ponteiro para uma variável opaca que rastreia o estado do bloqueio. Essa variável existe no intervalo entre o tempo que o chamador adquire e libera o bloqueio. O chamador deve usar uma variável diferente do tipo LOCK_STATE para cada tentativa que ele faz para adquirir o bloqueio do mesmo thread de driver não ISR.

Valor retornado

Nenhum

Comentários

O driver deve inicializar uma variável do tipo NDIS_RW_LOCK usando o Função NdisInitializeReadWriteLock antes que o driver chame qualquer outra função NdisXxxReadWriteLock. O driver deve fornecer armazenamento residente para os bloqueios que usa.

Depois de adquirir um bloqueio usando NdisDprAcquireReadWriteLock, o chamador deve liberar esse bloqueio chamando a função NdisDprReleaseReadWriteLock . Para diminuir a contagem de referência do bloqueio, um driver deve chamar
NdisDprReleaseReadWriteLock uma vez para cada chamada para NdisDprAcquireReadWriteLock.

É seguro usar NdisDprAcquireReadWriteLock e NdisDprAcquireReadWriteLock no mesmo bloqueio. No entanto, as chamadas devem ser balanceadas para que, se o bloqueio for adquirido com NdisDprAcquireReadWriteLock, ele deverá ser lançado com NdisDprReleaseReadWriteLock. Da mesma forma, se o bloqueio for adquirido com NdisAcquireReadWriteLock, ele deverá ser lançado com NdisReleaseReadWriteLock.

Com algumas arquiteturas, NdisDprAcquireReadWriteLock executa mais rápido que NdisAcquireReadWriteLock. Os drivers podem usar NdisDprAcquireReadWriteLock em vez de NdisAcquireReadWriteLock quando tiver certeza de que o IRQL atual já está DISPATCH_LEVEL. No entanto, não é necessário. A sobrecarga de chamar a função KeGetCurrentIrql é maior do que a vantagem de desempenho de chamar NdisDprAcquireReadWriteLock em vez de NdisAcquireReadWriteLock.

Para modificar recursos compartilhados entre threads de driver, um thread de driver deve adquirir um bloqueio de gravação. Para simplesmente monitorar esses recursos, um thread de driver deve adquirir um bloqueio somente leitura. O acesso de leitura não requer operações intertravadas nem contenção para bloqueios de rotação. Usar o acesso somente leitura ajuda a manter um bom desempenho do sistema operacional e do driver.

Um thread de driver nunca deve manter um bloqueio de gravação para mais de 25 microssegundos. Manter um bloqueio de gravação por um período prolongado degrada o desempenho do sistema operacional e do driver.

O driver não pode usar um bloqueio para proteger os recursos do acesso de leitura ou gravação que suas outras funções compartilham com o MiniportInterrupt e/ouFunções MiniportDisableInterruptEx. Em vez disso, o driver deve chamar NdisMSynchronizeWithInterruptEx para que seu A função MiniportSynchronizeInterrupt acessa esses recursos compartilhados no mesmo DIRQL no qual sua
MiniportInterrupt e/ou As funções MiniportDisableInterruptEx fazem.

Para obter mais informações sobre como adquirir e liberar bloqueios de rotação do NDIS, consulte Sincronização e Notificação em Drivers de Rede.

Requisitos

   
Cliente mínimo com suporte Preterido para drivers NDIS 6.20 e posteriores, que devem usar NdisAcquireRWLockRead ou NdisAcquireRWLockWrite em vez de NdisDprAcquireReadWriteLock. Com suporte no NDIS 6.0 e 6.1.
Plataforma de Destino Universal
Cabeçalho ndis.h (inclua Ndis.h)
Biblioteca Ndis.lib
IRQL = DISPATCH_LEVEL

Confira também

LOCK_STATE

MiniportDisableInterruptEx

MiniportInterrupt

MiniportSynchronizeInterrupt

NdisAcquireRWLockRead

NdisAcquireRWLockWrite

NdisDprReleaseReadWriteLock

NdisInitializeReadWriteLock

NdisMSynchronizeWithInterruptEx