Ça pourrait être une histoire de Noël avec une fin heureuse, mais ce n'est pas tout à fait ça.
La veille de Noël 2018, j'ai remarqué un programme d'installation .NET 4.0 dans la liste des applications testées pour ReactOS et j'ai été agréablement surpris qu'il ait été installé avec succès et que les applications aient démarré. Mais comme la 4.0 n'est plus d'actualité depuis longtemps, j'ai eu une idée folle: que se passera-t-il si j'essaie d'installer la version 4.5?
Le programme d'installation a immédiatement déclaré que la version du système d'exploitation ne convenait pas. Le lancement en mode compatibilité a également été déterminé par lui et a refusé d'installer. Les choses, tout s'est terminé avant de commencer ...

Oui, maintenant je vais changer la version et ça marchera!
ReactOS est en cours de développement en tant qu'analogue de Windows 2003 et rapporte la version 5.2. L'installation nécessite au moins 6.0, mais j'ai alors décidé qu'il valait mieux viser tout de suite sur Windows 7 et j'ai commencé à chercher comment changer la version en 6.1. Dans le code, selon la version / MajorVersion / MinorVersion, il y avait plusieurs endroits dans le système, même là où vous ne vous attendiez pas. Remplaçant toutes les paires de 5.2 à 6.1, le résultat était nul - même le programme d'installation du système d'exploitation n'a pas démarré. Des recherches supplémentaires ont amené freeldr et ntldr au démarrage - à 4 endroits, il a été nécessaire de remplacer _WIN32_WINNT_WS03 par _WIN32_WINNT_WIN7. L'OS est installé et nous indique que c'est 6.1. D'accord?! Non. Pour une raison quelconque, rien n'est vraiment installé avec un tel remplacement - ni VirtualBox Guest Additions, ni Firefox, ni .NET 4.0, et même Explorer ne tombe une fois. D'accord, vous devez donc créer une image ISO avec tout ce dont vous avez besoin et la connecter à la machine virtuelle. Gloire aux octets, le lecteur fonctionne toujours et le programme d'installation recommence. Hourra! Il démarre même, mais se plaint du manque de certains composants du système d'exploitation:

Le premier est un service de mise à jour automatique, le second est un programme d'installation de confiance. Nous n'avons rien de tel - vraiment, pourquoi dans ReactOS il y a des mises à jour Windows, et le programme d'installation de confiance ne peut pas être par définition car il est apparu avec Windows 7. Il y avait aussi une ligne dans le journal que certains wusa.exe manquaient. Ok, créez les talons pour wusa.exe et wuauserv.dll pour le service de mise à jour
PR 355 . Le programme d'installation de confiance vient de copier 32 bits à partir de Windows 7 avec les clés de registre. Maintenant, l'installateur détermine la disponibilité de tout le nécessaire et il ne reste plus qu'à fixer le contrat avec une goutte de sang.
Le processus de vérification des fichiers a réussi et l'installation démarre. Immédiatement, nous obtenons un message indiquant que la fonction LCMapStringEx du module kernel32 est manquante.

Ok, je recherche une fonction dans le code et, vous serez surpris, elle existe mais pour une raison quelconque elle n'est pas ajoutée à la liste d'exportation (fichiers de spécifications à côté de CMakeLists.txt à la racine de chaque DLL). Build / Install / Run et encore une erreur similaire. Eh bien, le script est connu. Après avoir répété cette procédure 5 à 10 fois après avoir été cliqué par le programme d'installation, le programme d'installation est googlé que le système d'exploitation a un mode d'installation sans assistance. Pour ce faire, activez UnattendSetupEnabled = yes dans le fichier boot \ bootdata \ bootcd \ unattend.inf. Super promenade en traîneau! Ils vont si vite que vous n'avez pas le temps d'aller prendre le thé - pendant deux minutes toute l'installation.
Paramètres dans unattend.infLà, vous pouvez changer le dossier d'installation de ReactOS en Windows ou Bolgenos (ou peut-être GreenteaOS? :)), la résolution du mode graphique, activer l'installation du thème et quelques autres points
Étant donné que ReactOS est écrit en 2003, personne ne prend particulièrement en charge le code pour 6.0+. Ces endroits sont couverts par les conditions #if _WIN32_WINNT> = 0x600, ou même #if 0 et ils doivent être mis en service. Ajoutez la fonction manquante (bien que son code soit @ $ & ^%!) Pour exporter (SleepConditionVariableCS nécessite RtlSleepConditionVariableCS) ou déverrouiller des structures / champs quelque part dans les en-têtes du SDK. Une béquille encore plus étrange avec ntdll, kernel32 et advapi32 - pour une raison quelconque, des modules complémentaires ont été créés pour eux sous la forme de ntdll_vista, kernel32_vista et advapi32_vista, chacun ayant un maximum de 10 à 15 procédures, tandis que kernel32 a deux fichiers vista.c entiers. Le cygne, le cancer et le brochet, pas autrement, ont pris de telles décisions. Maintenant, il n'y a pas non plus de certitude - lors de la mise en place du PR sur le github, on demande de transférer le code vers une bibliothèque * _vista, le second écrit qu'il suffit de fermer l'exportation avec la condition -version = 0x600 + dans le fichier spec. Ce qui est le plus surprenant ici, c'est que toutes ces fonctions sont une nouvelle API et peuvent bien coexister pacifiquement avec le code principal, on ne sait pas pourquoi clôturer un tel jardin.
Ces tentatives ont continué pendant quelques mois, mais à la fin, tout s'est résolu au fait que l'installateur se bloquerait au milieu du processus, ni maudissant ni tombant.
Être, ne pas sembler
En été, j'ai décidé de retourner à la coquille. Pourtant, beaucoup de temps a été consacré et le résultat est nul. Cette fois, j'ai décidé de tout faire différemment - puisque lorsque vous changez la version signalée de 5.2 à 6.1, tout fonctionne au hasard, alors vous devez changer la version dans une direction complètement différente - essayez de construire ReactOS complètement en mode NT6.
Pour ce faire, dans la racine CMakeLists.txt, remplacez les conditions suivantes 0x502 par 0x600. Oui, il n'y a pas de temps pour les graisses, au moins 6,0 pour obtenir la sortie.
Les attentes de succès de cette entreprise étaient initialement moyennes, bien que l'idée dans son ensemble soit vraie.
L'essence du problème est que dans le noyau NT6 de nombreuses fonctions ont changé de signature, les structures de données diffèrent dans la composition et l'ordre des champs.
#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
Les erreurs de build pleuvaient comme une corne d'abondance, les plus simples étant celles des fichiers CMake de certaines DLL, WINVER et _WIN32_WINNT ont été explicitement réaffectés à d'autres valeurs, par exemple 0x602. Dans le même temps, ReactOS est plein de DLL, dans lesquelles WINVER est maintenant redéfini de 0x502 à 0x600. Il y avait de vrais bugs
# 356 # 359 # 747 # 814 # 815 .
Cela a duré le même mois ou deux et en conséquence, l'image s'est accumulée avec toutes les béquilles, mais l'installateur n'a montré aucun signe de vie. Tourmenté un peu plus de fusible a disparu
La logique n'est pas Iron
Un nouveau Noël arrive et .NET 4.5 est obsédant. Encore une fois, je reviens à la première option, toutes les modifications sont répétées, mais avec quelques modifications. Si avant, au lieu de fonctions manquantes (pour lesquelles il n'y a pas de code dans l'OS), je venais de faire des stubs, maintenant j'ai décidé de les chercher dans le code Wine et, voilà, ils étaient là. Transférez, adaptez pour ReactOS, au
# 1045 suivant . Quelque part, au lieu d'un talon, vous pouvez écrire du vrai code :)
# 1046 . Avec de telles modifications, le programme d'installation a travaillé plus vigoureusement et s'est même terminé avec succès, mais contrairement au programme d'installation, .NET 4.0 n'a pas proposé de redémarrer après l'installation - j'ai annulé que tous les mêmes logiciels pour la nouvelle génération d'OS et il n'est pas nécessaire de redémarrer à chaque fois ( ha ha, sainte naïveté). Lorsque j'ai essayé de démarrer l'application helloWorld, rien ne s'est produit à l'écran; dans le gestionnaire de tâches, je n'ai pas eu le temps de remarquer d'activité.
Une petite digression sur l'installateurau tout début du chemin, afin de ne pas attendre le démarrage du programme d'installation à chaque fois, je l'ai décompressé dans un dossier et j'ai cliqué sur setup.exe manuellement. Vous devez exécuter l'argument / x86 pour lequel vous avez créé un raccourci
Un peu plus tard, j'ai décidé de me plonger dans les ressources de l'installateur, où j'ai trouvé le texte des messages d'erreur et ICI SURPRISE - toutes les restrictions sont indiquées dans le fichier ParameterInfo.xml! Il suffisait de commenter la condition StopBlockers IsInOSCompatibilityMode et tout commence sans problème. Je supprime les modifications qui modifient la version du système d'exploitation de 5.2 à 6.0, j'active le mode de compatibilité Vista dans le raccourci vers la configuration (il ne s'attend donc pas à ce que Trusted Installer existe) et j'ajoute quelques fonctions supplémentaires que le programme d'installation a terminées avec autant de «succès». Cependant, si vous installez d'abord 4.0 puis exécutez le programme d'installation 4.5, le processus est déjà terminé avec une demande de redémarrage! Victoire!? Non. J'ai dit que c'est un conte sans fin heureuse. Lorsque vous essayez de démarrer HelloWorld, le résultat est légèrement différent, mais pas beaucoup - le processus prend 11 à 12 Mo de mémoire et se termine après 20 secondes. Le démarrage en mode de compatibilité n'aide pas (après tout, le CLR-runtime est lancé séparément dans chaque processus, et pas un environnement à l'échelle du système qui démarre avec le système d'exploitation avec OS version 5.2).
Dans le journal, nous voyons des appels pour déterminer la version:

Ajout d'un hack à RtlVerifyVersionInfo que si la version 6. * est demandée, remplacez la version du système d'exploitation par 6.0. Les lignes marquées par la flèche ont disparu, mais le résultat est le même.
Pas une fin heureuse.
Conclusion
Peut-être qu'il reste très peu de succès et que vous, inspiré par cette histoire, êtes prêt à attraper le drapeau et à terminer ce que vous avez commencé en téléchargeant le code ReactOS et en le compilant? Pas si vite. Dans presque tous les RP, les modifications apportées lors de leur présentation sont d'abord discutées, mais elles restent sans attention des principaux développeurs du système d'exploitation.
Afin de répéter ce qui est décrit, il est nécessaire de rouler PR sur la branche principale en utilisant les liens dans le texte, déverrouiller un tas de fonctions dans des fichiers de spécifications (remplacer la version dans la condition -version par 0x500 +) et plusieurs conditions 0x600 dans les en-têtes
Journal des modifications pour .NET 4.5En plus de PRov, vous devez corriger un petit winbase.h wincon.h et ouvrir les fonctions de la liste ci-dessous
advapi32- EventWrite (stub)
- EventRegister (stub)
- EventUnregister (stub)
- RegLoadMUIStringA
- RegLoadMUIStringW
msvcrtkernel32- AcquérirSRWLockExclusive
- AcquireSRWLockShared
- FermerThreadpool
- CloseThreadpoolCleanupGroup
- CloseThreadpoolCleanupGroupMembers
- FermerThreadpoolIo
- FermerThreadpoolTimer
- FermerThreadpoolWait
- FermerThreadpoolWork
- SetThreadpoolTimer
- SetThreadpoolWait
- CompareStringEx
- CreateSemaphoreExA (stub)
- CreateSemaphoreExW (stub)
- Createthreadpool
- CreateThreadpoolCleanupGroup
- CreateThreadpoolIo
- CreateThreadpoolTimer
- CreateThreadpoolWait
- CreateThreadpoolWork
- EnumCalendarInfoExEx
- EnumDateFormatsExEx
- EnumSystemLocalesEx
- EnumTimeFormatsExEx
- FlushProcessWriteBuffers (stub)
- GetCalendarInfoEx
- GetDateFormatEx
- GetLocaleInfoEx
- IsValidLocaleName (talon)
- GetNLSVersionEx (stub)
- GetNumberFormatEx
- GetTickCount64
- GetTimeFormatEx
- GetUserDefaultLocaleName
- LCMapStringEx
- InitOnceExecuteOnce
- InitializeCriticalSectionEx
- InitializeSRWLock
- ReleaseSRWLockExclusive
- ReleaseSRWLockShared
- WerSetFlags (stub)
Il n'y a pas de temps pour assembler, venez ici pour construire!
Si vous suivez le développement de ReactOS et essayez d'installer une nouvelle application, vous êtes probablement tombé sur le fait que certaines fonctions manquent ou qu'un RP intéressant / utile se bloque sans fin. Je suis également familier avec cela et j'ai donc décidé de compiler régulièrement l'assemblage du système d'exploitation avec les pièces manquantes et les PR (je veux garder le calendrier hebdomadaire ou toutes les deux semaines). Essayez cet assemblage, il sera peut-être utile! Écrivez si vous rencontrez une autre fonction manquante - il est fort probable qu'elle se trouve déjà dans le code ReactOS ou dans Wine. Il n'y a pas encore de pilote USB.
Téléchargez
iciBonne année et ReactOS stable!
PS
Mise à jour importante! Une application console simple construite sous 4.0 ou 4.5 répertoriant les dossiers / fichiers sur un disque fonctionne correctement. Donc, le cant est quelque part avec WinForms et WPF (suspendu comme l'exemple WinForms), et pas tous les CLR.
Lors de l'installation 4.5, j'ai remarqué des processus ngen.exe avec l'argument remove System.Windows.Forms ou System.Dynamic, etc. Il semble supprimer supprimé, mais n'a pas enregistré de nouveaux assemblages normalement
PPS
SUPER mise à jour importante! Le programme d'installation 4.5 dans le processus supprime certains assemblys du GAC, mais quelque part il se bloque et n'a pas le temps d'en copier de nouveaux (\ Microsoft.NET \ assembly \ GAC_MSIL). Par conséquent, sur 115 assemblys, il en reste 73. Si vous copiez les assemblys System, System.Drawing, System.Windows.Forms et Accessibility là-bas, une simple application WinForms démarre!
PPPS Il s'est avéré un grand moment - si vous copiez mscoree.dll à partir de 4.0 dans system32, le programme d'installation 4.5 ne fonctionne pas complètement, mais après le redémarrage de la console et le démarrage des applications Win-Form.