NdisDprAcquireReadWriteLock 函式 (ndis.h)
NdisDprAcquireReadWriteLock 函式會取得呼叫端用來寫入或讀取驅動程式線程之間共用資源的鎖定。
語法
void NdisDprAcquireReadWriteLock(
[in, out] PNDIS_RW_LOCK Lock,
[in] BOOLEAN fWrite,
[out] PLOCK_STATE LockState
);
參數
[in, out] Lock
代表鎖定之不透明變數的指標。 呼叫端可以使用此鎖定來存取共享資源。
[in] fWrite
布爾值。 如果值為TRUE,此函式會提供共用資源的寫入許可權;如果值為 FALSE,則此函式會提供讀取許可權。
[out] LockState
追蹤鎖定狀態的不透明變數指標。 此變數存在於呼叫端取得和釋放鎖定之間的間隔。 呼叫端必須針對每次嘗試從相同的非ISR驅動程式線程取得鎖定時,使用不同的類型變數 LOCK_STATE。
傳回值
沒有
言論
驅動程式必須使用 來初始化 類型為 NDIS_RW_LOCK 的變數在驅動程式呼叫任何其他 NdisXxxReadWriteLock 函式之前, NdisInitializeReadWriteLock 函式。 驅動程式必須提供其所使用鎖定的常駐記憶體。
使用 NdisDprAcquireReadWriteLock取得鎖定之後,呼叫端必須藉由呼叫 NdisDprReleaseReadWriteLock 函式來釋放該鎖定。 若要遞減鎖定的參考計數,驅動程式必須呼叫
NdisDprReleaseReadWriteLock 一次,每個呼叫 NdisDprAcquireReadWriteLock。
在相同的鎖定上,使用 NdisDprAcquireReadWriteLock 和 NdisDprAcquireReadWriteLock 是安全的。 不過,呼叫必須平衡,如此一來,如果鎖定是以 NdisDprAcquireReadWriteLock取得,則必須使用 NdisDprReleaseReadWriteLock發行。 同樣地,如果鎖定是以 NdisAcquireReadWriteLock取得,則必須使用 NdisReleaseReadWriteLock發行。
使用某些架構時,NdisDprAcquireReadWriteLock 的執行速度比 NdisAcquireReadWriteLock更快。 驅動程式可以使用 NdisDprAcquireReadWriteLock,而不是 NdisAcquireReadWriteLock 確定目前的 IRQL 已經 DISPATCH_LEVEL。 不過,並非必要。 呼叫 KeGetCurrentIrql 函式的額外負荷大於呼叫 NdisDprAcquireReadWriteLock 而不是 NdisAcquireReadWriteLock的效能優勢。
若要修改驅動程式線程之間共用的資源,驅動程式線程必須取得寫入鎖定。 若要只監視這些資源,驅動程式線程必須取得只讀鎖定。 讀取存取不需要同步處理鎖定的作業或爭用。 使用唯讀存取有助於維護良好的作系統和驅動程式效能。
驅動程式線程不應該保留超過 25 微秒的寫入鎖定。 長時間保留寫入鎖定會降低作系統和驅動程式效能。
驅動程式無法使用鎖定來保護資源,使其其他函式與 MiniportInterrupt 共用的讀取或寫入存取權 和/或
MiniportDisableInterruptEx 函式。 相反地,驅動程式必須呼叫 NdisMSynchronizeWithInterruptEx,使其
MiniportSynchronizeInterrupt 函式會在其所在的相同 DIRQL 存取這類共用資源
MiniportInterrupt 和/或
MiniportDisableInterruptEx 函式會執行。
如需取得和釋放 NDIS 微調鎖定的詳細資訊,請參閱網路驅動程式中的 同步處理和通知。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | NDIS 6.20 和更新版本的驅動程式已被取代,其應該使用 NdisAcquireRWLockRead 或 NdisAcquireRWLockWrite,而不是 NdisDprAcquireReadWriteLock。 NDIS 6.0 和 6.1 支援。 |
目標平臺 | 普遍 |
標頭 | ndis.h (包括 Ndis.h) |
連結庫 | Ndis.lib |
IRQL | = DISPATCH_LEVEL |