שְׁאֵלָה:
מה הם מטפלי המשך הווקטור
NirIzr
2017-03-23 17:47:38 UTC
view on stackexchange narkive permalink

כמעט כולם יודעים מה הם מטפלים חריגים וקטוריים, אך לא הצלחתי למצוא מידע רב אודות "מטפלים ממשיכים ממשיכים וקטוריים" דומים ופונקציות קשורות שנתקלתי בהם כיום, כגון AddVectoredContinueHandler ו RemoveVectoredContinueHandler.

אב הטיפוס של AddVectoredContinueHandler דומה מאוד ל Prototype של AddVectoredExceptionHandler :

  PVOID WINAPI AddVectoredContinueHandler (_In_ ULONG FirstHandler, _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler);  

וכדי להפוך את הדברים ליותר מבלבלים הוא מקבל PVECTORED_EXCEPTION_HANDL בדיוק כמו שעושה AddVectoredExceptionHandler .

מה המטרה של מטפלים וקטוריים המשך וכיצד משתמשים בהם?

אחד תשובה:
NirIzr
2017-03-23 17:47:38 UTC
view on stackexchange narkive permalink

למרבה הצער תיעוד MSDN ו- API של Windows הוא ממש מועט כאן, והתקשיתי למצוא שום דבר אחר מלבד התיאור המינימלי ב- MSDN.

מתברר כי המטפלים הווקטוריים המשך הם מתוחזק ברשימה מקושרת הדומה מאוד לזו המשמשת עבור מטפלים וקטוריים חריגים. הם דומים כל כך, עד שאבות הטיפוס של הפונקציה זהים כמעט.

התבונן ב:

  PVOID WINAPI AddVectoredExceptionHandler (_In_ ULONG FirstHandler, _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler);  קוד> 

בהשוואה ל:

  PVOID WINAPI AddVectoredContinueHandler (_In_ ULONG FirstHandler, _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler);  

למרבה המזל, וקטור חריג המטפלים נפוצים ומתועדים יותר. לדוגמה, ל- MSDN יש דף אודות VEHs, המכיל את הפסקה הבאה:

מטפלים בחריגות וקטוריות הם הרחבה לטיפול בחריגים מובנים. יישום יכול לרשום פונקציה לצפייה או טיפול בכל החריגים ליישום. מטפלים וקטוריים אינם מבוססים על מסגרת, לכן ניתן להוסיף מטפל שייקרא ללא קשר למיקום בו אתה נמצא במסגרת שיחה. מטפלים וקטוריים נקראים לפי סדר הוספתם, לאחר שהבאגים מקבל הודעה על הזדמנות ראשונה, אך לפני שהמערכת מתחילה להתיר את הערימה.

באותו דף יש רק התייחסות לקונית ל ה- API של הוספה והסרה של VCH.

לאחר מחקר והנדסה הפוכה של ntdll, הבנתי ש- VCH ו- VEH דומים למדי ביישום. לדוגמה, ראה כיצד AddVectoredExceptionHandler ו- AddVectoredContinueHandler זהים למעט VectoredListIndex , וציין שיש להוסיף אותם ל VectorHandlerList השני קוד> במקרה של VCH:

AddVectoredExceptionHandler VS AddVectoredContinueHandler

באופן דומה, RemoveVectoredExceptionHandler ו- RemoveVectoredContinueHandler זהים למעט אינדקס רשימת המטפלים הווקטוריים.

בתוך RtlpAddVectoredHandler VectoredListIndex משמש אינדקס ב- _LdrpVectorHandlerList , שהוא מערך בגודל שני של מבנה רשימה מקושר.

בתמונה הבאה נוכל לראות כיצד מכפילים VectoredListIndex בגודל של אובייקט העוגן ברשימה, ואז מוסיפים ל _LdrpVectorHandlerList , שהוא קיזוז הבסיס של המערך.

VectoredListIndex used as an array index

ועכשיו נגיע לחלק המעניין - איפה VEH ו- VCH שונים?

אם נלך במעלה ההפניות הצולבות ל _LdrpVectorHandlerList , נבחין ששני הזרימות המובילות לפונקציות הוספה / הסרה כמעט זהות. מלבד ארבעת ממשקי ה- API הללו, נותרה לנו פונקציה אחת נוספת בלבד, הנקראת RtlpCallVectoredHandlers שאינה מתועדת.

זה די ברור מהשם, אך RtlpCallVectoredHandlers קוד> חוזר על הווקטור (וקטור נבחר על פי האינדקס) וקורא לכל המטפלים ברצף. ברגע שמטפל וקטור מחזיר את EXCEPTION_CONTINUE_EXECUTION ההפרדה מופסקת על ידי חזרה מוקדמת מ- RtlpCallVectoredHandlers והביצוע מתחדש.

הפונקציה היחידה הקוראת ל- RtlpCallVectoredHandlers הוא RtlDispatchException , שהיא הפונקציה העיקרית לשליחת מטפלים בחריגים.

ראשית, הוא מבצע את כל מטפלי החריגים, החל מהמטפל הראשון בחריגה וקטורית עד האחרון, ואז הולך דרך כל מטפלי החריגים המובנים שמגוללים אותם דרך הערימה. מטפל החריגים הראשון שיחזיר את EXCEPTION_CONTINUE_EXECUTION (יהיה זה מסוג VEH או SEH) יפסיק את כל תהליך הביצוע של מטפלי החריגים.

כמו VEHs, כאשר VCH נקראים, הם נקראים בזה אחר זה עד שאחד מהם מחזיר EXCEPTION_CONTINUE_EXECUTION (בדיוק כמו כאשר VEH נקראים), המסמן את RtlpCallVectoredHandlers ל הפסקה לולאת השיחות של Vectored Handlers. זה מעניין מכיוון שמשמעותו התקנת מטפל ממשיך וקטורית תחילה מאפשרת לך להסתיר חריגים מ- VCH הבאים.

מטפלים ממשיכים וקטוריים נקראים בנסיבות הבאות: מטפל חריגים (או VEH או SEH) נקרא והחזיר EXCEPTION_CONTINUE_EXECUTION

  • אם מסיבה כלשהי אימות SEH נכשל (ראה SafeSEH ומנגנונים קשורים), VCH נקרא גם, אך הביצוע לא ימשיך לאחר מכן. ניתן לראות זאת בזרימות רבות המובילות לשיחה RtlpCallVectoredHandlers מבלי להגדיר bl ל- 1 ולהשאיר אותה שווה לאפס לפני העברתו אל al והחזרת false . פונקציית השיחות, KiUserExceptionDispatcher ואז תתקשר ל- ZwRaiseException אם הערך שהוחזר על ידי KiUserExceptionDispatcher הוא false . enter image description here
  • אתה אומר "אם מטפל בחריגים (VEH או SEH) נקרא והחזיר EXCEPTION_CONTINUE_EXECUTION". האם "EXCEPTION_CONTINUE_SEARCH"? לא הגיוני להתקשר למטפל אחר לאחר הטיפול בחריג.
    @Kentzo זה בדיוק הנקודה של מטפלים וקטוריים * ממשיכים *.
    המידע שמצאתי ב- [msdn] (https://blogs.msdn.microsoft.com/zhanli/2010/06/24/c-tips-addvectoredexceptionhandler-addvectoredcontinuehandler-and-setunhandledexceptionfilter) (ראה תגובה של עובד MS) סותר עם זה.
    Nevermind: אני חושב שלא הבנתי את ההערה. זה אכן נקרא רק כפי שאתה קובע.


    שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
    Loading...