共用方式為


語言特定處理常式

語言特定處理常式的相對位址,在每次設定 UNW_FLAG_EHANDLER 或 UNW_FLAG_UHANDLER 旗標時會在 UNWIND_INFO 中提供。 如前一章節所述,會呼叫語言特定處理常式做為搜尋例外處理常式 (Exception Handler) 或回溯的一部分。 此處理常式具有下列原型 (Prototype):

typedef EXCEPTION_DISPOSITION (*PEXCEPTION_ROUTINE) (
    IN PEXCEPTION_RECORD ExceptionRecord,
    IN ULONG64 EstablisherFrame,
    IN OUT PCONTEXT ContextRecord,
    IN OUT PDISPATCHER_CONTEXT DispatcherContext
);

ExceptionRecord 提供例外狀況 (Exception) 記錄的指標 (含有標準的 Win64 定義)。

EstablisherFrame 是這個函式之固定堆疊配置 (Stack Allocation) 的基底位址。

ContextRecord 會指向引發例外狀況時的例外狀況內容 (如果是例外處理常式) 或目前的「回溯」內容 (如果是終止處理常式)。

DispatcherContext 會指向這個函式的發送器 (Dispatcher) 內容。 具有下列定義:

typedef struct _DISPATCHER_CONTEXT {
    ULONG64 ControlPc;
    ULONG64 ImageBase;
    PRUNTIME_FUNCTION FunctionEntry;
    ULONG64 EstablisherFrame;
    ULONG64 TargetIp;
    PCONTEXT ContextRecord;
    PEXCEPTION_ROUTINE LanguageHandler;
    PVOID HandlerData;
} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;

ControlPc 是這個函式中 RIP 的值。 值不是例外狀況位址就是控制項離開建立之函式的位址。 這是用來判斷控制是否在這個函式的某些受保護之建構中 (例如,__try/__except 或 __try/__finally 的 __try 區塊) 的 RIP。

ImageBase 是包含這個函式之模組的影像基底 (載入位址),會加到 32 位元的位移 (Offset),此位移在函式進入點和回溯資訊中使用以記錄相對位址。

FunctionEntry 提供 RUNTIME_FUNCTION 函式進入點的指標,此進入點會儲存函式以及這個函式的回溯資訊影像基底相對位址。

EstablisherFrame 是這個函式的固定堆疊配置基底位址。

TargetIp 提供選擇性的指示位址,指定回溯的接續位址。 如果未指定 EstablisherFrame,則會忽略這個位址。

ContextRecord 會指向例外狀況內容,由系統例外狀況分派/回溯程式碼所使用。

LanguageHandler 會指向要呼叫的語言特定處理常式。

HandlerData 會指向這個函式的語言特定處理常式資料。

請參閱

參考

例外處理 (x64)