שניהם, DllMain
ו- DllEntryPoint
הם רק שמות סמלים של אותו מושג . הם אפילו חולקים את אותו אב-טיפוס. אך הם אינם זהים:
יש להגדיר את הפונקציה באמצעות מוסכמת השיחה __stdcall
. יש להגדיר את הפרמטרים ואת ערך ההחזרה כפי שתועדו ב- API של Win32 עבור WinMain
(עבור קובץ .exe) או DllEntryPoint
(עבור DLL). מומלץ לתת למקשר להגדיר את נקודת הכניסה כך שספריית זמן הריצה C תאותחל כראוי, ובוני C ++ לאובייקטים סטטיים יבוצעו.
(ספריית MSDN מ- Visual Studio 2005)
נקודת הכניסה ב- DLL זהה ל- EXE מבחינה טכנית , אך עם סמנטיקה ואב טיפוס שונים (EXE לעומת DLL). שניהם נמצאים בכתובת IMAGE_OPTIONAL_HEADER :: AddressOfEntryPoint
. עם זאת, ב- DLL נקודת כניסה זו היא אופציונלית (אם כי בדרך כלל מסופקת על ידי ספריית זמן הריצה). נקודת הכניסה לא מיוצאת במפורש דרך ספריית הייצוא (אם כי IDA למשל מראה אותם תחת "יצוא"). לרוב אין שם ציבורי המצורף לנקודת כניסה זו, ולכן התיעוד מתייחס אליו כ- DllEntryPoint
. אם אתה מוצא שם זה בספריית הייצוא של קובץ PE, כנראה שזה לא נקודת הכניסה בפועל מכותרת ה- PE האופציונלית (עם זאת, יהיה צורך לאשר זאת על ידי בחינת המדגם המדויק). הנקודה האחרונה, btw, מתקיימת גם עבור DllMain
.
DllMain
הוא השם ש ספריית זמן הריצה (ATL, MFC ...) יישום מצפה ממך לספק. זה שם שהמקשר יראה הפניה מיישום ברירת המחדל של DllEntryPoint
אשר נקרא _DllMainCRTStartup
ביישומי זמן הריצה. עיין בקובצי המקור של CRT crtdll.c
ו- dllcrt0.c
אם יש לך Visual Studio.
פירוש הדבר ש- DllEntryPoint
קורא DllMain
- בהנחה שהתנהגות ברירת המחדל היא. פונקציית נקודת הכניסה המיושמת בזמן ריצה ( _DllMainCRTStartup
) מבצעת אתחול אחר.
ניתן לעקוף שם זה באמצעות שורת הפקודה / entry
עבור למקשר. שוב, זה רק שם ואתה יכול לבחור מה שמתחשק לך. המגבלות (אי אפשרות לטעון קובץ DLL אחר באמצעות LoadLibrary
מתוך נקודת הכניסה וכן הלאה) אינן תלויות בשם שאתה נותן לפונקציה.
צד- הערה: ב- EXE ה- calls של TLS פועלים לפני קוד נקודת הכניסה, דבר שעלול להיות מסוכן במחקר תוכנות זדוניות. אני לא חושב שזה רלוונטי ל- DLLs, אבל אם למישהו יש יותר ידע בתחום אני מעוניין לראות מצביעים על חומר. s>
פיטר Ferrie, מהפך נכבד ואנליסט של תוכנות זדוניות, ציין בתגובה לתשובה זו:
התקשרות חוזרת של TLS פועלת תמיד בקבצי DLL מקושרים סטטית, ומכיוון ש- Vista הם גם פועלים קבצי DLL מקושרים באופן דינמי! למידע נוסף, עיין ב מצגות TLS שלי, וכמובן ב התייחסות "אולטימטיבית" נגד איתור באגים
תודה פיטר.