共用方式為


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,以取得微調鎖定保護資源的獨佔使用。 資源存取完成時,驅動程式會呼叫 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停止錯誤而發生錯誤。
驅動程序絕對不應該使用兩個微調鎖定來保護相同的 (子) 資源集,因為巢狀微調鎖定擷取經常造成死結。 即使驅動程式可以設計成防止死結,巢狀微調鎖定擷取也會對驅動程式效能和 I/O 輸送量產生負面影響。

迷你埠驅動程式無法使用微調鎖定來保護其非ISR函式與其 MiniportInterrupt 共用的資源 MiniportDisableInterruptEx 函式。 若要存取與 MiniportInterruptMiniportDisableInterruptEx 函式共享的資源,迷你埠驅動程序必須呼叫 NdisMSynchronizeWithInterruptEx 使其 MiniportSynchronizeInterrupt 函式存取 DIRQL 中的這些資源。

例如,當驅動程式不再需要資源保護時,當 NIC 正在移除,而驅動程式正在釋放為該 NIC 配置的資源時,驅動程式會呼叫 NdisFreeSpinLock

釋放微調鎖定並釋放微調鎖定可能會造成混淆。 NdisFreeSpinLock 會清除 SpinLock 的記憶體,使其不再代表微調鎖定。 釋放具有 NdisReleaseSpinLock 的已取得微調鎖定, 只允許另一個線程執行取得該微調鎖定。

如需取得和釋放 NDIS 微調鎖定的詳細資訊,請參閱網路驅動程式中的 同步處理和通知

NdisAllocateSpinLock 的呼叫者可以在任何 IRQL 上執行。 呼叫端通常會在初始化期間於 IRQL = PASSIVE_LEVEL執行。

要求

要求 價值
最低支援的用戶端 Windows Vista 中支援 NDIS 6.0 和 NDIS 5.1 驅動程式(請參閱 NdisAllocateSpinLock (NDIS 5.1)。 支援 Windows XP 中的 NDIS 5.1 驅動程式(請參閱 NdisAllocateSpinLock (NDIS 5.1)。
目標平臺 普遍
標頭 ndis.h (包括 Ndis.h)
連結庫 Ndis.lib
IRQL 任何層級 (請參閱一節)
DDI 合規性規則 SpinLockDpr(ndis)SpinLockDprRelease(ndis)SpinlockRelease(ndis)

另請參閱

NDIS 通訊協定驅動程式的 DriverEntry

MiniportDisableInterruptEx

MiniportHaltEx

MiniportInitializeEx

MiniportInterrupt

NdisAcquireSpinLock

NdisDprAcquireSpinLock

NdisDprReleaseSpinLock

NdisFreeSpinLock

NdisInterlockedAddUlong

NdisInterlockedInsertHeadList NdisInterlockedInsertTailList NdisInterlockedRemoveHeadList NdisMSynchronizeWithInterruptEx

NdisReleaseSpinLock

NetTimerCallback