المعالج الخاص باللغة

العنوان النسبي للمعالج المعين للغة موجود في UNWIND_INFO عندما يتم تعيين إشارات UNW_FLAG_EHANDLER أو UNW_FLAG_UHANDLER. كما هو موضح في المقطع السابق يتم استدعاء معالج خاص باللغة كجزء من البحث عن معالج استثناء أو كجزء من unwind. يكون له النموذج الأولي التالي:

typedef EXCEPTION_DISPOSITION (*PEXCEPTION_ROUTINE) (
    IN PEXCEPTION_RECORD ExceptionRecord,
    IN ULONG64 EstablisherFrame,
    IN OUT PCONTEXT ContextRecord,
    IN OUT PDISPATCHER_CONTEXT DispatcherContext
);

ExceptionRecord يوفر مؤشر لسجل استثناء يحتوي تعريف Win64 القياسي.

EstablisherFrame هو عنوان أساس تخصيص مكدس ثابت لهذه الدالة.

ContextRecord يشير إلى سياق الاستثناء في وقت تم فيه رفع الاستثناء (في حالة معالج الاستثناء) أو السياق unwind (المفكك) الحالي (في حالة معالج الإنهاء).

DispatcherContext يشير إلى سياق مرسل لهذه الدالة. يكون له التعريف التالي:

typedef struct _DISPATCHER_CONTEXT {
    ULONG64 ControlPc;
    ULONG64 ImageBase;
    PRUNTIME_FUNCTION FunctionEntry;
    ULONG64 EstablisherFrame;
    ULONG64 TargetIp;
    PCONTEXT ContextRecord;
    PEXCEPTION_ROUTINE LanguageHandler;
    PVOID HandlerData;
} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;

ControlPc هو قيمة RIP داخل هذه الدالة. هذا هو إما عنوان استثناء أو عنوان المكان حيث ترك عنصر تحكم الدالة المؤسسة. هذا هو RIP التي سيتم استخدامه لتحديد ما إذا كان عنصر التحكم داخل بعض البناء المحمي داخل هذه الدالة‬ (على سبيل المثال، على كتلة __try لـ __try / __except أو __try/__finally).

ImageBase هي الصورة الأساسية (عنوان التحميل) للوحدة النمطية التي تحتوي على هذه الدالة, المطلوب إضافتها إلى الإزاحات 32 بت المستخدمة في إدخال الدالة و معلومات unwind لتسجيل عناوين نسبية.

FunctionEntry توفر مؤشراً لإدخال الدالة RUNTIME_FUNCTION يحمل الدالة و العناوين النسبية لقاعدة صورة معلومات unwind لهذه الدالة.

EstablisherFrame هو عنوان أساس تخصيص مكدس ثابت لهذه الدالة.

TargetIp يوفر عنوان إرشادات اختيارية تُعيّن عنوان unwind. يتم تجاهل هذا العنوان إذا لم يتم تحديد EstablisherFrame.

ContextRecord تشير إلى سياق الاستثناء للاستخدام من قبل التعليمات البرمجية dispatch/unwind لنظام الاستثناء .

LanguageHandler يشير إلى روتين معالج لغة معين اللغة الذي يتم استدعاء.

HandlerData تشير إلى بيانات معالج خاصة بلغة معينة لهذه الدالة.

راجع أيضًا:

المرجع

معالجة استثناء (x64)