共用方式為


呼叫使用微調鎖定的支援例程

呼叫 KeAcquireSpinLockKeAcquireInStackQueuedSpinLock 會將目前處理器上的 IRQL 設定為DISPATCH_LEVEL,直到對應呼叫 KeReleaseSpinLockKeReleaseInStackQueuedSpinLock 還原先前的 IRQL 為止。 因此,驅動程式必須在 IRQL <= DISPATCH_LEVEL呼叫 KeAcquireSpinLockKeAcquireInStackQueuedSpinLock 時執行。

KeAcquireSpinLockAtDpcLevelKeAcquireInStackQueuedSpinLockAtDpcLevelKeReleaseInStackQueuedSpinLockFromDpcLevelKeReleaseSpinLockFromDpcLevel 的執行速度較快,因為它們已在 IRQL = DISPATCH_LEVEL,因此這些支援例程不需要在目前的處理器上重設 IRQL。 因此,在大部分 Windows 平臺上呼叫 KeAcquireSpinLockAtDpcLevelKeAcquireInStackQueuedSpinLockAtDpcLevel 在 IRQL 上執行的嚴重錯誤小於 DISPATCH_LEVEL。 呼叫 KeReleaseSpinLockFromDpcLevel 來釋放透過 KeAcquireSpinLock 取得的微調鎖定也是錯誤,因為呼叫端的原始 IRQL 不會還原。

保留執行微調鎖定的例程,例如 ExInterlockedXxx,通常會在 IRQL = DISPATCH_LEVEL執行,直到它們釋放微調鎖定並將控制權傳回給呼叫端為止。不過,驅動程式的 InterruptService 例程和 SynchCritSection 例程可能會 (在 DIRQL) 執行,以呼叫特定的 ExInterlockedXxx例程,例如 ExInterlocked Xxx 清單例程,只要傳遞至例程的微調鎖定是由 ISR 和 SynchCritSection 例程獨佔使用。

每個保存中斷微調鎖定的例程都會在相關聯中斷物件集的 DIRQL 上執行。 因此,驅動程式不得呼叫 KeAcquireSpinLockKeReleaseSpinLock 或任何其他使用其 ISR 或 SynchCritSection 例程執行微調鎖定的例程。 這類呼叫是可能導致系統死結的錯誤,要求使用者重新啟動其計算機。 請注意,如果驅動程式的ISR或 SynchCritSection 例程呼叫 ExInterlockedXxx清單例程,驅動程式就無法重複使用它傳遞給 ExInterlockedXxx清單例程的微調鎖定,以呼叫 Ke XxxSpinLockKeXxxSpinLockXxx DpcLevel 支援例程。

如果驅動程式具有多向量 ISR 或多個 ISR,則其例程可以在任何 IRQL 上執行 KeSynchronizeExecution ,同時在連線時為相關聯的中斷物件指定的 SynchronizeIrql 值。