История О Том, Как .Net 4.5 Был Установлен На Reactos

Это могла бы быть рождественская история со счастливым концом, но это не совсем так.

В канун Рождества 2018 года я заметил установщик .

NET 4.0 в списке протестированных приложений для ReactOS и был приятно удивлён, что он успешно установился и приложения запустились.

Но так как 4.0 уже давно не актуальна, у меня возникла безумная идея - что будет, если я попытаюсь установить версию 4.5? Установщик сразу заявил, что версия ОС не подходит. Запуск в режиме совместимости также был обнаружен им и отказался устанавливаться.

Все закончилось, даже не начавшись.



История о том, как .
</p><p>
NET 4.5 был установлен на ReactOS



Да, сейчас поменяю версию и всё заработает!

ReactOS разрабатывается как аналог Windows 2003 и сообщает версию 5.2. Для установки требуется минимум 6.0, но потом я решил, что лучше сразу нацелиться на Windows 7 и начал искать как сменить версию на 6.1. В коде по версии/MajorVersion/MinorVersion было несколько мест по всей системе, даже там, где не ожидаешь.

Заменил все пары 5.2 на 6.1, результат нулевой - даже установщик ОС не запустился.

Дальнейший поиск выдал в boot freeldr и ntldr - в 4-х местах пришлось заменить _WIN32_WINNT_WS03 на _WIN32_WINNT_WIN7. ОС установилась и сообщает нам, что это 6.1. Большой?! Нет. Почему-то при такой замене ничего толком не устанавливается - ни VirtualBox Guest Additions, ни Firefox, ни .

NET 4.0, и даже Explorer не вылетает через раз.

Итак, вам нужно создать ISO со всем необходимым и подключить его к виртуальной машине.

Благодарим байт, диск все еще работает и запускаем с него установщик заново.

Ура! Хоть запускается, но жалуется на отсутствие некоторых компонентов ОС:

История о том, как .
</p><p>
NET 4.5 был установлен на ReactOS

Первый — это служба автоматического обновления, второй — Trusted Installer. Ничего такого у нас нет — действительно, зачем ReactOS обновления Windows, а Trusted Installer не может существовать по определению, потому что он появился вместе с Windows 7. Еще в журнале была строка о том, что некий wusa.exe отсутствует. Хорошо, давайте создадим заглушки для wusa.exe и wuauserv.dll для службы обновлений.

ПР 355 .

Trusted Installer просто скопирован из 32-разрядной версии Windows 7 вместе с ключами реестра.

Теперь установщик определяет наличие всего необходимого и остается только скрепить договор каплей крови.

Процесс проверки файла пройдет успешно, и начнется установка.

Сразу получаем сообщение, что функция LCMapStringEx в модуле kernel32 отсутствует.

История о том, как .
</p><p>
NET 4.5 был установлен на ReactOS

Ок, ищу функцию в коде и, вы удивитесь, она есть, но почему-то не добавляется в список экспорта (файлы спецификаций рядом с CMakeLists.txt в корне каждой DLL).

Сборка/Установка/Запуск и снова аналогичная ошибка.

Что ж, сценарий известен.

Повторив эту процедуру 5-10 раз, нажатие Enter прогуглит установщик, что в ОС есть режим автоматической установки.

Для этого необходимо включить UnattendSetupEnabled=yes в файле boot\bootdata\bootcd\unattend.inf. Отлично, сани движутся сами! Они идут так быстро, что не успеваешь сходить за чаем — на всю установку уходит около двух минут. Настройки в unattend.inf Там же можно изменить папку установки с ReactOS на Windows или Bolgenos (а может GreenteaOS? :)), разрешение графического режима, включить установку темы и еще пару вещей.

Поскольку ReactOS написан в 2003 году, код версии 6.0+ никто особо не поддерживает. Такие места закрываются условиями #if _WIN32_WINNT > = 0x600 или даже #if 0 и их приходится приводить в рабочий вид. Добавьте недостающую функцию (хотя код @$&^%!) в экспорт (SleepConditionVariableCS требует RtlSleepConditionVariableCS) или разблокируйте структуры/поля где-нибудь в заголовках SDK. Еще более странный костыль с ntdll, kernel32 и advapi32 - для них почему-то созданы дополнения в виде ntdll_vista, kernel32_vista и advapi32_vista, в каждой из которых максимум 10-15 процедур, а в kernel32 целых две файлы Vista.c. Лебедь, рак и щука, не меньше, принимали такие решения.

Теперь тоже нет уверенности - при выкладывании ПР на GitHub один просит поместить код в *_vista-lib, второй пишет, что достаточно закрыть экспорт с условием -version=0x600+ в spec-файле.

Самое удивительное здесь то, что все подобные функции — это новый API и могут легко мирно сосуществовать с основным кодом; непонятно, зачем создавать такой забор.

Эти попытки продолжались пару месяцев, но в итоге все прекратилось, установщик завис на середине процесса, ни ругаясь, ни вылетая.



Быть а не казаться

Летом решил вернуться к аппарату.

Все-таки столько времени было потрачено, а результат нулевой.

В этот раз я решил сделать все по-другому — так как при смене заявленной версии с 5.2 на 6.1 все работает как попало, то менять версию нужно совсем в другую сторону — попробовать скомпилировать ReactOS полностью в режиме NT6. Для этого вам необходимо заменить следующие условия 0x502 на 0x600 в корне CMakeLists.txt. Да тут не до жиру, хоть 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 некоторых dll WINVER и _WIN32_WINNT были явно переназначены на другие значения, например 0x602. При этом в ReactOS полно dll, для которых WINVER теперь переопределен с 0x502 на 0x600. Было также несколько реальных ошибок #356 #359 #747 #814 #815 .

Так продолжалось месяц-два и в итоге со всеми костылями образ был собран, но установщик вообще не подавал признаков жизни.

Пострадав еще немного, предохранитель пропал

Логика не железная

Приближается очередное Рождество, и .

NET 4.5 не дает покоя.

Снова возвращаюсь к первой версии, все правки повторяются, но с некоторыми изменениями.

Если раньше вместо недостающих функций (кода для которых в ОС нет) я просто делал заглушки, то теперь я решил поискать их в коде Wine и, о чудо, они там оказались.

Перенести, адаптироваться под ReactOS, на следующую #1045 .

Где-нибудь вместо заглушки можно написать реальный код :) #1046 .

С такими изменениями установщик работал быстрее и даже завершался «успешно», но в отличие от установщика .

NET 4.0 не предлагал перезагрузку после установки — я объяснил это тем, что всё-таки софт для нового поколения ОС и нет необходимости каждый раз перезагружаться (ха-ха, святая наивность).

Когда я попытался запустить приложение helloWorld, на экране ничего не произошло, а также я не успел заметить никакой активности в диспетчере задач.

Небольшой экскурс по установщику в самом начале пути, чтобы не ждать каждый раз запуска установщика, я распаковал его в папку и нажал setup.exe вручную.

Запускать его нужно с аргументом /x86, для чего я создал для него ярлык Чуть позже я решил покопаться в ресурсах установщика, где нашел текст сообщений об ошибках и ВОТ СЮРПРИЗ - все ограничения указаны в файле ПараметрИнфо.

xml! Достаточно было закомментировать в StopBlockers условие IsInOSCompatibilityMode и всё запустилось без проблем.

Удаляю изменения, меняющие версию ОС с 5.2 на 6.0, включаю в ярлыке установки режим совместимости с Vista (чтобы он не ожидал присутствия Trusted Installer) и добавляю еще несколько функций, установщик завершил работу так же, как « успешно".

Однако если сначала установить 4.0, а затем запустить установщик 4.5, то процесс заканчивается запросом на перезагрузку! Победа!? Нет. Я же говорил вам, что это история без счастливого конца.

При попытке запустить HelloWorld результат немного другой, но ненамного - процесс занимает 11-12Мб памяти и, зависнув секунд на 20, завершается.

Запуск в режиме совместимости не помогает (ведь среда выполнения CLR запускается в каждом процессе отдельно, а не в одной общесистемной среде, стартующей с ОС версии 5.2).

В журнале видим вызовы для определения версии:

История о том, как .
</p><p>
NET 4.5 был установлен на ReactOS

Я добавил в RtlVerifyVersionInfo хак, который если запрашивается версия 6.*, то заменить версию ОС на 6.0. Линии, отмеченные стрелкой, исчезли, но результат тот же.

Не счастливый конец.



Заключение

Возможно, до успеха осталось совсем немного и вы, вдохновленные этой историей, готовы поднять флаг и завершить начатое, скачав код ReactOS и собрав его? Не так быстро.

Практически по всем PR на внесенные изменения, когда они выкладываются, сначала происходит какое-то обсуждение, но потом они висят без внимания основных разработчиков ОС.

Чтобы повторить описанное, нужно выкатить PR на ветку master по ссылкам в тексте, разблокировать кучу функций в spec-файлах (заменить версию в условии -version на 0x500+) и несколько условий 0x600 в заголовки Журнал изменений для .

NET 4.5 Помимо ПР нужно немного подправить winbase.h wincon.h и открыть функции из списка ниже advapi32

  • EventWrite (завершение)
  • EventRegister (заглушка)
  • EventUnregister (заглушка)
  • Реглоадмуистринга
  • Реглоадмуистрингв
мсвкрт
  • _Exception_handler4_common
ядро32
  • ПриобретениеSRWLockExclusive
  • ПриобретениеSRWLockShared
  • ЗакрытьThreadpool
  • ЗакрытьThreadpoolCleanupGroup
  • ЗакрытьThreadpoolCleanupGroupMembers
  • ЗакрытьThreadpoolIo
  • ЗакрытьThreadpoolTimer
  • ЗакрытьThreadpoolПодождать
  • ЗакрытьThreadpoolWork
  • SetThreadpoolTimer
  • УстановитьThreadpoolWait
  • СравнитьStringEx
  • CreateSemaphoreExA (заглушка)
  • CreateSemaphoreExW (заглушка)
  • Создать тредпул
  • CreateThreadpoolCleanupGroup
  • CreateThreadpoolIo
  • CreateThreadpoolTimer
  • Создать пул потоковОжидание
  • CreateThreadpoolWork
  • EnumCalendarInfoExEx
  • Энумдатеформатсексекс
  • EnumSystemLocalesEx
  • Энумтимеформатсексекс
  • FlushProcessWriteBuffers (заглушка)
  • GetCalendarInfoEx
  • GetDateFormatEx
  • GetLocaleInfoEx
  • Исвалидлокаленаме (заглушка)
  • GetNLSVersionEx (заглушка)
  • GetNumberFormatEx
  • GetTickCount64
  • GetTimeFormatEx
  • GetUserDefaultLocaleName
  • Лкмапстрингекс
  • InitOnceExecuteOnce
  • Инициализекритикалсекионекс
  • ИнициализироватьSRWLock
  • РелизSRWLockExclusive
  • ReleaseSRWLockShared
  • WerSetFlags (заглушка)


Нет времени собираться, давайте соберемся здесь!

Если вы следите за развитием ReactOS и пытаетесь установить новое приложение, то наверняка сталкивались с тем, что некоторые функции отсутствуют или интересное/полезное приложение бесконечно зависает. Мне это тоже знакомо и поэтому я решил регулярно компилировать сборку ОС с недостающими кусками и PR (хочу держать график еженедельно или раз в две недели).

Попробуйте эту сборку, возможно она будет полезна! Пишите, если встретите еще одну недостающую функцию — велика вероятность, что она уже есть в коде ReactOS или есть в Wine. USB-драйвера у него пока нет. Вы можете скачать Здесь С Новым годом и стабильной ReactOS! P.S. Важное обновление! Простое консольное приложение, созданное под версией 4.0 или 4.5, которое выводит список папок/файлов на диске, работает нормально.

Это значит, что проблема где-то в WinForms и WPF (зависает как в примере с WinForms), а не во всей CLR. При установке 4.5 заметил процессы ngen.exe с аргументом удалить System.Windows.Forms или System.Dynamic и т.д. Вроде удалил, но новые сборки нормально не прописал П.

П.

С.

СУПЕР важное обновление! Установщик 4.5 во время работы удаляет некоторые сборки из GAC, но где-то вылетает и не успевает скопировать новые (\Microsoft.NET\assembly\GAC_MSIL).

В результате из 115 сборок осталось 73. Если скопировать туда сборки System, System.Drawing, System.Windows.Forms и Accessibility, то запустится простое приложение WinForms! П.

П.

П.

С.

Отличный момент получился - если скопировать mscoree.dll из 4.0 в system32, то установщик 4.5 хоть и не работает полноценно, но после перезагрузки запускается консоль и приложения Win-forms. Теги: #Разработка Windows #с открытым исходным кодом #.

NET #.

NET 4.5 ReactOS

Вместе с данным постом часто просматривают: