NdisAcquireRWLockWrite 함수(ndis.h)

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

구문

void NdisAcquireRWLockWrite(
  [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을 알 수 없는 경우 NdisAcquireRWLockWrite 함수가 IRQL 자체를 테스트하도록 허용하는 것이 더 효율적이므로 이 플래그를 설정할지 여부를 결정하기 위해 KeGetCurrentIrql을 사용하여 현재 IRQL을 테스트하지 마세요.
 

반환 값

없음

설명

NDIS 드라이버는 NdisAcquireRWLockWrite 함수를 호출하여 드라이버 스레드 간에 공유되는 리소스를 수정합니다.

드라이버는 NdisAcquireRWLockWrite 함수를 호출하기 전에 NdisAllocateRWLock 함수를 사용하여 NDIS_RW_LOCK_EX 형식의 변수를 할당해야 합니다. 드라이버는 사용하는 잠금에 대한 상주 스토리지에 대해 NdisAllocateRWLock 에 대한 핸들을 제공해야 합니다.

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

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

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

드라이버 스레드는 몇 마이크로초 이상 쓰기 잠금을 유지해서는 안 됩니다. 장기간 쓰기 잠금을 유지하면 운영 체제와 드라이버 성능이 모두 저하됩니다.

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

NdisAcquireRWLockWrite 는 스핀 잠금을 가져와 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

NdisAcquireRWLockRead

NdisAllocateRWLock

NdisMSynchronizeWithInterruptEx

NdisReleaseRWLock