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 추적을 참조하세요.
반환 값
없음
설명
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 |