構造体 UNWIND_INFO
更新 : 2007 年 11 月
アンワインド データ情報構造体は、関数がスタック ポインタに与える影響と、不揮発性レジスタをスタック上で保存する場所を記録するために使用します。
UBYTE: 3 |
バージョン |
UBYTE: 5 |
フラグ |
UBYTE |
プロローグのサイズ |
UBYTE |
アンワインド コード数 |
UBYTE: 4 |
フレーム レジスタ |
UBYTE: 4 |
フレーム レジスタのオフセット (スケール済み) |
USHORT * n |
アンワインド コード配列 |
variable |
次の (1) または (2) のいずれかの形式を指定できます。 |
(1) 例外ハンドラ
ULONG |
例外ハンドラのアドレス |
variable |
言語固有のハンドラ データ (オプション) |
(2) チェーン アンワインド情報
ULONG |
関数の開始アドレス |
ULONG |
関数の終了アドレス |
ULONG |
アンワインド情報のアドレス |
UNWIND_INFO 構造体は、メモリ内で DWORD でアライメントされる必要があります。各フィールドの意味は、次のとおりです。
バージョン
アンワインド データのバージョン番号。現在は 1 です。フラグ
現在、次の 3 つのフラグが定義されています。UNW_FLAG_EHANDLER: この関数には、例外を調べる必要がある関数を検索する際に呼び出す例外ハンドラがあります。
UNW_FLAG_UHANDLER: この関数には、例外をアンワインドする際に呼び出す終了ハンドラがあります。
UNW_FLAG_CHAININFO: このアンワインド情報構造体は、プロシージャの主要な構造体ではありません。一方、チェーン アンワインド情報のエントリは、前の RUNTIME_FUNCTION エントリのコンテンツです。チェーン アンワインド情報構造体については、後述の説明を参照してください。このフラグを設定する場合は、UNW_FLAG_EHANDLER フラグと UNW_FLAG_UHANDLER フラグをクリアする必要があります。また、フレーム レジスタと固定スタック割り当てフィールドには、基本アンワインド情報と同じ値を設定する必要があります。
プロローグのサイズ
関数プロローグの長さ (バイト数) です。アンワインド コード数
これは、アンワインド コード配列内のスロット数です。UWOP_SAVE_NONVOL などのアンワインド コードの中には、配列に 1 つ以上のスロットが必要なものがあります。フレーム レジスタ
0 以外の場合、関数はフレーム ポインタを使用します。そのため、このフィールドは、フレーム ポインタとして使用される不揮発性レジスタの数であり、UNWIND_CODE ノードのオペレーション情報フィールド用のエンコーディングと同じエンコーディングを使用します。フレーム レジスタのオフセット (スケール済み)
フレーム レジスタ フィールドが 0 以外の場合、これは、FP reg の設定時に FP reg に適用される RSP からスケールされたオフセットです。実際の FP reg は RSP + 16 * この番号 (0 ~ 240 までのオフセットが可能) に設定されます。これにより、FP reg が動的スタック フレームのローカル スタック割り当ての中央を指すように設定できるようになり、短い命令が使用できるので、コード密度が向上します (多くの命令が 8 ビットの符号付きオフセット フォームを使用できます)。アンワインド コード配列
これは、不揮発性レジスタと RSP へのプロローグの影響を説明する項目配列です。各項目の意味については、UNWIND_CODE のセクションを参照してください。配置上の目的のため、この配列には常に偶数エントリが設定されます。最後のエントリは未使用になる可能性があり、この場合配列は、アンワインド コード フィールド数が示す長さより長くなります。例外ハンドラのアドレス
UNW_FLAG_CHAININFO フラグがクリアされ、UNW_FLAG_EHANDLER または UNW_FLAG_UHANDLER のいずれか一方のフラグが設定されている場合、これは、関数の言語固有の例外ハンドラまたは終了ハンドラのいずれかへのイメージ相対ポインタです。言語固有のハンドラ データ
これは、関数の言語固有の例外ハンドラ データです。このデータの形式の指定はありません。使用中の特定の例外ハンドラによってのみ決定されます。チェーン アンワインド情報
UNW_FLAG_CHAININFO フラグを設定すると、UNWIND_INFO 構造体は 3 つの UWORD で終わります。これらの UWORD は、チェーン アンワインド関数の RUNTIME_FUNCTION 情報を表します。