Compartilhar via


Função NdisAcquireRWLockRead (ndis.h)

A função NdisAcquireRWLockRead obtém um bloqueio de leitura que o chamador usa para acesso de leitura a recursos que são compartilhados entre threads de driver.

Sintaxe

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

Parâmetros

[in] Lock

Um ponteiro para uma variável de NDIS_RW_LOCK_EX opaca que representa um bloqueio. O chamador pode usar esse bloqueio para obter acesso de gravação ou leitura a recursos que são compartilhados entre threads de driver não ISR.

[out] LockState

Um ponteiro para uma variável de LOCK_STATE_EX opaca que rastreia o estado do bloqueio. Essa variável existe no intervalo entre as vezes que o chamador obtém e libera o bloqueio. O chamador deve usar uma variável diferente do tipo LOCK_STATE_EX para cada tentativa que ele faz para obter o bloqueio do mesmo thread de driver não ISR.

[in] Flags

Um valor ULONG que contém sinalizadores de bloqueio. Defina esse parâmetro como NDIS_RWL_AT_DISPATCH_LEVEL se o IRQL atual do chamador for DISPATCH_LEVEL. Caso contrário, defina esse parâmetro como zero. Para obter mais informações sobre o acompanhamento do IRQL de expedição, consulte Dispatch IRQL Tracking.

Nota Se o chamador souber que o IRQL atual está DISPATCH_LEVEL, defina esse parâmetro como NDIS_RWL_AT_DISPATCH_LEVEL. Esse sinalizador torna o bloqueio ainda mais eficiente, fazendo com que ele omita um marcar para o IRQL atual. Se o IRQL atual for desconhecido, não teste o IRQL atual com KeGetCurrentIrql apenas para determinar se deve definir esse sinalizador, pois é mais eficiente permitir que a função NdisAcquireRWLockRead teste o IRQL em si.
 

Retornar valor

Nenhum

Comentários

Os drivers NDIS chamam a função NdisAcquireRWLockRead para obter acesso somente leitura a recursos compartilhados entre threads de driver.

O driver deve alocar uma variável do tipo NDIS_RW_LOCK_EX com a função NdisAllocateRWLock antes que o driver chame a função NdisAcquireRWLockRead .

Depois que o driver chama NdisAllocateRWLock, ele pode chamar NdisAcquireRWLockWrite ou NdisAcquireRWLockRead para obter acesso de gravação ou leitura ao recurso. Somente um thread de driver não ISR por vez pode obter acesso de gravação ao recurso. Quando um thread não ISR tem acesso de gravação, todos os acessos de leitura e gravação por outros threads não ISR devem aguardar até que o titular do acesso de gravação libere o bloqueio. No entanto, se um thread não ISR tiver acesso de leitura, outros threads não ISR poderão obter acesso de leitura simultaneamente.

O bloqueio de NDIS_RW_LOCK_EX não dá suporte à promoção de leitura para gravação. Depois que um processador tiver adquirido um NDIS_RW_LOCK_EX para acesso de leitura (chamando NdisAcquireRWLockRead), o mesmo processador não deve tentar adquirir acesso de gravação (chamando NdisAcquireRWLockWrite) até que o acesso de leitura anterior seja liberado.

Um NDIS_RW_LOCK_EX bloqueio de leitura pode ser adquirido recursivamente no mesmo processador. Para cada chamada para NdisAcquireRWLockRead, deve haver uma chamada correspondente para NdisReleaseRWLock. O bloqueio só é liberado após a última chamada para NdisReleaseRWLock.

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

NdisAcquireRWLockRead sempre eleva o IRQL para IRQL = DISPATCH_LEVEL.

Requisitos

Requisito Valor
Cliente mínimo com suporte Com suporte no NDIS 6.20 e posterior.
Plataforma de Destino Universal
Cabeçalho ndis.h (inclua Ndis.h)
Biblioteca Ndis.lib
IRQL <= DISPATCH_LEVEL

Confira também

LOCK_STATE_EX

MiniportDisableInterruptEx

MiniportInterrupt

MiniportSynchronizeInterrupt

NDIS_RW_LOCK_EX

NdisAcquireRWLockWrite

NdisAllocateRWLock

NdisMSynchronizeWithInterruptEx

NdisReleaseRWLock