通常,驅動程式的 InterruptService 或 InterruptMessageService 例程 (ISR) 必須與其他驅動程式例程共用驅動程式數據和硬體資源的存取權。 由於 ISR 會在提高的中斷請求層級(IRQL)上下文中執行,且因為系統可能具有多個處理器,因此務必要同步管理對於共用數據和資源的存取權,以確保各個例程能夠在不受中斷的情況下,暫時擁有此共用資訊的獨佔存取權。
系統支援此同步處理,方法是在 中斷關鍵區段內執行ISR。 中斷具有指派的微調鎖定、 中斷微調鎖定,以及 IRQL、中斷同步處理 IRQL。 系統藉由將處理器的 IRQL 提升至中斷同步 IRQL 並在執行程式碼之前取得中斷旋轉鎖,以確保這段程式碼在關鍵區段中具有對共用資訊的獨佔存取。 在執行ISR之前,系統一律會先進入中斷的臨界區段。 不同的中斷可以共用相同的關鍵區段,方法是共用中斷微調鎖定和同步處理 IRQL。
驅動程式可以提供 SynchCritSection 例程,以實作在中斷關鍵區段中執行的程式代碼。 當驅動程式使用 KeSynchronizeExecution 呼叫 SynchCritSection 例程時,系統會自動輸入 Interrupt 參數所指定中斷的重要區段。
將處理器的 IRQL 提升至中斷的同步 IRQL,可防止目前的處理器被中斷,除非是具有較高同步 IRQL 的中斷。 取得微調鎖定可防止其他處理器執行與該微調鎖定相關聯的任何重要區段程序代碼。
當驅動程式呼叫 IoConnectInterruptEx時,系統會為中斷指派旋轉鎖和同步處理 IRQL。 在大部分情況下,驅動程式可以允許系統判斷這兩個值:
如果驅動程式使用 IoConnectInterruptEx 的 CONNECT_LINE_BASED 版本,並指定 NULL 自旋鎖,系統會為該中斷線路配置自旋鎖。 系統也會決定同步 IRQL 的值(驅動程式可以選擇性地指定較高的值)。
如果驅動程式使用 IoConnectInterruptEx 的 CONNECT_MESSAGE_BASED 版本,並指定 NULL 旋轉鎖,系統會為每個中斷訊息配置旋轉鎖。 系統也會判斷每個訊息的同步 IRQL 值(驅動程式可以選擇性地指定所有訊息通用的較高值)。
驅動程式只有在使用 CONNECT_FULLY_SPECIFIED 版本的 IoConnectInterruptEx 並且具有多個中斷向量必須共用相同的關鍵區段時,才必須配置自己的自旋鎖。 驅動程式可以使用 IO_CONNECT_INTERRUPT_PARAMETERS 的 SpinLock 和 SynchronizeIrql 成員,指定自己的自旋鎖和同步 IRQL。 如需詳細資訊,請參閱 IO_CONNECT_INTERRUPT_PARAMETERS。
如需撰寫和輸入重要區段的相關信息,請參閱 使用重要區段。