Freigeben über


struct UNWIND_INFO

Die Entladedateninformationsstruktur wird zum Aufzeichnen der Auswirkungen einer Funktion auf den Stapelzeiger und des Speicherorts der nicht flüchtigen Register auf dem Stapel verwendet:

UBYTE: 3

Version

UBYTE: 5

Flags

UBYTE

Größe des Prologs

UBYTE

Anzahl der Entladecodes

UBYTE: 4

Rahmenregister

UBYTE: 4

Rahmenregisteroffset (skaliert)

USHORT * n

Entladecode-Array

variable

Kann die Form (1) oder (2) haben, wie unten angegeben

(1) Ausnahmehandler

ULONG

Adresse des Ausnahmehandlers

variable

Sprachspezifische Handlerdaten (optional)

(2) Verkettete Entladeinformationen

ULONG

Adresse des Funktionsanfangs

ULONG

Adresse des Funktionsendes

ULONG

Adresse der Entladeinformationen

Die UNWIND_INFO-Struktur muss im Arbeitsspeicher auf DWORD-Grenzen ausgerichtet sein. Die einzelnen Felder haben folgende Bedeutung:

  • Version
    Versionsnummer der Entladedaten, gegenwärtig 1.

  • Flags
    Drei Flags sind gegenwärtig definiert:

    UNW_FLAG_EHANDLER: Die Funktion hat einen Ausnahmehandler, der beim Suchen nach Funktionen aufgerufen werden sollte, die Ausnahmen überprüfen müssen.

    UNW_FLAG_UHANDLER: Die Funktion verfügt über einen Beendigungshandler, der beim Entladen einer Ausnahme aufgerufen werden sollte.

    UNW_FLAG_CHAININFO: Diese Entladeinfostruktur ist nicht die primäre für die Prozedur. Vielmehr handelt es sich beim verketteten Entladeinformationseintrag um den Inhalt eines vorhergehenden RUNTIME_FUNCTION-Eintrags. Eine Erklärung verketteter Entladeinformationsstrukturen finden Sie im folgenden Text. Wenn dieses Flag festgelegt ist, müssen die Flags UNW_FLAG_EHANDLER und UNW_FLAG_UHANDLER gelöscht werden. Außerdem müssen das Rahmenregisterfeld und das feste Stapelzuweisungsfeld dieselben Werte haben wie in den primären Entladeinformationen.

  • Größe des Prologs
    Länge des Funktionsprologs in Byte.

  • Anzahl der Entladecodes
    Dies ist die Anzahl der Slots im Entladecode-Array. Beachten Sie, dass einige Entladecodes (z. B. UWOP_SAVE_NONVOL) mehr als einen Slot im Array einnehmen.

  • Rahmenregister
    Bei einem Wert ungleich 0 (null) verwendet die Funktion einen Framezeiger, und dieses Feld gibt die Anzahl der nicht flüchtigen Register an, die als Framezeiger verwendet werden. Dieselbe Codierung wird für das Operationsinfofeld der UNWIND_CODE-Knoten verwendet.

  • Rahmenregisteroffset (skaliert)
    Wenn das Rahmenregisterfeld einen Wert ungleich 0 (null) hat, ist dieser Wert der skalierte Offset von RSP, der für FP reg übernommen wird, wenn es eingerichtet ist. Der tatsächliche Wert von FP reg ist RSP + 16 * diese Zahl, sodass Offsets von 0 bis 240 möglich sind. Dadurch kann FP reg bei dynamischen Stapelrahmen auf die Mitte der lokalen Stapelzuweisung verweisen, um eine höhere Codedichte durch kürzere Anweisungen zu erzielen (es können mehr Anweisungen den signierten 8-Bit-Offset verwenden).

  • Entladecode-Array
    Dies ist ein Array von Elementen, das die Auswirkungen des Prologs auf die nicht flüchtigen Register und RSP angibt. Informationen zu den Bedeutungen der einzelnen Elemente finden Sie im Abschnitt zu UNWIND_CODE. Aus Ausrichtungsgründen hat dieses Array stets eine gerade Anzahl von Einträgen, wobei der letzte Eintrag potenziell nicht verwendet wird (in diesem Fall ist das Array um einen Eintrag länger als durch den Zähler im Entladecodefeld angegeben).

  • Adresse des Ausnahmehandlers
    Hierbei handelt es sich um einen bildbezogenen Zeiger auf die sprachspezifische Ausnahme oder den Beendigungshandler der Funktion (wenn das Flag UNW_FLAG_CHAININFO nicht festgelegt und eines der Flags UNW_FLAG_EHANDLER oder UNW_FLAG_UHANDLER festgelegt ist).

  • Sprachspezifische Handlerdaten
    Dies sind die sprachspezifischen Ausnahmehandlerdaten der Funktion. Das Format dieser Daten ist nicht festgelegt und wird vollständig durch den verwendeten sprachspezifischen Ausnahmehandler bestimmt.

  • Verkettete Entladeinformationen
    Wenn das UNW_FLAG_CHAININFO-Flag festgelegt ist, endet die UNWIND_INFO-Struktur mit drei UWORDs. Diese UWORDs stellen die RUNTIME_FUNCTION-Informationen für die Funktion des verketteten Entladevorgangs dar.

Siehe auch

Referenz

Entladedaten für die Ausnahmebehandlung, Debuggerunterstützung