例外狀況處理
作業系統會使用結構化例外狀況處理來發出特定類型的錯誤訊號。 驅動程式所呼叫的常式可能會引發驅動程式必須處理的例外狀況。
系統會捕捉下列一般類型的例外狀況:
硬體定義的錯誤或陷阱,例如,
- 存取違規 (請參閱下列)
- 資料類型不對齊 (,例如在奇數位節界限上對齊的 16 位實體)
- 不合法且具特殊許可權的指示
- 不正確鎖定序列 (嘗試在程式碼的相互鎖定區段中執行不正確指令序列)
- 整數除以零和溢位
- 浮點除以零、溢位、下溢和保留運算元
- 中斷點和單一步驟執行 (,以支援偵錯工具)
系統軟體定義的例外狀況,例如
- 防護頁面違規 (嘗試將資料載入或儲存在防護頁面內的位置)
- 頁面讀取錯誤 (嘗試將頁面讀入記憶體,並遇到並行 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 */
...
}
驅動程式必須處理任何引發的例外狀況。 未處理的例外狀況會導致系統進行錯誤檢查。 引發例外狀況的驅動程式必須加以處理:較低層級的驅動程式無法依賴較高層級的驅動程式來處理例外狀況。
驅動程式可以使用 ExRaiseAccessViolation、 ExRaiseDatatypeMisalignment或 ExRaiseStatus 常式直接引發例外狀況。 驅動程式必須處理這些常式引發的任何例外狀況。
以下是至少在特定情況下可能會引發例外狀況的常式部分清單:
使用者模式緩衝區的記憶體存取也可能造成存取違規。 如需詳細資訊,請參閱 參考User-Space位址中的錯誤。
請注意,結構化例外狀況處理與 C++ 例外狀況不同。 核心不支援 C++ 例外狀況。
如需結構化例外狀況處理的詳細資訊,請參閱 Microsoft Windows SDK 和 Visual Studio 檔。