ملف PE أكبر من 2 جيجابايت
-
21-09-2019 - |
سؤال
انا اقرأ Windows عبر C/C ++. وأتساءل فقط يمكن تعيين ملف كبير للذاكرة.
عندما نقوم بتنفيذ تطبيق ، يتم تعيين ملف PE عنوان العملية (قسم المستخدم).
في النوافذ 32 بت ، يمكن تحميل ملف كبير (أكبر من 2 جيجابايت) إلى قسم المستخدم؟ أم أنه سيتم فشله؟
إذا كان ذلك ممكنًا ، فهل يساعد ملف الترحيل في التحميل؟
المحلول
لن تتمكن من القيام بذلك على نوافذ 32 بت. أي برنامج تشغيل يريد القيام بذلك سيكون على الأقل 3 وحدات تم تحميلها:
- ntdll.dll
- kernel32.dll
- yoursapplication.exe
سيتم تحميل yourapplication.exe بشكل افتراضي على 0x00400000.exe ، على الرغم من أنه يمكنك تغيير هذا العنوان. سيتم تحميل ntdll.dll و kernel32.dll على عناوين التحميل المعتادة في نطاق High 0x7DXX0000.
في Vista وأنظمة التشغيل لاحقًا ، فإن الفقرة أعلاه ليست صحيحة لأن عناوين التحميل عشوائية ، لكن DLLs ستظل موجودة على عنوانها الخاص في أول 2 جيجابايت من الذاكرة.
وبالتالي ، لن يكون لديك مساحة متجاورة كافية في أي مكان لتحميل ملف PE الكبير بشكل استثنائي ، حتى لو قمت بتشغيل Windows مع مفتاح /3GB.
إذا كنت تريد فكرة جيدة عن المكان الذي سيتم تحميل مختلف DLLs ، فاستخدم vmvalidator (مجاني) لتصور مساحة عنوان التطبيق الخاص بك. يعرض لك عرض الذاكرة الظاهرية تمثيلًا رسوميًا (1 بكسل لكل صفحة 4 كيلو بايت) للذاكرة. توضح لك الصفحات ومسافات طرق عرض الفقرة حالة الذاكرة الافتراضية الفعلية لكل صفحة ذاكرة وفقرة الذاكرة.
بالنسبة إلى Windows 64 بت ، قد تكون قادرًا على تحميل ملف PE بسعة 2 جيجابايت 64 بت - يجب أن يكون هناك بالتأكيد مساحة متجاورة للسماح له بالتحميل في الذاكرة. بالنسبة إلى ما إذا كان سيعمل بعد ذلك ، لا يمكنني قوله ، فسيتعين عليك اختباره.
نصائح أخرى
لا ، لا يمكنك - سوف تستنفد مساحة VA الخاصة بك ، بغض النظر عن إعداد ملف الترحيل.
لا أعتقد أن الملف بأكمله قد تم تعيينه ، فقط حتى حجم الصورة القابلة للتنفيذ (كما هو موضح في رأس PE). لذلك يجب أن يكون أرشيف الاستخلاص الذاتي> 2 جيجابايت ممكنًا. سيتعين على الكود استخدام الملف القياسي I/OS لاستخراج بياناته من الجزء الأخير من الملف ، بعد نهاية صورة PE.