言語固有のハンドラ

更新 : 2007 年 11 月

言語固有のハンドラの相対アドレスは、フラグ UNW_FLAG_EHANDLER またはフラグ UNW_FLAG_UHANDLER が設定される場合は常に UNWIND_INFO にあります。前のセクションで説明したとおり、言語固有のハンドラは、例外ハンドラの検索の一部またはアンワインドの一部として呼び出されます。このハンドラは、次のプロトタイプを持ちます。

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

ExceptionRecord は、例外レコードへのポインタを提供します。例外レコードは標準 Wind64 定義を持ちます。

EstablisherFrame は、この関数の固定スタック割り当ての基底アドレスです。

ContextRecord は、例外が発生したときの例外コンテキスト (例外ハンドラの場合)、または現在の "アンワインド" コンテキスト (終了ハンドラの場合) をポイントします。

DispatcherContext は、この関数のディスパチャ コンテキストをポイントします。次の定義を持ちます。

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 ビット オフセットに追加されます。

FunctionEntry は、RUNTIME_FUNCTION 関数とそのアンワインド情報のイメージ ベース相対アドレスを保持する、RUNTIME_FUNCTION 関数エントリへのポインタを提供します。

EstablisherFrame は、この関数の固定スタック割り当ての基底アドレスです。

TargetIp は、アンワインドの連結アドレスを指定するオプションの命令アドレスを提供します。EstablisherFrame が指定されない場合、このアドレスは無視されます。

ContextRecord は、システム例外ディスパッチまたはアンワインド コードで使用するための例外コンテキストをポイントします。

LanguageHandler は、呼び出される言語固有の言語ハンドラルーチンをポイントします。

HandlerData は、この関数の言語固有のハンドラ データをポイントします。

参照

参照

例外処理 (x64)