共用方式為


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。 否則,請將此參數設定為零。 如需分派 IRQL 追蹤的詳細資訊,請參閱 分派 IRQL 追蹤

注意 如果呼叫端知道目前的 IRQL 是 DISPATCH_LEVEL,請將此參數設定為 NDIS_RWL_AT_DISPATCH_LEVEL。 此旗標可讓鎖定更有效率,因為它省略目前 IRQL 的檢查。 如果目前的 IRQL 未知,請勿使用 KeGetCurrentIrql 測試目前的 IRQL, 只判斷是否要設定此旗標,因為允許 NdisAcquireRWLockRead 函式測試 IRQL 本身會更有效率。
 

傳回值

沒有

言論

NDIS 驅動程式會呼叫 NdisAcquireRWLockRead 函式,以取得驅動程式線程之間共用資源的只讀存取權。

驅動程式必須在驅動程式呼叫 NdisAcquireRWLockRead 函式之前,使用 NdisAllocateRWLock 函式來配置類型為 NDIS_RW_LOCK_EX 的變數。

驅動程式呼叫 NdisAllocateRWLock之後,它可以呼叫 NdisAcquireRWLockWriteNdisAcquireRWLockRead,以取得資源的寫入或讀取許可權。 一次只有一個非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