Structured Exception Handler (SEH) Part 1

السلام عليكم ورحمة الله وبركاته

في هذه المقالة باذن الله راح نناقش الـ Windows Structured Exception Handling (SEH)

المقالة تلخيص لقراءات متفرقة من عدّة مصادر، كتب ومقالات، بالنسبة للكتب فهذه هي القائمة :

بسم الله ، لنبدأ

ما المقصود بالـ Exception و الـ Exception Handlers ؟

قبل أن نخوض في الـ SEH لنعرف أولًا ماذا نقصد بالـ Exception و الـ Exception Handlers

بالنسبة للـ Exception ، في كتاب Buffer. Overflow. Attacks نجد التعريف التالي :

an exception is a condition that occurs outside the normal flow of a program

إذا فالـ Exception أو الاستثناء بالمعنى الحرفي، هي حالة معينة تحصل وقت تنفيذ البرنامج، وهذه الحالة خارج سِياق عمل البرنامج الطبيعي، وفي أغلب الأحوال يُشار للـ Exception بالأخطاء التي تحصل وقت تنفيذ البرنامج

أحد الأمثلة لحالات الأخطاء الممكن حدوثها وقت تنفيذ البرنامج هي استعمال pointer ويكون هذا الـ pointer يُشير إلى قيمة NULL

أو مثلًا القسمة على صفر ، مثل المثال في الكود الآتي :

1

بالنسبة للـ Exception Handlers ، فهو الجزء من البرنامج المسؤول عن التعامل مع الحالة الخاصة أو الأخطاء الوارد حدوثها ( الـ Exception )

كتاب Windows System Programming يذكر لنا تفاصيل جميلة توضّح الغاية من وجود الـ Exception Handlers

Without some form of exception handling, an unintended program exception, such as dereferencing a pointer or division by zero, will terminate a program immediately without performing normal termination processing, such as deleting temporary files. SEH allows specification of a code block, or exception handler, which can delete the temporary files, perform other termination operations, and analyze and log the exception. In general, exception handlers can perform any required cleanup operations before leaving the code block.

إذًا وجود الـ Exception Handlers في البرنامج يمكّننا من إجراء عمليات إضافية في حال حدوث أي أخطاء ( Exceptions ) ، على سبيل المثال لا الحصر : في حال حدوث أي Exception خلال سير عمل البرنامج، يقوم البرنامج بحذف الملفات المؤقتة التي تم إنشاءها على النظام ( cleanup operations ) ، أو حتى قد يقوم البرنامج بكتابة تفاصيل هذا الخطأ في السجلات الخاصة بالبرنامج ( logs files ) ليعود لها المبرمج لاحقًا

إذًا فالـ Exception Handlers بكل بساطة هو جزء من البرنامج مسؤول عن العمليات اللازم إجراءها في حال حدوث أي Exception

ماهو الـ Windows Structured Exception Handling (SEH)

بعد المقدمة السابقة، نستطيع الآن الحديث عن الـ SEH

هذه المقالة قديمة جدًا لكنها تشعّبت في شرح الـ SEH ، سنأخذ بعض التفاصيل العامة منها

في البداية، نجد المعلومة الآتية

Win32 structured exception handling is an operating system-provided service.

تخبرنا المقالة أن الـ SEH هو جزء من نظام ويندوز وليست ميزة مرتبطة بلغة برمجة معينة ( وهذه نقطة مهمة ؛ أنا حقيقة في بداية القراءة حول الـ SEH كنت أعتقد أنها ميزة مرتبطة بـ C / C++ )

نجد كذلك نفس المعلومة السابقة مذكورة في موقع مايكروسوفت

The structured exception handling and termination handling mechanisms are integral parts of the system; they enable the system to be robust. You can use these mechanisms to create consistently robust and reliable applications.

إذًا، فالـ SEH هي ميزة أو خدمة يقدمها نظام التشغيل ويندوز لإدارة الـ Exceptions المحتمل حدوثها خلال تنفيذ البرنامج

لنأخذ المثال التالي حتى نستوعب الـ SEH أكثر ( المثال من نفس المقالة القديمة )

Imagine I told you that when a thread faults, the operating system gives you an opportunity to be informed of the fault. More specifically, when a thread faults, the operating system calls a user-defined callback function. This callback function can do pretty much whatever it wants. For instance, it might fix whatever caused the fault, or it might play a Beavis and Butt-head .WAV file.

نعرف بشكل عام أن البرنامج عبارة عن عملية ( Process ) والعملية تحتوي Threads واحد على الأقل أو أكثر ( المهتم بهذه التفاصيل أرشّح له الاطلاع على كتاب Windows Internals )

الآن لنتصوّر أنه خلال تنفيذ البرنامج حدث خطأ ( Exception ) في أحد الـ Threads الخاصة بالبرنامج ، مع وجود الـ SEH كميزة في نظام التشغيل، لن يقوم نظام التشغيل بانهاء البرنامج تمامًا ( لأنه حدث خطأ في أحد الـ Threads )

لكن سيتيح نظام التشغيل ويندوز للمبرمج الفرصة لتصحيح هذا الوضع عن طريق نداء دالة مسؤولة عن التعامل مع هذا الخطأ، هذه الدالة هي ما قمنا بذكره سابقًا ، وهي الـ Exception Handlers أو الـ callback function كما هو مذكور في المثال أعلاه

قبل أن نختم هذه المقالة ، هذا تعريف آخر جميل أيضًا وجدته في هذه المقالة ولعله يلخّص العديد من النقاط المهمة التي ذكرناها حول الـ SEH

SEH can be described as a generalized error handling mechanism supported by the Windows OS. It is an Operating System feature and not tied to any programming language. It forms part of the Windows Application Binary Interface (ABI) so it’s a contract between an application and the Windows OS.

نكتفي بهذا القدر من المعلومات، ونكمل بقية المواضيع حول الـ SEH في جزء آخر باذن الله

ℹ️ [ملاحظة] هذه المقالة تمّت كتابتها خلال دراسة هذه المواضيع، فكل ما تم ذكره هنا قد يحتمل الخطأ، لكن بالإمكان العودة إلى المراجع التي إستندت عليها هذه المقالة