構造体 UNWIND_INFO
アンワインド データ情報構造体は、関数がスタック ポインターに与える影響と、不揮発性レジスタをスタック上で保存する場所を記録するために使用します。
UBYTE: 3 |
Version |
UBYTE: 5 |
Flags |
UBYTE |
プロローグのサイズ |
UBYTE |
アンワインド コード数 |
UBYTE: 4 |
フレーム レジスタ |
UBYTE: 4 |
フレーム レジスタのオフセット (スケール済み) |
USHORT * n |
アンワインド コード配列 |
variable |
次の (1) または (2) のいずれかの形式を指定できます。 |
(1) 例外ハンドラー
ULONG |
例外ハンドラーのアドレス |
variable |
言語固有のハンドラー データ (オプション) |
(2) チェーン アンワインド情報をアンワインド
ULONG |
関数の開始アドレス |
ULONG |
関数の終了アドレス |
ULONG |
アンワインド情報のアドレス |
UNWIND_INFO 構造体は、メモリ内で DWORD でアライメントされる必要があります。各フィールドの意味は、次のとおりです。
Version
アンワインド データのバージョン番号。現在は 1 です。Flags
現在、次の 3 つのフラグが定義されています。UNW_FLAG_EHANDLER 関数に呼び出される例外ハンドラーがあります。例外をチェックする必要がある関数を検索するとき。
UNW_FLAG_UHANDLER 関数に呼び出される終了ハンドラーがあります。例外をアンワインド場合。
これが UNW_FLAG_CHAININFO をアンワインド情報構造体はプロシージャのプライマリ 1 ではありません。一方、チェーン アンワインド情報のエントリは、前の 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 情報を表します。