Aracılığıyla paylaş


Bırakma Yordamı

Geriye doğru izleme kod dizisi azalan bir düzen içinde sıralanır.Bir özel durum oluştuğunda, tüm bağlam işletim sistemi tarafından bir bağlam kaydında saklanır.Bir özel durum işleyicisi bulmak için tekrar tekrar aşağıdaki adımları yürüten özel durum dağıtma mantığı çağrılır.

  1. Geçerli işlevi (veya zincirleme UNWIND_INFO girdileri durumunda işlev parçasını) açıklayan bir RUNTIME_FUNCTION tablosu aramak için bağlam kaydında saklanmış geçerli RIP'yi kullanın.

  2. Hiçbir işlev tablosu girdisi bulunmuyorsa, bir yaprak işlevindedir ve RSP doğrudan dönüş işaretçisini adresler.[RSP] öğesindeki dönüş işaretçisi güncellenen bağlamda saklanır, benzetimli RSP 8 ile artırılır ve adım 1 tekrarlanır.

  3. Bir işlev tablo girdisi varsa, RIP şu üç bölgede bulunabilir; a) sonuç bölümünde, b) giriş bölümünde veya c) bir istisna eylemcisinin kapsayabileceği kodda.

    • Örnek a) RIP bir çıkış içinde yer alıyorsa ve buna bağlı olarak denetim işlevi bırakıyorsa, bu işlev için bu özel durumla ilişkili hiçbir özel durum işleyicisi olamaz ve çağrıcı işlevinin bağlamını hesaplamak açısından çıkış etkileri devam ettirilmelidir.RIP'nin bir başlangıç içinde olup olmadığını belirlemek için RIP'den itibaren kod akışı incelenir.Bu kod akımı meşru bir sonuç bölümünün son parçasıyla eşleştirilebilirse, sonuç bölümü içindedir ve sonuç bölümünün kalan parçası, her yönerge işlendiğinde güncelleştirilen içerik kaydıyla benzetilir.Bundan sonra adım 1 tekrarlanır.

    • Örnek b) RIP bir giriş içinde yer alıyorsa ve buna bağlı olarak denetim işlevi girmemişse, bu işlev için bu özel durumla ilişkili hiçbir özel durum işleyicisi olamaz ve çağrıcı işlevinin bağlamını hesaplamak açısından giriş etkileri geri alınmalıdır.İşlevden başlayıp RIP'ye kadar olan uzaklık bırakma bilgisinin kodlandığı giriş boyutundan daha az veya buna eşitse, RIP giriş içindedir.Girişin etkileri işlev başlangıcından RIP sapmasına eşit ya da ondan daha az bir sapma ile ilk giriş için bırakma kodu ile ileri tarayarak daha sonra bırakma kodu dizisinde kalan tüm öğelerin etkisini geri alarak çözülür.Sonra Adım 1 tekrarlanır.

    • Örnek c) RIP bir giriş veya çıkış içinde yer almıyorsa ve işlevin bir özel durum işleyicisi (UNW_FLAG_EHANDLER ayarlanır) varsa, bu durumda dile özgü işleyici çağrılır.İşleyicisi verilerini tarar ve filtre işlevlerini uygun olarak çağırır.Dile özel işleyici özel durumun işlendiğini ya da aramanın devam edeceğini döndürebilir.Bir geriye doğru almayı doğrudan da başlatabilir.

  4. Dile özel işleyici işlenmiş durumu döndürürse, yürütmeye özgün içerik kaydı kullanarak devam edilir.

  5. Dile özel işleyici yoksa veya işleyici "aramaya devam et" durumu döndürüyorsa içerik kaydı çağrıyı yapan durumuna çözülmelidir.Bu, her birinin etkisini geri alacak şekilde, geriye doğru izleme kod dizisi öğelerinin tümünü işleyerek gerçekleştirilir.Sonra Adım 1 tekrarlanır.

Zincirleme bırakma bilgisi söz konusu olduğunda, yine temel adımlar izlenir.Tek fark, girişin etkileri geri doğru izlemek için geri doğru izleme kod dizisini yürürken bir kez dizinin sonuna ulaşıldığında üst geri doğru izleme bilgisine bağlanması ve burada bulunan tüm geri doğru izleme kod dizisinin yürünmesidir.Bu bağlama, UNW_CHAINED_INFO bayrağı içermeyen bir bırakma bilgisine gelene kadar devam eder ve onun bırakma kodu dizisinin sonuna kadar gider.

En küçük bırakma verisi kümesi 8 bayttır.Bu yalnızca 128 bayt veya daha az yığın ayırmış ve olasılıkla bir geçici olmayan kayıt kaydetmiş bir işlevi temsil edecektir.Bu ayrıca, geriye doğru izleme kodları olmayan sıfır uzunluklu bir giriş bölümü için zincirli geriye doğru izleme bilgi yapısının boyutudur.

Ayrıca bkz.

Başvuru

Özel Durum İşleme (x64)