NdisAcquireRWLockRead 함수(ndis.h)

NdisAcquireRWLockRead 함수는 호출자가 드라이버 스레드 간에 공유되는 리소스에 대한 읽기 액세스에 사용하는 읽기 잠금을 가져옵니다.

구문

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

매개 변수

[in] Lock

잠금을 나타내는 불투명 NDIS_RW_LOCK_EX 변수에 대한 포인터입니다. 호출자는 이 잠금을 사용하여 ISR이 아닌 드라이버 스레드 간에 공유되는 리소스에 대한 쓰기 또는 읽기 액세스 권한을 얻을 수 있습니다.

[out] LockState

잠금 상태를 추적하는 불투명 LOCK_STATE_EX 변수에 대한 포인터입니다. 이 변수는 호출자가 잠금을 가져오고 해제하는 시간 사이의 간격에 존재합니다. 호출자는 ISR이 아닌 동일한 드라이버 스레드에서 잠금을 가져오려는 각 시도에 대해 LOCK_STATE_EX 형식의 다른 변수를 사용해야 합니다.

[in] Flags

잠금 플래그를 포함하는 ULONG 값입니다. 호출자의 현재 IRQL이 DISPATCH_LEVEL 경우 이 매개 변수를 NDIS_RWL_AT_DISPATCH_LEVEL 설정합니다. 그렇지 않으면 이 매개 변수를 0으로 설정합니다. 디스패치 IRQL 추적에 대한 자세한 내용은 디스패치 IRQL 추적을 참조하세요.

참고 호출자가 현재 IRQL이 DISPATCH_LEVEL 알고 있는 경우 이 매개 변수를 NDIS_RWL_AT_DISPATCH_LEVEL 설정합니다. 이 플래그는 잠금이 현재 IRQL에 대한 검사 생략하도록 하여 잠금을 더욱 효율적으로 만듭니다. 현재 IRQL을 알 수 없는 경우 NdisAcquireRWLockRead 함수가 IRQL 자체를 테스트하도록 허용하는 것이 더 효율적이므로 이 플래그를 설정할지 여부를 결정하기 위해 KeGetCurrentIrql을 사용하여 현재 IRQL을 테스트하지 마세요.
 

반환 값

없음

설명

NDIS 드라이버는 NdisAcquireRWLockRead 함수를 호출하여 드라이버 스레드 간에 공유되는 리소스에 대한 읽기 전용 액세스를 얻습니다.

드라이버는 NdisAcquireRWLockRead 함수를 호출하기 전에 NdisAllocateRWLock 함수를 사용하여 NDIS_RW_LOCK_EX 형식의 변수를 할당해야 합니다.

드라이버가 NdisAllocateRWLock을 호출한 후 NdisAcquireRWLockWrite 또는 NdisAcquireRWLockRead 를 호출하여 리소스에 대한 쓰기 또는 읽기 권한을 얻을 수 있습니다. 한 번에 하나의 ISR이 아닌 드라이버 스레드만 리소스에 대한 쓰기 권한을 얻을 수 있습니다. 하나의 비 ISR 스레드에 쓰기 액세스 권한이 있는 경우 다른 비 ISR 스레드의 모든 읽기 및 쓰기 액세스는 쓰기 액세스 소유자가 잠금을 해제할 때까지 기다려야 합니다. 그러나 ISR이 아닌 스레드에 읽기 권한이 있는 경우 다른 비 ISR 스레드는 동시에 읽기 권한을 얻을 수 있습니다.

NDIS_RW_LOCK_EX 잠금은 읽기에서 쓰기로의 승격을 지원하지 않습니다. 프로세서가 읽기 액세스에 대한 NDIS_RW_LOCK_EX 획득하면( NdisAcquireRWLockRead 호출) 동일한 프로세서는 이전 읽기 액세스가 해제될 때까지 (NdisAcquireRWLockWrite를 호출하여) 쓰기 액세스 권한을 획득하려고 시도해서는 안 됩니다.

NDIS_RW_LOCK_EX 읽기 잠금은 동일한 프로세서에서 재귀적으로 획득할 수 있습니다. NdisAcquireRWLockRead를 호출할 때마다 NdisReleaseRWLock에 대한 해당 호출이 있어야 합니다. 잠금은 NdisReleaseRWLock에 대한 마지막 호출 후에만 해제됩니다.

드라이버는 잠금을 사용하여 다른 함수가 MiniportInterrupt 또는 와 공유하는 읽기 또는 쓰기 액세스로부터 리소스를 보호할 수 없습니다. MiniportDisableInterruptEx 함수 또는 둘 다. 대신 드라이버가 를 호출해야 합니다. NdisMSynchronizeWithInterruptEx MiniportSynchronizeInterrupt 함수는 MiniportInterrupt 또는 와 동일한 DIRQL에서 이러한 공유 리소스에 액세스합니다. MiniportDisableInterruptEx 함수 또는 둘 다 수행합니다.

NdisAcquireRWLockRead 는 항상 IRQL을 IRQL = DISPATCH_LEVEL 발생합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 NDIS 6.20 이상에서 지원됩니다.
대상 플랫폼 유니버설
헤더 ndis.h(Ndis.h 포함)
라이브러리 Ndis.lib
IRQL <= DISPATCH_LEVEL

추가 정보

LOCK_STATE_EX

MiniportDisableInterruptEx

MiniportInterrupt

MiniportSynchronizeInterrupt

NDIS_RW_LOCK_EX

NdisAcquireRWLockWrite

NdisAllocateRWLock

NdisMSynchronizeWithInterruptEx

NdisReleaseRWLock