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