Udostępnij za pośrednictwem


Procedura Unwind

Odkręcanie tablica kodu jest sortowana w kolejności malejącej.Gdy wystąpi wyjątek, pełny kontekst jest przechowywana przez system operacyjny w rekordzie kontekstu.Następnie wywoływana jest logika wysyłki wyjątek, który wielokrotnie wykonuje następujące kroki, aby znaleźć procedury obsługi wyjątków.

  1. Użyj bieżącego protokołu RIP, przechowywane w rekord kontekstu, aby wyszukać wpisu tabeli RUNTIME_FUNCTION, który opisuje bieżącą funkcję (lub część funkcji, w przypadku łańcuchowej wpisy UNWIND_INFO).

  2. Jeśli żadnego wpisu tabeli funkcji zostanie znaleziony, to w funkcji typu liść, a RSP bezpośrednio zajmie się wskaźnik zwrotu.Wskaźnik zwrotu u [RSP] jest przechowywany w kontekście zaktualizowany, symulowanego RSP jest zwiększana o 8 i 1 krok jest powtarzany.

  3. Jeśli funkcja wpis tabeli zostanie znaleziony, RIP można znajdują się w trzech regionach) w epilog, b) w prologu lub c) w kodzie, który może być objęty procedury obsługi wyjątków.

    • Sprawa) Jeśli ODP mieści się w epilog, a następnie kontroli wyjście z funkcji, nie może być nie skojarzonych z tym wyjątkiem, dla tej funkcji procedury obsługi wyjątków i skutki epilog należy kontynuować do obliczenia kontekście funkcji obiekt wywołujący.Aby ustalić, czy ODP znajduje się w obrębie epilog strumień kodu od protokołu RIP w jest badany.Jeżeli strumienia kodu można dopasować do końcowej części uzasadnione epilog, a następnie to w epilog i odbywa się symulacja pozostałej części epilog, z rekordu kontekstu aktualizowane tak jak każdą instrukcję przetwarzanie.Po tym krok 1 jest powtarzany.

    • Litery b) Jeśli ODP znajduje się w prologu, a następnie kontrola nie jest wprowadzana funkcja, nie może być nie skojarzonych z tym wyjątkiem, dla tej funkcji procedury obsługi wyjątków i skutków prologu musi zostać cofnięte do obliczenia kontekście funkcji obiekt wywołujący.Odp znajduje się w prologu, jeśli odległość od początku funkcji protokołu RIP jest mniejsza niż lub równa rozmiarowi prologu zakodowane w info odkręcanie.Skutki prologu są rozwijać skanowania do przodu, za pośrednictwem tablicy odkręcanie kody dla pierwszej pozycji z przesunięciem mniej niż lub równa przesunięcie RIP od początku funkcji, a następnie cofanie efekt wszystkich pozostałych elementów w tablicy kodu odkręcanie.Krok 1 jest następnie powtarzana.

    • Sprawa c), jeśli procesor RIP nie znajduje się w prologu lub epilog, a funkcja ma procedury obsługi wyjątków (UNW_FLAG_EHANDLER jest ustawiona), a następnie wywoływana jest obsługa określonego języka.Program obsługi skanuje dane i funkcje odpowiednio filtrowania wywołań.Określony program obsługi języka można zwrócić, że wyjątek został obsłużony, lub że wyszukiwanie ma być kontynuowany.To może również inicjować odkręcanie bezpośrednio.

  4. Jeśli określony program obsługi języka zwraca stan poddane obróbce, a następnie wykonywanie jest kontynuowane przy użyciu oryginalnego rekordu kontekstu.

  5. Jeśli nie ma żadnych obsługi określonego języka lub program obsługi zwraca stan "w dalszym ciągu wyszukiwania", rekord kontekstu musi być zlikwidowany do stanu wywołującego.W tym celu wszystkie elementy tablicy kodu odkręcanie, cofanie wpływ każdego przetwarzania.Krok 1 jest następnie powtarzana.

Kiedy powiązane odkręcanie info jest zaangażowany, następujące podstawowe kroki są nadal stosowane.Jedyną różnicą jest fakt, że podczas gdy chodzenie tablicy kodu odkręcanie na relaks efekty prologu, po osiągnięciu końca tablicy, następnie wiąże się info odkręcanie nadrzędnego i sprawdzał kolejne ogniwa odkręcanie całej tablicy kodu tam znaleźć.To powiązanie jest kontynuowane do dotarcia do informacji o odkręcanie bez flagi UNW_CHAINED_INFO i Zakończ chodzenie jego odkręcanie tablica kodu.

Najmniejszy zestaw odkręcanie danych wynosi 8 bajtów.Stanowiłoby to funkcja, która tylko alokowany 128 bajtów stosu lub mniej i ewentualnie zapisany jeden rejestr nieulotnej.Jest to również rozmiar łańcuchowej odkręcanie strukturę informacji dla prologu o zerowej długości z żadnych kodów odkręcanie.

Zobacz też

Informacje

Obsługa wyjątków (x64)