8

Es hat mich verblüfft, wie die "AnyCPU" -Funktion 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 (was Sie einfach mit Task-Manager bestätigen können). Das ist natürlich nicht unmöglich.Schreiben eines Cross-Platform (32-Bit und 64-Bit-kompatiblen) Programms für Windows (wie AnyCPU in .NET)

Die Frage ist, wie genau hat Microsoft das getan? 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 völlig am Verlust, wie die gleiche ausführbare Datei native 32-Bit und 64-Bit zur gleichen Zeit sein kann, vor allem seit eine Disassemblierung von mscoree.dll doesn zeige nicht einmal Referenzen auf undokumentierte native Funktionen.

Hat jemand irgendwelche Kenntnisse und/oder vernünftige Vermutungen, wie dies getan wurde? Es ist natürlich möglich (also keine Dinge sagen wie „es nicht möglich ist“), und es macht mich versuchen zu wollen, einen nativen plattformübergreifende EXE ...


bearbeiten zu schreiben:

Wie Eine Randnotiz, bedenken Sie, wie Sie 32-Bit-ausführbare Dateien in einer 64-Bit-Windows PE-Umgebung nicht ausführen können ... es gibt haben, um eine Möglichkeit zu sein, den PE-Lader mit einer Art "Plugin" zu erweitern oder zu modifizieren ?

+0

Es gibt einige Programme (z. B. Process Explores), die dies tun, um eine 32-Bit-ausführbare Datei zu verteilen, die * ein * 64-Bit-Image startet, wenn möglich. Z.B. ist eine "AnyCPU" ausführbare Datei jemals etwas anderes als eine 32-Bit-PE? –

+0

@pst: Ich bin mir vollkommen bewusst, aber nein, sie sind anders. Alle ausführbaren CPU-Dateien sind 64-Bit, sobald sie auf 64-Bit-Betriebssystemen gestartet werden - es gibt kein Entpacken und es gibt nichts wie "Lassen Sie uns diesen Bytecode-Code in 64-Bit JIT und dann den 64-Bit-Prozess neu starten." Das macht mich verblüfft. – Mehrdad

Antwort

5

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

Windows-ursprünglich wusste nicht, über das .NET Framework

Eigentlich seit Windows XP, Windows IS aware of the .NET executable format. Und XP war die erste Windows-Version, die 64-Bit unterstützte.

So ist der PE-Header 32-Bit markiert und die systemeigene Importtabelle verweist auf das 32 Bit mscoree, das 32-Bit-.NET unter Windows 2000 und früheren Versionen geladen wird. DllMain für mscoree beginnt JITt den Anwendungscode und ändert den Einstiegspunkt für die Hauptanwendung.

Windows XP und später, die Kenntnis der .NET-Metadaten, erkennt, dass es AnyCPU ist und lädt das entsprechende Framework.

Here's probably more than you ever wanted to know about the process.

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

+0

Ist das .NET-Framework nach der Veröffentlichung von XP (zumindest dachte ich, dass ich daran dachte) nicht erschienen? Ich dachte [XP wurde 2001 veröffentlicht] (http://en.wikipedia.org/wiki/Windows_xp) und [.NET in 2002] (http://en.wikipedia.org/wiki/.NET_Framework) .. – Mehrdad

+0

@Lambert: Die Entwicklungsperioden überschnitten sich, die .NET-Entwicklung begann etwa 5 Jahre vor der ersten Veröffentlichung im Jahr 2002, also hat Microsoft genügend Zeit, um die Haken in XP zu setzen. Und wie gesagt, Windows 2000 ist nur 32-Bit. Wie auch immer, es ist das Veröffentlichungsdatum der Windows XP 64-Bit-Edition, die Sie einige Jahre später in Betracht ziehen sollten, da es die erste Version ist, die diese "Magie" benötigt. –

+0

Ah ... das erklärt es. (Und ja, tut mir leid, dass ich den Windows 2000-Teil über meinen Kommentar entfernt habe, bevor Sie ihn gepostet haben, da ich mich daran erinnerte, dass er nicht 64-Bit hatte.) Nicht die Antwort, nach der ich gesucht habe, aber definitiv korrekt; Vielen Dank! :) – Mehrdad

4

Sie können tatsächlich x64-Code in einer x86 ausführbaren Datei haben, wenn das System hat eine WOW64-Emulationsschicht (Windows Vista +, weiß nicht über XP). http://vxheavens.com/lib/vrg02.html

Ich habe diese Technik getestet und es funktioniert auf Win7 sowie 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 auch ausführen lässt ... an diesem Punkt bezweifle ich WOW64 wird da sein :), WOW128 ftl.

+1

+1 OMG das ist SO super! : D danke für das Teilen! – Mehrdad