آليات معالجة الاستثناءات الخاصة بمايكروسوفت
تستخدم عائلة أنظمة التشغيل مايكروسوفت ويندوز بعض آليات معالجة الاستثناءات المحددة.
معالجة الاستثناءات المنظمة
تُعدّ معالجة الاستثناءات المهيكلة من مايكروسوفت آلية معالجة الاستثناءات الأصلية لنظام ويندوز، وهي تقنية رائدة لمعالجة الاستثناءات المتجهة (VEH). [ 1 ] وتتميز بآلية finallyغير موجودة في استثناءات لغة C++ القياسية (لكنها موجودة في معظم لغات البرمجة الإجرائية التي ظهرت لاحقًا). يتم إعداد معالجة الاستثناءات المهيكلة ومعالجتها بشكل منفصل لكل سلسلة تنفيذ .
الاستخدام
تدعم مايكروسوفت معالجة الاستثناءات المُدارة (SEH) كتقنية برمجة على مستوى المُصرّف فقط. يحتوي مُصرّف MS Visual C++ على ثلاث كلمات مفتاحية غير قياسية لهذا الغرض: __tryو __exceptو __finally. أما جوانب معالجة الاستثناءات الأخرى فتُدعم بواسطة عدد من وظائف واجهة برمجة تطبيقات Win32 ، [ 2 ] على سبيل المثال، RaiseExceptionلرفع استثناءات SEH يدويًا.
int filterExpression ( EXCEPTION_POINTERS * ep ) { ep -> ContextRecord -> Eip += 8 ; // قد يتم ترميز تعليمة القسمة من 2 إلى 8 بايت return EXCEPTION_CONTINUE_EXECUTION ; }int main ( void ) { static int zero = 0 ; __try { zero = 1 / zero ; asm { nop nop nop nop nop nop nop } printf ( "تجاوز الاستثناء. \n " ); } __except ( filterExpression ( GetExceptionInformation ())) { printf ( "تم استدعاء المعالج. \n " ); } return 0 ; }تطبيق
IA-32
يحتوي كل خيط تنفيذ في إصدار Windows IA-32 أو طبقة محاكاة WoW64 لإصدار x86-64 على رابط لقائمة _EXCEPTION_REGISTRATION_RECORD غير موثقة في بداية كتلة معلومات الخيط . يستدعي هذا البيان أساسًا دالة معرفة من قِبل المُصرّف . تُخصّص هذه الدالة سجل _EXCEPTION_REGISTRATION_RECORD على المكدس، مُشيرةً إلى الدالة [ أ ] في [ ب ]، ثم تُضيف السجل إلى رأس القائمة. في نهاية الكتلة، يتم استدعاء دالة معرفة من قِبل المُصرّف تُنفّذ العملية العكسية. يمكن تضمين أي من هذه الإجراءات المعرفة من قِبل المُصرّف . يتم استدعاء جميع الكتل المعرفة من قِبل المُبرمج من داخل [ب]. إذا كانت الكتل المعرفة من قِبل المُبرمج موجودة، يتم توسيع سجل _EXCEPTION_REGISTRATION_RECORD الذي تم إنشاؤه بواسطة [ب ] ببعض الحقول الإضافية التي تستخدمها [ج] . [ 3 ]__tryEH_prolog__except_handler3msvcrt.dll__tryEH_epilog__except__finally__except_handler3EH_prolog__except_handler3
في حالة حدوث استثناء في كود وضع المستخدم ، يقوم نظام التشغيل [ ج ] بتحليل قائمة _EXCEPTION_REGISTRATION_RECORD الخاصة بالخيط ، ويستدعي كل معالج استثناء بالتسلسل حتى يُشير أحد المعالجات إلى أنه قد عالج الاستثناء (عن طريق قيمة الإرجاع ) أو حتى يتم استنفاد القائمة. آخر معالج في القائمة هو الذي يعرض دائمًا رسالة خطأ " خطأ الحماية العامة" . [ د ] ثم يتم اجتياز القائمة مرة أخرى لإتاحة الفرصة للمعالجات لتنظيف أي موارد مستخدمة. أخيرًا، يعود التنفيذ إلى وضع النواة [ هـ ] حيث يتم إما استئناف العملية أو إنهاؤها.kernel32!UnhandledExceptionFilter
انتهت صلاحية براءة الاختراع الخاصة بهذا النمط من SEH، US5628016، في عام 2014.
x86-64
لا تتضمن معالجة الاستثناءات المتزامنة (SEH) في أنظمة ويندوز 64 بت قائمةً لمعالجات الاستثناءات أثناء التشغيل؛ بل تستخدم جدولًا لفكّ تكديس الاستثناءات ( UNWIND_INFO) يُفسّره النظام عند حدوث استثناء. [ 4 ] [ 5 ] هذا يعني أن المُصرّف ليس مُضطرًا إلى توليد شيفرة إضافية لتنفيذ فكّ تكديس الاستثناءات يدويًا واستدعاء معالجات الاستثناءات بشكل مناسب. كل ما عليه فعله هو إصدار معلومات على شكل جداول فكّ تكديس حول تخطيط إطار المكدس ومعالجات الاستثناءات المُحددة.
يدعم
يدعم GCC 4.8+ من Mingw-w64 استخدام SEH 64-bit لاستثناءات C++. يدعم LLVM clang __tryكلاً من x86 و x64. [ 6 ]
معالجة الاستثناءات الموجهة
تم تقديم معالجة الاستثناءات الموجهة (VEH) في نظام التشغيل ويندوز إكس بي . [ 7 ] تُتاح معالجة الاستثناءات الموجهة لمبرمجي ويندوز الذين يستخدمون لغات برمجة مثل سي++ وفيجوال بيسك . لا تحل VEH محل معالجة الاستثناءات المهيكلة (SEH)؛ بل تتعايش كلتاهما، مع إعطاء الأولوية لمعالجات VEH على معالجات SEH. [ 1 ] [ 7 ] بالمقارنة مع SEH، تعمل VEH بشكل مشابه لإشارات يونكس التي يُرسلها نواة النظام . [ 8 ]
ملحوظات
- ↑ يختلف الاسم في الإصدارات المختلفة من وقت تشغيل VC
- ↑
ntdll.dllوkernel32.dll، بالإضافة إلى البرامج الأخرى المرتبطة بشكل ثابت بوقت تشغيل VC، تحتوي على هذه الوظيفة مُضمنة في الكود المُجمّع بدلاً من ذلك. - ↑ وبشكل أكثر تحديدًا،
ntdll!RtlDispatchExceptionيتم استدعاء روتين النظام منntdll!KiUserExceptionDispatcherوالذي يتم استدعاؤه بدوره منnt!KiDispatchExceptionدالة النواة. (انظر كين جونسون (16 نوفمبر 2007). "كتالوج استدعاءات وضع النواة إلى وضع المستخدم في مكتبة NTDLL، الجزء 2: KiUserExceptionDispatcher") .(للمزيد من التفاصيل) - ↑ يمكن كتم الرسالة بتغيير وضع الخطأ الخاص بالعملية؛ ويمكن استبدال معالج الخطأ الأخير الافتراضي بواجهةبرمجة التطبيقات SetUnhandledExceptionFilter.
- ↑
ntdll!KiUserExceptionDispatcherيدعو إماnt!ZwContinueأوnt!ZwRaiseException
مراجع
- 1 2 "معالجة الاستثناءات الموجهة في نظام التشغيل Windows Server 2003 (عبر أرشيف الإنترنت)" . مؤرشف من الأصل بتاريخ 18-01-2008.
- ↑ شركة مايكروسوفت (12 نوفمبر 2009). "وظائف معالجة الاستثناءات المهيكلة" . مكتبة MSDN . تم الاسترجاع في 23 يوليو 2022 .
- ↑ بيتر كلايسنر (14 فبراير 2009). "معالجة استثناءات ويندوز - بيتر كلايسنر" . مؤرشف من الأصل في 14 أكتوبر 2013. تم الاطلاع عليه بتاريخ 21 نوفمبر 2009 .قسم معالجة الاستثناءات المهيكلة القائمة على المُصرّف
- ↑ "السلوك الاستثنائي - معالجة الاستثناءات المهيكلة x64" . مجلة NT Insider.
- ↑ "معالجة استثناءات x64" . وثائق VC++ 2019. 8 فبراير 2022.
- ↑ "توافق MSVC" . وثائق Clang 11 .
- 1 2 "نظرة معمقة: معالجة الاستثناءات المتجهة الجديدة في ويندوز إكس بي" . مؤرشف من الأصل بتاريخ 15-09-2008.
- ↑ "Windows Server 2003: اكتشف معلومات النظام المحسّنة، والنواة الجديدة، وتصحيح الأخطاء، والأمان، وواجهات برمجة التطبيقات" . مؤرشف من الأصل بتاريخ 2008-05-05.
روابط خارجية
- شركة مايكروسوفت (12 نوفمبر 2009). "معالجة الاستثناءات المهيكلة" . مكتبة MSDN . تم الاطلاع عليه بتاريخ 23 يوليو 2022 .
- مات بيترك (يناير 1997). "دورة مكثفة في أعماق معالجة الاستثناءات المهيكلة في ويندوز 32" . مجلة العلوم الرياضية . 12 (1). مؤرشف من الأصل بتاريخ 10 أغسطس 2003.لاحظ أن الأمثلة المذكورة لا تعمل كما هي على أنظمة ويندوز الحديثة (بعد XP SP2) نظرًا للتغييرات التي أجرتها مايكروسوفت لمعالجة المشكلات الأمنية الموجودة في تصميم SEH الأولي. مع ذلك، لا تزال الأمثلة تعمل على الإصدارات اللاحقة من ويندوز إذا تم تجميعها باستخدام
/link /safeseh:no... - "win32: معالجة الاستثناءات المنظمة الآمنة" . دليل Yasm .
- براءة الاختراع الأمريكية رقم 7,480,919 - استثناءات آمنة
- يوهانس باسنج (20 مايو 2008). "متعة مع مستوى منخفض من SEH" .يغطي التفاصيل الغامضة اللازمة لتشغيل كود SEH منخفض المستوى (وخاصة SafeSEH) على أنظمة ويندوز الحديثة.
- إيغور سكوتشينسكي (6 مارس 2006). "الهندسة العكسية لبرنامج مايكروسوفت فيجوال سي++ الجزء الأول: معالجة الاستثناءات" . OpenRCE . تاريخ الاسترجاع: 17 نوفمبر 2009 .
- مات ميلر (2 فبراير 2009). "منع استغلال عمليات الكتابة فوق معالج الاستثناءات المهيكلة (SEH) باستخدام SEHOP" . Technet.
- ستيفان لو بير، داميان كوكيل (22 ديسمبر 2009). "تجاوز SEHOP" (ملف PDF) . سيسدريم. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 7 سبتمبر 2012.
- جوشوا ج. دريك (10 يناير 2012). "القديم يلتقي بالجديد: عدم توافق برنامج SafeSEH في نظام التشغيل مايكروسوفت ويندوز" . مؤرشف من الأصل في 9 يناير 2017. تم الاطلاع عليه في 9 يناير 2017 .مقال يشرح لماذا يتجاهل نظام التشغيل Windows 7 SP1 خاصية SafeSEH لبعض الملفات الثنائية القديمة، بينما يحترمها نظام التشغيل Windows XP SP3.
- تدفق التحكم
- واجهات برمجة تطبيقات مايكروسوفت
