共用方式為


使用系統的取消自旋鎖

系統會提供單一的 取消自旋鎖,在呼叫某些系統例程時獲取或釋放。

變更可取消 IRP 狀態的驅動程序,包括所有可能以 STATUS_CANCELLED 完成 IRP 的程序,均必須根據本節指導方針來獲取並釋放系統自旋鎖。

在使用 I/O 管理員提供的裝置佇列的驅動程式中,任何變更 IRP 可取消狀態的驅動程式例程(除了 取消 例程以外)都必須先呼叫 IoAcquireCancelSpinLock 以取得系統取消微調鎖定。

取得取消旋轉鎖可確保僅呼叫者能夠變更該 IRP 的可取消狀態。 當呼叫端保留微調鎖定時,I/O 管理員無法針對該 IRP 呼叫驅動程式的 Cancel 例程。 同樣地,另一個驅動程式例程,例如 DispatchCleanup 例程,無法同時嘗試變更該 IRP 的可取消狀態。

在管理自己IRP佇列並使用驅動程式提供的旋轉鎖來同步佇列存取的驅動程式中,驅動程式例程不需要在呼叫IoSetCancelRoutine之前取得取消旋轉鎖。 不過,這些驅動程式應該檢查IoSetCancelRoutine傳回的 Cancel 例程指標,以判斷 Cancel 例程是否已啟動。 如需詳細資訊,請參閱 使用 Driver-Supplied 自旋鎖

任何呼叫 IoAcquireCancelSpinLock 的驅動程式例程都必須儘快呼叫 IoReleaseCancelSpinLock

驅動程序絕對不能在持有自旋鎖時,用 IRP 呼叫 IoCompleteRequest。 嘗試在持有自旋鎖時完成 IRP 可能會導致死結。