Compartilhar via


Função NdisAcquireRWLockWrite (ndis.h)

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

Sintaxe

void NdisAcquireRWLockWrite(
  [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 fizer 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 NdisAcquireRWLockWrite teste o IRQL em si.
 

Retornar valor

Nenhum

Comentários

Os drivers NDIS chamam a função NdisAcquireRWLockWrite para modificar 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 NdisAcquireRWLockWrite . O driver deve fornecer um identificador para NdisAllocateRWLock para o armazenamento residente para os bloqueios que ele usa.

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 deverá tentar adquirir acesso de gravação (chamando NdisAcquireRWLockWrite) até que o acesso de leitura anterior seja liberado.

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

Um thread de driver nunca deve manter um bloqueio de gravação para mais de alguns 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 contra acesso de leitura ou gravação que suas outras funções compartilham com o MiniportInterrupt ouFunções 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 ou As funções MiniportDisableInterruptEx ou ambas funcionam.

NdisAcquireRWLockWrite eleva o IRQL para DISPATCH_LEVEL obtendo um bloqueio de rotação.

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

NdisAcquireRWLockRead

NdisAllocateRWLock

NdisMSynchronizeWithInterruptEx

NdisReleaseRWLock