قصة كيف تم تثبيت. NET 4.5 على ReactOS

قد تكون قصة عيد الميلاد بنهاية سعيدة ، ولكنها ليست كذلك.

في عيد الميلاد عشية 2018 ، لاحظت مثبت .NET 4.0 في قائمة التطبيقات المختبرة لـ ReactOS وفوجئت بسرور أنه تم تثبيته بنجاح وبدأ تشغيل التطبيقات. ولكن بما أن الإصدار 4.0 لم يكن ذا صلة لفترة طويلة ، فقد تمت زيارتي بواسطة فكرة مجنونة - ماذا سيحدث إذا حاولت تثبيت الإصدار 4.5؟

صرح المثبت فورًا بأن إصدار نظام التشغيل غير مناسب. تم تحديد الإطلاق في وضع التوافق من قبله ورفض التثبيت. الأشياء ، انتهى كل شيء قبل أن تبدأ ...

غير متوافق مع نظام التشغيل

نعم ، الآن سأغير الإصدار وسيعمل!


يتم تطوير ReactOS كتماثل لنظام التشغيل Windows 2003 ويبلغ الإصدار 5.2. يتطلب التثبيت 6.0 على الأقل ، لكنني قررت بعد ذلك أنه من الأفضل أن يتم توجيهه على الفور إلى نظام التشغيل Windows 7 وبدأت في البحث عن كيفية تغيير الإصدار إلى 6.1. في الكود ، وفقًا للإصدار / MajorVersion / MinorVersion ، كانت هناك عدة أماكن في جميع أنحاء النظام ، حتى إذا كنت لا تتوقع ذلك. استبدال جميع الأزواج من 5.2 إلى 6.1 ، كانت النتيجة صفر - حتى لم يبدأ برنامج تثبيت نظام التشغيل. تم جلب المزيد من البحث إلى freeldr و ntldr في التمهيد - في 4 أماكن ، كان من الضروري استبدال _WIN32_WINNT_WS03 بـ _WIN32_WINNT_WIN7. نظام التشغيل مثبت ويخبرنا أن هذا هو 6.1. حسنا؟ رقم لسبب ما ، لا يتم تثبيت أي شيء بالفعل بمثل هذا الاستبدال - لا إضافات VirtualBox Guest ، ولا Firefox ، أو .NET 4.0 ، وحتى Explorer يقع مرة واحدة. حسنًا ، لذلك تحتاج إلى إنشاء ISO مع كل ما تحتاجه وتوصيله إلى الجهاز الظاهري. المجد إلى البايتات ، لا يزال محرك الأقراص يعمل ويعمل المثبت منه مرة أخرى. الصيحة! حتى يبدأ ، لكنه يشكو من عدم وجود بعض مكونات نظام التشغيل:

تنبيهات المثبت

الأول هو خدمة التحديث التلقائي ، والثاني هو المثبت الموثوق. ليس لدينا أي شيء من هذا القبيل - في الحقيقة ، لماذا توجد في ReactOS تحديثات Windows ، ولا يمكن أن يكون "المثبت الموثوق" بحكم التعريف لأنه ظهر مع Windows 7. وكان هناك أيضًا سطر في السجل يفقده بعض wusa.exe. حسنًا ، قم بإنشاء كعب الروتين لـ wusa.exe و wuauserv.dll لخدمة التحديث PR 355 . قام المثبت الموثوق بنسخ 32 بت من Windows 7 مع مفاتيح التسجيل. الآن يحدد المثبت توافر كل ما هو ضروري ويظل فقط لربط العقد مع قطرة دم.

عملية التحقق من الملف ناجحة ويبدأ التثبيت. على الفور ، تلقينا رسالة تفيد بأن وظيفة LCMapStringEx في الوحدة النمطية kernel32 مفقودة.

LCMapStringEx

حسنًا ، أبحث عن وظيفة في التعليمات البرمجية ، وستفاجأ ، إنها موجودة ولكن لسبب ما لا تتم إضافتها إلى قائمة التصدير (spec-files بجانب CMakeLists.txt في جذر كل DLL). بناء / تثبيت / تشغيل ومرة ​​أخرى خطأ مماثل. حسنًا ، البرنامج النصي معروف. بعد تكرار هذا الإجراء من 5 إلى 10 مرات من أن يقوم المثبت بالنقر فوقه ، يكون برنامج Google غوغل لأن نظام التشغيل لديه وضع تثبيت غير مراقب. للقيام بذلك ، قم بتمكين UnattendSetupEnabled = نعم في الملف boot \ bootdata \ bootcd \ unattend.inf. ركوب سوبر مزلقة! إنهم يسيرون بسرعة بحيث لا يتوفر لديك وقت للذهاب لتناول الشاي - لمدة دقيقتين في عملية التثبيت بأكملها.

الإعدادات في unattend.inf
هناك يمكنك تغيير مجلد التثبيت من ReactOS إلى Windows أو Bolgenos (أو ربما GreenteaOS؟ :)) ، ودقة وضع الرسوم ، وتمكين تثبيت السمة ونقطتين أخريين

منذ كتابة ReactOS كـ 2003 ، لا أحد يدعم بشكل خاص الكود 6.0+. تتم تغطية هذه الأماكن بالشروط # إذا _WIN32_WINNT> = 0x600 ، أو حتى #if 0 ويجب أن يتم تشغيلها. أضف الوظيفة المفقودة (على الرغم من أن الكود هو @ $ & ^٪!) للتصدير (SleepConditionVariableCS يتطلب RtlSleepConditionVariableCS) أو إلغاء تأمين الهياكل / الحقول في مكان ما في رؤوس SDK. عكاز غريب حتى مع ntdll و kernel32 و advapi32 - لسبب ما ، تم إنشاء إضافات لهم في شكل ntdll_vista و kernel32_vista و advapi32_vista لكل منها 10-15 إجراءات كحد أقصى ، بينما لدى kernel32 ملفين كاملين لـ vista.c. البجعة والسرطان والبايك ، وليس غير ذلك ، اتخذت مثل هذه القرارات. الآن لا يوجد أي يقين - عند وضع العلاقات العامة على جيثب ، يسأل المرء لنقل الكود إلى * _vista lib ، ويكتب الثاني أنه يكفي إغلاق التصدير مع الشرط -version = 0x600 + في ملف المواصفات. الأمر الأكثر إثارة للدهشة هنا هو أن كل هذه الوظائف هي واجهة برمجة تطبيقات جديدة وقد تتعايش بهدوء مع الكود الرئيسي ، ومن غير الواضح سبب سور هذه الحديقة.

استمرت هذه المحاولات لبضعة أشهر ، ولكن في النهاية استقر كل شيء على حقيقة أن المثبت سيتعلق في منتصف العملية ، لا الشتائم أو السقوط.

أن تكون ، لا يبدو


في الصيف قررت العودة إلى القشرة. ومع ذلك ، تم إنفاق الكثير من الوقت ، والنتيجة هي صفر. هذه المرة قررت أن أفعل كل شيء بشكل مختلف - لأنه عند تغيير الإصدار الذي تم الإبلاغ عنه من 5.2 إلى 6.1 ، كل شيء يعمل بشكل عشوائي ، فأنت بحاجة إلى تغيير الإصدار من اتجاه مختلف تمامًا - حاول بناء ReactOS بالكامل في وضع NT6.

للقيام بذلك ، في الجذر CMakeLists.txt ، استبدل الشروط التالية 0x502 بـ 0x600. نعم ، ليس هناك وقت للدهون ، 6.0 على الأقل للحصول على الإخراج.

# Version Options add_definitions(-DWINVER=0x502 -D_WIN32_IE=0x600 -D_WIN32_WINNT=0x502 -D_WIN32_WINDOWS=0x502 -D_SETUPAPI_VER=0x502) 


كانت توقعات النجاح من هذا المشروع في البداية ، على الرغم من أن الفكرة ككل كانت صحيحة.
جوهر المشكلة هو أنه في نواة NT6 ، تغيرت وظائف كثيرة التواقيع ، وتختلف بنية البيانات في تكوين وترتيب الحقول.

 #if (_WIN32_WINNT >= 0x600) NTSTATUS RxConstructSrvCall( _In_ PRX_CONTEXT RxContext, _In_ PIRP Irp, _In_ PSRV_CALL SrvCall, _Out_ PLOCK_HOLDING_STATE LockHoldingState); #else NTSTATUS RxConstructSrvCall( _In_ PRX_CONTEXT RxContext, _In_ PSRV_CALL SrvCall, _Out_ PLOCK_HOLDING_STATE LockHoldingState); #endif 

أخطاء البناء تمطر مثل الوفرة ، وأبسطها هو أنه في ملفات CMake لبعض dlls ، تم إعادة تعيين WINVER و _WIN32_WINNT بشكل صريح إلى قيم أخرى ، على سبيل المثال ، 0x602. في الوقت نفسه ، ReactOS مليء dlls ، حيث يتم الآن تعريف WINVER من 0x502 إلى 0x600. كان هناك بعض الأخطاء الحقيقية # 356 # 359 # 747 # 814 # 815 .

استمرت في نفس الشهر أو الشهرين ، ونتيجة لذلك ، جمعت الصورة مع جميع العكازات ، لكن المثبت لم يظهر أي علامات على الحياة على الإطلاق. ذهب المعذبة فتيل أكثر قليلا

المنطق ليس الحديد


سيأتي عيد الميلاد الجديد ، و. NET 4.5 يطارد. مرة أخرى ، أعود إلى الخيار الأول ، يتم تكرار جميع التعديلات ، ولكن مع بعض التغييرات. إذا كان الأمر من قبل ، بدلاً من الوظائف المفقودة (التي لا يوجد لها رمز في نظام التشغيل) ، لقد فعلتُ بذرة ، والآن قررت البحث عنها في رمز Wine ، وها ، لقد كانت هناك. نقل ، والتكيف مع ReactOS ، إلى # 1045 المقبل. في مكان ما ، بدلاً من كعب ، يمكنك كتابة رمز حقيقي :) # 1046 . مع هذه التعديلات ، عمل المثبت بقوة أكبر وحتى انتهى "بنجاح" ، ولكن على عكس المثبت ، لم يعرض .NET 4.0 إعادة التشغيل بعد التثبيت - كتبت أن جميع البرامج نفسها للجيل الجديد من نظام التشغيل وليس هناك حاجة لإعادة التشغيل في كل مرة ( ها ها ها ، السذاجة المقدسة). عندما حاولت تشغيل تطبيق helloWorld ، لم يحدث شيء على الشاشة ؛ في مدير المهام ، أيضًا ، لم يكن لدي وقت لإشعار أي نشاط.

استطرادا صغيرا على المثبت
في بداية المسار ، حتى لا تنتظر بدء التثبيت في كل مرة ، قمت بفك ضغطه في مجلد ، ثم قمت بالنقر فوق setup.exe يدويًا. تحتاج إلى تشغيل باستخدام الوسيطة / x86 التي قمت بإنشاء اختصار لها

بعد ذلك بقليل قررت الخوض في موارد المثبت ، حيث عثرت على نص رسائل الخطأ و HERE SURPRISE - تتم الإشارة إلى جميع القيود في ملف ParameterInfo.xml! كان يكفي للتعليق على IsInOSCompatibilityMode StopBlockers-condition ويبدأ كل شيء دون مشاكل. أزيل التعديلات التي غيّرت إصدار نظام التشغيل من 5.2 إلى 6.0 ، وقم بتشغيل وضع توافق Vista في الاختصار إلى الإعداد (لذلك لا يتوقع وجود Trusted Installer) وإضافة بعض الوظائف الإضافية التي انتهى إليها المثبت مثل "بنجاح". ومع ذلك ، إذا قمت بتثبيت الإصدار 4.0 أولاً ثم قمت بتشغيل برنامج التثبيت 4.5 ، فقد أكملت العملية بالفعل مع طلب إعادة التشغيل! النصر! رقم قلت إن هذه قصة بلا نهاية سعيدة. عندما تحاول تشغيل HelloWorld ، تكون النتيجة مختلفة قليلاً ، ولكن ليس كثيرًا - تستغرق العملية 11-12 ميغابايت من الذاكرة ، وبعد تعليقها لمدة 20 ثانية ، تنتهي. لا يساعد بدء التشغيل في وضع التوافق (بعد كل شيء ، يتم تشغيل وقت تشغيل CLR في كل عملية على حدة ، وليس بيئة واحدة على مستوى النظام تبدأ مع OS مع إصدار OS 5.2).
في السجل ، نرى مكالمات لتحديد الإصدار:

التحقق من الإصدار

أضف اختراقًا إلى RtlVerifyVersionInfo إذا طلب الإصدار 6. * ، فاستبدل إصدار نظام التشغيل 6.0. اختفت الخطوط المميزة بالسهم ، لكن النتيجة هي نفسها.

ليست نهاية سعيدة.

الخاتمة


ربما لم يتبق سوى القليل من النجاح وأنت مستوحى من هذه القصة ، هل أنت مستعد للقبض على العلم وإنهاء ما بدأته عن طريق تنزيل رمز ReactOS وتجميعه؟ ليس بهذه السرعة. في كل مستندات العلاقات العامة تقريبًا ، تتم مناقشة التغييرات التي تم إجراؤها عند طرحها لأول مرة ، ولكن بعد ذلك يتعطل دون الاهتمام من مطوري نظام التشغيل الرئيسيين.

لتكرار ما سبق ، من الضروري استدارة العلاقات العامة على الفرع الرئيسي باستخدام الروابط في النص ، وإلغاء قفل مجموعة الوظائف في ملفات المواصفات (استبدل الإصدار في حالة -version بـ 0x500 +) والعديد من الشروط 0x600 في الرؤوس

سجل التغيير ل. NET 4.5
بالإضافة إلى PROV ، تحتاج إلى إصلاح winbase.h wincon.h قليلاً وفتح الوظائف من القائمة أدناه
advapi32

  • EventWrite (كعب)
  • سجل الأحداث (كعب الروتين)
  • EventUnister تسجيل (كعب)
  • RegLoadMUIStringA
  • RegLoadMUIStringW


msvcrt
  • _except_handler4_common


kernel32
  • الحصول على SRWLockExclusive
  • AcquireSRWLockShared
  • CloseThreadpool
  • CloseThreadpoolCleanupGroup
  • CloseThreadpoolCleanupGroupMembers
  • CloseThreadpoolIo
  • CloseThreadpoolTimer
  • CloseThreadpoolWait
  • CloseThreadpoolWork
  • SetThreadpoolTimer
  • SetThreadpoolWait
  • CompareStringEx
  • CreateSemaphoreExA (كعب روتين)
  • CreateSemaphoreExW (كعب روتين)
  • Createthreadpool
  • CreateThreadpoolCleanupGroup
  • CreateThreadpoolIo
  • CreateThreadpoolTimer
  • CreateThreadpoolWait
  • CreateThreadpoolWork
  • EnumCalendarInfoExEx
  • EnumDateFormatsExEx
  • EnumSystemLocalesEx
  • EnumTimeFormatsExEx
  • FlushProcessWriteBuffers (كعب الروتين)
  • GetCalendarInfoEx
  • GetDateFormatEx
  • GetLocaleInfoEx
  • IsValidLocaleName (كعب روتين)
  • GetNLSVersionEx (كعب روتين)
  • GetNumberFormatEx
  • GetTickCount64
  • GetTimeFormatEx
  • GetUserDefaultLocaleName
  • LCMapStringEx
  • InitOnceExecuteOnce
  • InitializeCriticalSectionEx
  • InitializeSRWLock
  • ReleaseSRWLockExclusive
  • ReleaseSRWLockShared
  • WerSetFlags (كعب روتين)


ليس هناك وقت للتجميع ، تعال هنا للبناء!


إذا تابعت تطوير ReactOS وحاولت تثبيت تطبيق جديد ، فمن المحتمل أن تكون قد صادفت حقيقة أن بعض الوظائف مفقودة أو أن العلاقات العامة المعلقة / المفيدة معلقة إلى ما لا نهاية. أنا أيضًا على دراية بهذا ، ولذلك قررت تجميع مجموعة نظام التشغيل بشكل منتظم مع الأجزاء المفقودة و PRS (أريد الاحتفاظ بالجدول أسبوعيًا أو كل أسبوعين). جرب هذا التجمع ، وربما سيكون من المفيد! اكتب إذا صادفت وظيفة أخرى مفقودة - من المحتمل جدًا أن تكون موجودة بالفعل في رمز ReactOS أو في Wine. لا يوجد برنامج تشغيل USB فيه.

تحميل هنا

سنة جديدة سعيدة و ReactOS مستقرة!

PS تحديث مهم! تطبيق وحدة تحكم بسيط مبني تحت 4.0 أو 4.5 سرد مجلدات / ملفات على قرص يعمل بشكل جيد. لذلك لا يمكن الوصول إلى مكان ما مع WinForms و WPF (معلقة مثل مثال WinForms) ، وليس كل CLRs.
أثناء التثبيت 4.5 ، لاحظت أن عمليات ngen.exe باستخدام الوسيطة تزيل System.Windows.Forms أو System.Dynamic ، إلخ. يبدو أن الحذف محذوف ، لكنه لم يسجل تجميعات جديدة بشكل طبيعي

PPS SUPER التحديث المهم! يقوم المثبت 4.5 في العملية بإزالة بعض التجميعات من GAC ، لكن في مكان ما يتعطل وليس لديه وقت لنسخ مجموعات جديدة (\ Microsoft.NET \ assembly \ GAC_MSIL). نتيجة لذلك ، من أصل 115 مجموعة ، يبقى 73. إذا قمت بنسخ النظام ، System.Drawing ، System.Windows.Forms و Accessibility التجميعات هناك ، ثم يبدأ تطبيق WinForms بسيط!

PPPS لقد تحولت إلى لحظة رائعة - إذا قمت بنسخ mscoree.dll من الإصدار 4.0 في system32 ، فلن يعمل المثبت 4.5 بشكل كامل ، ولكن بعد إعادة تشغيل وحدة التحكم وتبدأ تطبيقات win-form.

Source: https://habr.com/ru/post/ar435050/


All Articles