NdisAllocateSpinLock 函式 (ndis.h)
NdisAllocateSpinLock 函式會初始化類型為 NDIS_SPIN_LOCK 的變數,用來同步存取非 ISR 驅動程式函式之間共用的資源。
語法
void NdisAllocateSpinLock(
[out] PNDIS_SPIN_LOCK SpinLock
);
參數
[out] SpinLock
代表微調鎖定的不透明變數指標。
傳回值
無
備註
在驅動程式呼叫 NdisAcquireSpinLock、 NdisDprAcquireSpinLock 或任何 NdisInterlockedXxx 函式之前,它必須呼叫 NdisAllocateSpinLock ,以初始化傳遞為這些 NdisXxx 函式所需參數的微調鎖定。 呼叫端必須為 SpinLock 上的變數提供非分頁記憶體。
呼叫 NdisAllocateSpinLock 之後,驅動程式可以呼叫 NdisAcquireSpinLock ,以取得 (s) 微調鎖定保護的資源獨佔使用。 資源存取完成時,驅動程式會呼叫 NdisReleaseSpinLock ,讓其他驅動程式函式可以存取該微調鎖定所保護的資源 () 。
一般規則是,為了改善效能,驅動程式應該使用不同的鎖定來保護不同的重要區段。 因此,驅動程式可能會使用 NdisAllocateSpinLock 初始化多個微調鎖定。
驅動程式配置的每個微調鎖定都會防止在 IRQL <= DISPATCH_LEVEL上執行的驅動程式函式同時存取一組離散共用資源。 例如,維護封包內部佇列的驅動程式可能會初始化一個微調鎖定來保護其佇列,另一個用來保護數個驅動程式函式的狀態變數集,不包括 MiniportInterrupt 或 MiniportDisableInterruptEx 函式,在驅動程式正在處理封包時存取。
NdisAcquireSpinLock 會引發 IRQL 以DISPATCH_LEVEL,並將舊的 IRQL 儲存在微調鎖定中。 釋放微調鎖定會將 IRQL 設定為儲存在微調鎖定中的值。 由於 NDIS 有時會在PASSIVE_LEVEL進入驅動程式,因此可能會發生下列程式代碼的問題:
NdisAcquireSpinLock(A);
NdisAcquireSpinLock(B);
NdisReleaseSpinLock(A);
NdisReleaseSpinLock(B);
驅動程式不應存取此序列中的微調鎖定,原因如下:
- 在 NdisReleaseSpinLock (A) 和 NdisReleaseSpinLock (B 之間,) 程式代碼是在PASSIVE_LEVEL執行,而不是DISPATCH_LEVEL,而且可能會遭到不當中斷。
- 在 NdisReleaseSpinLock (B 之後,) 程式代碼會在DISPATCH_LEVEL執行,這會導致呼叫端在稍後發生IRQL_NOT_LESS_OR_EQUAL停止錯誤時發生錯誤。
迷你埠驅動程序無法使用微調鎖定來保護其非ISR函式與其 MiniportInterrupt 共用的資源或 MiniportDisableInterruptEx 函式。 若要存取與 MiniportInterrupt 或 MiniportDisableInterruptEx 函式共用的資源,迷你埠驅動程式必須呼叫 NdisMSynchronizeWithInterruptEx 具有其 MiniportSynchronizeInterrupt 函式會在 DIRQL 存取這些資源。
例如,當驅動程式不再需要資源保護時,當移除 NIC,而驅動程式正在釋放為該 NIC 配置的資源時,驅動程式會呼叫 NdisFreeSpinLock。
釋放微調鎖定並釋放微調鎖定可能會造成混淆。 NdisFreeSpinLock 會清除 SpinLock 上的記憶體,使其不再代表微調鎖定。 使用 NdisReleaseSpinLock 釋放取得的微調鎖定,只要讓另一個線程執行取得該微調鎖定。
如需取得和釋放 NDIS 微調鎖定的詳細資訊,請參閱 網路驅動程式中的同步處理和通知。
NdisAllocateSpinLock 的呼叫端可以在任何 IRQL 上執行。 呼叫端通常會在 IRQL = PASSIVE_LEVEL初始化期間執行。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 支援 NDIS 6.0 和 NDIS 5.1 驅動程式 (請參閱 Windows Vista 中的 NdisAllocateSpinLock (NDIS 5.1) ) 。 支援 NDIS 5.1 驅動程式 (請參閱 Windows XP 中的 NdisAllocateSpinLock (NDIS 5.1) ) 。 |
目標平台 | Universal |
標頭 | ndis.h (包括 Ndis.h) |
程式庫 | Ndis.lib |
IRQL | 任何層級 (請參閱一節) |
DDI 合規性規則 | SpinLockDpr (ndis) 、 SpinLockDprRelease (ndis) 、 SpinlockRelease (ndis) |