לדלג לתוכן

פתרון טעינה מאובטחת ותאימות

התלות ב־helper צריכה להיות import אמיתי, למשל קריאה לפונקציה מיוצאת שנעשה בה שימוש בתוצאה. קובץ שנמצא ליד engine אך אינו מיובא אינו בודק את מדיניות פתרון התלויות.

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

הלקוח עם fallback פותר קודם את scale_extended. אם אינו קיים, הוא פותר את scale_checked ומשתמש בחוזה הישן. אין לקרוא ל־GetLastError כדי להסיק שהחיפוש הצליח; בודקים קודם את ערך החזרה, ורק בכשל אוספים שגיאה.

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

ה־manifest מבקש הרצה באותו הקשר הרשאות של המפעיל באמצעות asInvoker. הצהרת supportedOS מתארת תאימות שהיישום מצהיר עליה. ההגדרה _WIN32_WINNT פועלת בזמן בנייה מול headers. שלוש ההגדרות אינן שקולות ואינן מחליפות בדיקה במערכת יעד.

אפשר לחלץ manifest משולב באמצעות כלי mt.exe שב־SDK. ב־PowerShell יש לצטט את הארגומנט שמכיל נקודה־פסיק כדי שלא יפורש כמפריד פקודות.

mt.exe "-inputresource:load_policy.exe;#1" "-out:extracted.manifest"

שינוי current directory הוא שינוי state של התהליך. קוד אחר שפותח נתיב יחסי יכול פתאום להגיע לקובץ אחר, גם אם אינו יודע דבר על DLLים. השינוי אינו פעולה מקומית של הספרייה, ולכן אינו פתרון מתאים לתכנון טעינה צפוי.

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