Schreiben eines plattformübergreifenden (32-Bit und 64-Bit kompatiblen) Programms für Windows (wie AnyCPU in .NET)

8

Es hat mich verblüfft, wie das "AnyCPU" -Feature in .NET funktioniert: Es lädt die ausführbare Datei als native 32-Bit, wenn das System 32-Bit ist, und als 64-Bit, wenn das System 64-Bit ist kann leicht mit Task-Manager bestätigt werden). Das ist natürlich nicht unmöglich.

Die Frage ist, wie genau hat Microsoft das gemacht? Windows wusste ursprünglich nichts über das .NET-Framework, daher kann der Windows PE-Loader möglicherweise keine zusätzlichen Features in PE-Headern für den CLR-Header suchen. Diese Funktion muss durch eine Art Kernel-Modus-Erweiterung hinzugefügt worden sein. Aber das .NET-Framework scheint keine solche Sache zu installieren ... Ich bin bei einem vollständigen Verlust daran, wie die gleiche ausführbare Datei native 32-Bit und 64-Bit gleichzeitig sein kann, besonders seit eine Disassemblierung von mscoree.dll doesn zeige nicht einmal Referenzen auf undokumentierte native Funktionen.

Hat jemand irgendwelche Kenntnisse und / oder vernünftige Vermutungen darüber, wie das gemacht wurde? Es ist offensichtlich möglich (also keine Dinge wie "es ist nicht möglich" zu sagen), und es lässt mich versuchen, eine native plattformübergreifende EXE zu schreiben ...

Bearbeiten:

Als Nebenbemerkung sollten Sie in Betracht ziehen, wie Sie ausführbare 32-Bit-Dateien in einer 64-Bit-Windows PE-Umgebung nicht ausführen können. Es gibt get , um den PE-Loader zu erweitern oder zu modifizieren mit einer Art "Plugin", oder?

    
Mehrdad 10.01.2011, 03:28
quelle

2 Antworten

5

Ihre Frage basiert auf einem Missverständnis. Hier ist der Fehler:

  

Windows wusste ursprünglich nichts über das .NET-Framework

Tatsächlich, seit Windows XP, Windows erkennt das ausführbare .NET-Format . Und XP war die erste Version von Windows 64-Bit zu unterstützen.

Der PE-Header ist also mit 32-Bit markiert, und die native Importtabelle verweist auf das 32-Bit mscoree , was unter Windows 2000 und früher dazu führt, dass 32-Bit-.NET geladen wird. DllMain für mscoree startet den Anwendungscode und ändert den Einstiegspunkt für die Hauptanwendung.

Windows XP und höher erkennen die .NET-Metadaten und erkennen, dass es AnyCPU ist, und lädt das entsprechende Framework.

Hier ist wahrscheinlich mehr, als Sie jemals über den Prozess wissen wollten .

Also nein, es gibt kein natives AnyCPU exe. Obwohl Sie ein 16-Bit-DOS-Programm in einem 32-Bit-PE einbetten können, können Sie eine kombinierte 32-Bit- und 64-Bit-EXE

nicht haben     
Ben Voigt 10.01.2011, 04:10
quelle
4

Sie können tatsächlich x64-Code in einer ausführbaren x86-Datei haben, wenn das System über eine WOW64-Emulationsschicht verfügt (Windows Vista +, nicht über XP). Ссылка

Ich habe diese Technik getestet und sie funktioniert sowohl auf Win7 als auch auf WinVista. Ich habe einen kleinen Stub in Assembly geschrieben, um Importe aufzulösen und C-Code zu laden, der für AMD64 kompiliert wurde.

Microsoft sagt nur, dass Sie nicht hin und her wechseln können, weil sie es ändern könnten, aber ich bezweifle, dass sich das ändern wird, bis die zugrundeliegende Architektur so etwas wie 128 Bit zulässt ... zu diesem Zeitpunkt bezweifle ich WOW64 wird um :) sein, WOW128 ftl.

    
sm4rtk1d5wh0sm0k3w33d 04.03.2011 19:45
quelle