共用方式為


例外狀況處理

作業系統會使用結構化例外狀況處理來發出特定類型的錯誤訊號。 驅動程式所呼叫的常式可能會引發驅動程式必須處理的例外狀況。

系統會捕捉下列一般類型的例外狀況:

  1. 硬體定義的錯誤或陷阱,例如,

    • 存取違規 (請參閱下列)
    • 資料類型不對齊 (,例如在奇數位節界限上對齊的 16 位實體)
    • 不合法且具特殊許可權的指示
    • 不正確鎖定序列 (嘗試在程式碼的相互鎖定區段中執行不正確指令序列)
    • 整數除以零和溢位
    • 浮點除以零、溢位、下溢和保留運算元
    • 中斷點和單一步驟執行 (,以支援偵錯工具)
  2. 系統軟體定義的例外狀況,例如

    • 防護頁面違規 (嘗試將資料載入或儲存在防護頁面內的位置)
    • 頁面讀取錯誤 (嘗試將頁面讀入記憶體,並遇到並行 I/O 錯誤)

存取違規是嘗試在目前頁面保護設定下不允許的頁面上執行作業。 存取違規發生在下列情況下:

  • 不正確讀取或寫入作業,例如寫入唯讀頁面。

  • 若要存取記憶體超過目前程式的位址空間限制, (稱為長度違規) 。

  • 若要存取目前駐留但專用於系統元件使用的頁面。 例如,不允許使用者模式程式碼存取核心所使用的頁面。

如果作業可能會造成例外狀況,驅動程式應該將作業括在 try/except 區塊中。 使用者模式中位置的存取通常是例外狀況的原因。 例如, ProbeForWrite 常式會檢查驅動程式是否可以實際寫入使用者模式緩衝區。 如果無法,常式會引發STATUS_ACCESS_VIOLATION例外狀況。 在下列程式碼範例中,驅動程式會在try/except中呼叫ProbeForWrite,以便在發生時處理產生的例外狀況。

try {
    ...
    ProbeForWrite(Buffer, BufferSize, BufferAlignment);
 
    /* Note that any access (not just the probe, which must come first,
     * by the way) to Buffer must also be within a try-except.
     */
    ...
} except (EXCEPTION_EXECUTE_HANDLER) {
    /* Error handling code */
    ...
}

驅動程式必須處理任何引發的例外狀況。 未處理的例外狀況會導致系統進行錯誤檢查。 引發例外狀況的驅動程式必須加以處理:較低層級的驅動程式無法依賴較高層級的驅動程式來處理例外狀況。

驅動程式可以使用 ExRaiseAccessViolationExRaiseDatatypeMisalignmentExRaiseStatus 常式直接引發例外狀況。 驅動程式必須處理這些常式引發的任何例外狀況。

以下是至少在特定情況下可能會引發例外狀況的常式部分清單:

使用者模式緩衝區的記憶體存取也可能造成存取違規。 如需詳細資訊,請參閱 參考User-Space位址中的錯誤

請注意,結構化例外狀況處理與 C++ 例外狀況不同。 核心不支援 C++ 例外狀況。

如需結構化例外狀況處理的詳細資訊,請參閱 Microsoft Windows SDK 和 Visual Studio 檔。