Es könnte eine Weihnachtsgeschichte mit Happy End sein, aber so ist es nicht.
Am Heiligabend 2018 bemerkte ich ein .NET 4.0-Installationsprogramm in der Liste der getesteten Anwendungen für ReactOS und war angenehm überrascht, dass es erfolgreich installiert und die Anwendungen gestartet wurden. Aber da 4.0 schon lange nicht mehr relevant war, wurde ich von einer verrückten Idee besucht - was passiert, wenn ich versuche, Version 4.5 zu installieren?
Das Installationsprogramm gab sofort an, dass die Betriebssystemversion nicht geeignet ist. Der Start im Kompatibilitätsmodus wurde ebenfalls von ihm festgelegt und die Installation verweigert. Dinge, alles endete bevor es anfing ...

Ja, jetzt ändere ich die Version und es wird funktionieren!
ReactOS wird als Analogon zu Windows 2003 entwickelt und meldet die Version als 5.2. Die Installation erfordert mindestens 6.0, aber dann entschied ich, dass es besser ist, sofort auf Windows 7 zu zielen, und begann zu suchen, wie die Version auf 6.1 geändert werden kann. Im Code gab es laut Version / MajorVersion / MinorVersion mehrere Stellen im gesamten System, auch wenn Sie dies nicht erwarten. Beim Ersetzen aller Paare von 5.2 bis 6.1 war das Ergebnis Null - selbst das Betriebssystem-Installationsprogramm wurde nicht gestartet. Weitere Suche nach freeldr und ntldr beim Booten - an 4 Stellen musste _WIN32_WINNT_WS03 durch _WIN32_WINNT_WIN7 ersetzt werden. Das Betriebssystem ist installiert und teilt uns mit, dass dies 6.1 ist. In Ordnung ?! Nein. Aus irgendeinem Grund wird mit einem solchen Ersatz nichts wirklich installiert - weder VirtualBox Guest Additions noch Firefox oder .NET 4.0 und sogar Explorer fallen einmal durch. Okay, Sie müssen eine ISO mit allem, was Sie brauchen, erstellen und mit der virtuellen Maschine verbinden. Ehre sei den Bytes, das Laufwerk funktioniert noch und das Installationsprogramm startet erneut. Hurra! Es startet sogar, beschwert sich aber über das Fehlen einiger Betriebssystemkomponenten:

Der erste ist ein automatischer Aktualisierungsdienst, der zweite ist ein vertrauenswürdiger Installer. Wir haben so etwas nicht - wirklich, warum es in ReactOS Windows-Updates gibt und das vertrauenswürdige Installationsprogramm nicht per Definition sein kann, da es zusammen mit Windows 7 angezeigt wurde. Es gab auch eine Zeile im Protokoll, in der einige wusa.exe fehlten. Ok, erstellen Sie die Stubs für wusa.exe und wuauserv.dll für den
PR 355- Aktualisierungsdienst. Trusted Installer hat gerade 32 Bit von Windows 7 zusammen mit den Registrierungsschlüsseln kopiert. Jetzt bestimmt der Installateur die Verfügbarkeit von allem Notwendigen und es bleibt nur noch, den Vertrag mit einem Tropfen Blut zu schließen.
Der Dateiverifizierungsprozess ist erfolgreich und die Installation beginnt. Sofort erhalten wir eine Meldung, dass die LCMapStringEx-Funktion im Kernel32-Modul fehlt.

Ok, ich suche nach einer Funktion im Code und Sie werden überrascht sein, dass sie existiert, aber aus irgendeinem Grund nicht zur Exportliste hinzugefügt wird (Spezifikationsdateien neben CMakeLists.txt im Stammverzeichnis jeder DLL). Erstellen / Installieren / Ausführen und erneut ein ähnlicher Fehler. Nun, das Skript ist bekannt. Nachdem dieser Vorgang 5-10 Mal wiederholt wurde, nachdem er vom Installationsprogramm angeklickt wurde, wird vom Installationsprogramm gegoogelt, dass das Betriebssystem über einen unbeaufsichtigten Installationsmodus verfügt. Aktivieren Sie dazu UnattendSetupEnabled = yes in der Datei boot \ bootdata \ bootcd \ unattend.inf. Super Schlittenfahrt! Sie gehen so schnell, dass Sie keine Zeit haben, Tee zu trinken - für zwei Minuten die gesamte Installation.
Einstellungen in unattend.infDort können Sie den Installationsordner von ReactOS auf Windows oder Bolgenos (oder vielleicht GreenteaOS? :)), die Auflösung des Grafikmodus, die Installation des Themas und einige weitere Punkte ändern
Da ReactOS als 2003 geschrieben wurde, unterstützt niemand den Code für 6.0+ besonders. Solche Orte werden durch die Bedingungen #if _WIN32_WINNT> = 0x600 oder sogar #if 0 abgedeckt und müssen in Betrieb genommen werden. Fügen Sie die fehlende Funktion hinzu (obwohl der Code @ $ & ^% ist!). Zum Exportieren (SleepConditionVariableCS erfordert RtlSleepConditionVariableCS) oder entsperren Sie Strukturen / Felder irgendwo in den SDK-Headern. Eine noch seltsamere Krücke mit ntdll, kernel32 und advapi32 - aus irgendeinem Grund wurden Add-Ons für sie in Form von ntdll_vista, kernel32_vista und advapi32_vista erstellt, von denen jede maximal 10-15 Prozeduren enthält, während kernel32 zwei vollständige vista.c-Dateien enthält. Schwan, Krebs und Hecht, nicht anders, trafen solche Entscheidungen. Jetzt gibt es auch keine Gewissheit - wenn man einen PR auf einem Github auslegt, bittet man darum, den Code in eine * _vista lib zu übertragen, der zweite schreibt, dass es ausreicht, den Export mit der Bedingung -version = 0x600 + in der Spezifikationsdatei zu schließen. Was hier am meisten überrascht, ist, dass alle diese Funktionen eine neue API sind und durchaus friedlich mit dem Hauptcode koexistieren können. Es ist unklar, warum ein solcher Garten eingezäunt werden soll.
Diese Versuche dauerten ein paar Monate, aber am Ende beruhte alles darauf, dass der Installateur mitten im Prozess hängen blieb und weder fluchte noch fiel.
Sein, nicht scheinen
Im Sommer beschloss ich, zur Muschel zurückzukehren. Trotzdem wurde so viel Zeit aufgewendet und das Ergebnis ist Null. Dieses Mal habe ich beschlossen, alles anders zu machen - da beim Ändern der gemeldeten Version von 5.2 auf 6.1 alles zufällig funktioniert, müssen Sie die Version aus einer völlig anderen Richtung ändern - versuchen Sie, ReactOS vollständig im NT6-Modus zu erstellen.
Ersetzen Sie dazu im Stammverzeichnis CMakeLists.txt die folgenden Bedingungen 0x502 durch 0x600. Ja, es ist keine Zeit für Fett, mindestens 6,0, um die Ausgabe zu erhalten.
Die Erfolgserwartungen dieses Unternehmens waren anfangs mittelmäßig, obwohl die Idee insgesamt wahr war.
Das Wesentliche des Problems ist, dass im NT6-Kernel viele Funktionen die Signaturen geändert haben und sich die Datenstrukturen in der Zusammensetzung und Reihenfolge der Felder unterscheiden.
#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
Build-Fehler regneten wie Füllhorn, von denen die einfachsten waren, dass in den CMake-Dateien einiger DLLs WINVER und _WIN32_WINNT explizit anderen Werten zugewiesen wurden, z. B. 0x602. Gleichzeitig ist ReactOS voll von DLLs, in denen WINVER jetzt von 0x502 auf 0x600 neu definiert wird. Es gab einige echte Fehler
# 356 # 359 # 747 # 814 # 815 .
Es dauerte ein oder zwei Monate und infolgedessen sammelte sich das Bild mit allen Krücken, aber der Installateur zeigte überhaupt keine Lebenszeichen. Gequält etwas mehr Sicherung ist weg
Logik ist kein Eisen
Ein neues Weihnachtsfest steht vor der Tür und .NET 4.5 verfolgt. Ich kehre wieder zur ersten Option zurück. Alle Änderungen werden wiederholt, jedoch mit einigen Änderungen. Wenn ich vorher statt fehlender Funktionen (für die es keinen Code im Betriebssystem gibt) nur Stubs gemacht habe, habe ich mich jetzt entschlossen, sie im Wine-Code zu suchen, und siehe da, sie waren da. Übertragen, für ReactOS anpassen, auf die nächste
# 1045 . Irgendwo kann man anstelle eines Stubs echten Code schreiben :)
# 1046 . Das Installationsprogramm arbeitete intensiver mit solchen Änderungen und endete sogar „erfolgreich“. Im Gegensatz zum Installationsprogramm bot .NET 4.0 jedoch keinen Neustart nach der Installation an. Ich habe die gleiche Software für die neue Generation des Betriebssystems abgeschrieben und muss nicht jedes Mal neu gestartet werden ( ha ha, heilige Naivität). Als ich versuchte, die helloWorld-Anwendung zu starten, passierte nichts auf dem Bildschirm. Auch im Task-Manager hatte ich keine Zeit, Aktivitäten zu bemerken.
Ein kleiner Exkurs zum InstallerGanz am Anfang des Pfads habe ich es in einen Ordner entpackt und manuell auf setup.exe geklickt, um nicht jedes Mal auf den Start des Installationsprogramms zu warten. Sie müssen mit dem Argument / x86 ausgeführt werden, für das eine Verknüpfung erstellt wurde
Wenig später beschloss ich, mich mit den Ressourcen des Installationsprogramms zu befassen, wo ich den Text der Fehlermeldungen und HIER ÜBERRASCHUNG fand - alle Einschränkungen sind in der Datei ParameterInfo.xml angegeben! Es hat gereicht, die StopBlockers-Bedingung IsInOSCompatibilityMode zu kommentieren, und alles beginnt ohne Probleme. Ich entferne die Änderungen, die die Betriebssystemversion von 5.2 auf 6.0 ändern, aktiviere den Vista-Kompatibilitätsmodus in der Verknüpfung zum Setup (es wird also nicht erwartet, dass ein vertrauenswürdiges Installationsprogramm vorhanden ist) und füge einige weitere Funktionen hinzu, die das Installationsprogramm genauso erfolgreich beendet hat. Wenn Sie jedoch zuerst 4.0 installieren und dann das Installationsprogramm 4.5 ausführen, ist der Vorgang bereits mit der Aufforderung zum Neustart abgeschlossen! Sieg !? Nein. Ich sagte, dass dies eine Geschichte ohne Happy End ist. Wenn Sie versuchen, HelloWorld zu starten, ist das Ergebnis etwas anders, aber nicht viel - der Vorgang benötigt 11-12 MB Speicher und endet nach 20 Sekunden. Das Starten im Kompatibilitätsmodus hilft nicht (schließlich wird die CLR-Laufzeit in jedem Prozess separat gestartet und nicht in einer systemweiten Umgebung, die mit dem Betriebssystem mit OS Version 5.2 beginnt).
Im Protokoll werden Aufrufe zur Ermittlung der Version angezeigt:

RtlVerifyVersionInfo wurde ein Hack hinzugefügt. Wenn Version 6. * angefordert wird, ersetzen Sie die Betriebssystemversion durch 6.0. Die mit dem Pfeil markierten Linien sind verschwunden, aber das Ergebnis ist das gleiche.
Kein Happy End.
Fazit
Vielleicht gibt es nur noch sehr wenig Erfolg und Sie sind, inspiriert von dieser Geschichte, bereit, die Flagge zu fangen und das zu beenden, was Sie begonnen haben, indem Sie den ReactOS-Code heruntergeladen und kompiliert haben? Nicht so schnell. In fast allen PRs werden die Änderungen, die beim Layout vorgenommen wurden, zuerst besprochen, aber dann hängen sie ohne Aufmerksamkeit der Hauptentwickler des Betriebssystems.
Um das Beschriebene zu wiederholen, müssen Sie PR auf dem Hauptzweig mithilfe der Links im Text rollen, eine Reihe von Funktionen in Spezifikationsdateien entsperren (die Version in der -version-Bedingung durch 0x500 + ersetzen) und mehrere 0x600-Bedingungen in den Headern
Änderungsprotokoll für .NET 4.5Zusätzlich zu PRov müssen Sie eine kleine winbase.h wincon.h reparieren und die Funktionen aus der folgenden Liste öffnen
advapi32- EventWrite (Stub)
- EventRegister (Stub)
- EventUnregister (Stub)
- RegLoadMUIStringA
- RegLoadMUIStringW
msvcrtkernel32- AcquireSRWLockExclusive
- AcquireSRWLockShared
- CloseThreadpool
- CloseThreadpoolCleanupGroup
- CloseThreadpoolCleanupGroupMembers
- CloseThreadpoolIo
- CloseThreadpoolTimer
- CloseThreadpoolWait
- CloseThreadpoolWork
- SetThreadpoolTimer
- SetThreadpoolWait
- CompareStringEx
- CreateSemaphoreExA (Stub)
- CreateSemaphoreExW (Stub)
- Createthreadpool
- CreateThreadpoolCleanupGroup
- CreateThreadpoolIo
- CreateThreadpoolTimer
- CreateThreadpoolWait
- CreateThreadpoolWork
- EnumCalendarInfoExEx
- EnumDateFormatsExEx
- EnumSystemLocalesEx
- EnumTimeFormatsExEx
- FlushProcessWriteBuffers (Stub)
- GetCalendarInfoEx
- GetDateFormatEx
- GetLocaleInfoEx
- IsValidLocaleName (Stub)
- GetNLSVersionEx (Stub)
- GetNumberFormatEx
- GetTickCount64
- GetTimeFormatEx
- GetUserDefaultLocaleName
- LCMapStringEx
- InitOnceExecuteOnce
- InitializeCriticalSectionEx
- InitializeSRWLock
- ReleaseSRWLockExclusive
- ReleaseSRWLockShared
- WerSetFlags (Stub)
Es ist keine Zeit zusammenzubauen, kommen Sie hierher, um zu bauen!
Wenn Sie die Entwicklung von ReactOS verfolgen und versuchen, eine neue Anwendung zu installieren, sind Sie wahrscheinlich auf die Tatsache gestoßen, dass einige Funktionen fehlen oder eine interessante / nützliche PR endlos hängt. Ich bin auch damit vertraut und habe mich daher entschlossen, die Betriebssystembaugruppe regelmäßig mit den fehlenden Teilen und PRs zu kompilieren (ich möchte den Zeitplan wöchentlich oder alle zwei Wochen einhalten). Probieren Sie diese Baugruppe aus, vielleicht ist sie nützlich! Schreiben Sie, wenn Sie auf eine andere fehlende Funktion stoßen - es ist sehr wahrscheinlich, dass sie bereits im ReactOS-Code oder in Wine enthalten ist. Es ist noch kein USB-Treiber vorhanden.
Hier herunterladen
Frohes Neues Jahr und stabiles ReactOS!
PS
Wichtiges Update! Eine einfache Konsolenanwendung, die unter 4.0 oder 4.5 erstellt wurde und Ordner / Dateien auf einer Festplatte auflistet, funktioniert einwandfrei. Die Überhöhung liegt also irgendwo bei WinForms und WPF (hängt wie im Beispiel von WinForms) und nicht bei allen CLRs.
Während der Installation 4.5 sind mir ngen.exe-Prozesse mit dem Argument remove System.Windows.Forms oder System.Dynamic usw. aufgefallen. Es scheint gelöschte zu löschen, hat aber normalerweise keine neuen Assemblys registriert
PPS
SUPER wichtiges Update! Das Installationsprogramm 4.5 entfernt dabei einige Assemblys aus dem GAC, stürzt jedoch irgendwo ab und hat keine Zeit, neue zu kopieren (\ Microsoft.NET \ Assembly \ GAC_MSIL). Infolgedessen bleiben von 115 Assemblys 73 übrig. Wenn Sie die Assemblys System, System.Drawing, System.Windows.Forms und Accessibility dort kopieren, wird eine einfache WinForms-Anwendung gestartet!
PPPS Es stellte sich als großartiger Moment heraus - wenn Sie mscoree.dll von 4.0 in system32 kopieren, funktioniert das Installationsprogramm 4.5 nicht vollständig, aber nach dem Neustart der Konsole und dem Start von Win-Form-Anwendungen.