8

To zadziwiające, jak działa funkcja "AnyCPU" w .NET: ładuje plik wykonywalny jako macierzysty 32 -bit, jeśli system jest 32-bitowy, i 64-bitowy, jeśli system jest 64-bitowy (co można łatwo potwierdzić za pomocą Menedżera zadań). Oczywiście nie jest to niemożliwe.Pisanie wieloplatformowego (32-bitowego i 64-bitowego kompatybilnego) programu dla systemu Windows (jak AnyCPU w .NET)

Pytanie brzmi, jak dokładnie Microsoft to zrobił? Windows początkowo nie wiedział o strukturze .NET, więc moduł ładujący systemu Windows PE nie może szukać żadnych dodatkowych funkcji w nagłówkach PE dla nagłówka CLR; ta funkcja musiała zostać dodana przez jakieś rozszerzenie trybu jądra. Ale platforma .NET wydaje się nie instalować żadnej takiej rzeczy ... Jestem kompletnie zagubiony, gdy ten sam plik wykonywalny może być rodzimy 32-bitowy i 64-bitowy w tym samym czasie, zwłaszcza, że ​​demontaż pliku mscoree.dll nie Nawet pokazują odniesienia do nieudokumentowanych funkcji natywnych.

Czy ktoś ma wiedzę i/lub uzasadnione domysły, jak to zrobić? Jest to oczywiście możliwe (więc nie mówiąc takie rzeczy jak „nie jest możliwe”), a to sprawia, że ​​chcę spróbować napisać natywną wieloplatformowe EXE ...


EDIT:

Jak notatkę dodatkową, zastanów się, w jaki sposób nie możesz uruchamiać 32-bitowych plików wykonywalnych w 64-bitowym środowisku Windows PE ... jest otrzymałem, aby w jakiś sposób rozszerzyć lub zmodyfikować program ładujący PE za pomocą jakiegoś "wtyczki", prawda ?

+0

Istnieje kilka programów (np. Process Explores), które wykonują to moje rozpowszechnianie 32-bitowego pliku wykonywalnego, który * uruchamia * obraz 64-bitowy, jeśli to możliwe. Na przykład. jest plikiem wykonywalnym "AnyCPU" w ogóle poza 32-bitowym PE? –

+0

@pst: Jestem całkowicie tego świadomy, ale nie, oni są inni. Pliki wykonywalne AnyCPU są 64-bitowe od momentu uruchomienia w 64-bitowym systemie operacyjnym - nie ma rozpakowywania i nie ma to jak "Niech JIT ten kod kodu bajtowego na 64-bitowy, a następnie ponownie uruchom proces 64-bitowy." To sprawia, że ​​jestem zaskoczony. – Mehrdad

Odpowiedz

5

Twoje pytanie jest oparte na nieporozumieniu. Tutaj jest błąd:

Okna początkowo nie wiedzieli o .NET

Faktycznie, od Windows XP, Windows IS aware of the .NET executable format. XP był pierwszą wersją systemu Windows obsługującą 64-bitowe.

Zatem nagłówek PE jest oznaczony jako 32-bitowy, a natywna tabela importu odwołuje się do 32-bitowego mscoree, który w systemie Windows 2000 i wcześniejszych wersjach powoduje załadowanie 32-bitowego .NET. DllMain dla mscoree rozpoczyna JITting kodu aplikacji i modyfikuje punkt początkowy dla głównej aplikacji.

System Windows XP i późniejsze, znając metadane .NET, rozpoznaje, że jest to AnyCPU i ładuje odpowiednią strukturę.

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

Więc nie, nie ma natywnej wersji AnyCPU. Chociaż możesz osadzić 16-bitowy program DOS w 32-bitowym PE, nie możesz mieć połączonego 32-bitowego i 64-bitowego .exe

+0

Czy framework .NET nie pojawił się * po * wydaniu XP (przynajmniej tak uważałem, że zapamiętałem)? Myślałem, że [XP został wydany w 2001 r.] (Http://en.wikipedia.org/wiki/Windows_xp) i [.NET w 2002 r.] (Http://en.wikipedia.org/wiki/.NET_Framework) .. – Mehrdad

+0

@ Lambert: Okresy programowania nakładały się, rozwój platformy .NET rozpoczął się około 5 lat przed pierwszym wydaniem w 2002 r., Więc Microsoft ma mnóstwo czasu, aby umieścić haki w XP. I tak jak powiedziałem, Windows 2000 ma tylko 32-bit. W każdym razie, jest to data wydania 64-bitowej edycji Windows XP, kilka lat później, którą należy wziąć pod uwagę, ponieważ jest to pierwsza wersja, która potrzebowała tej "magii". –

+0

Ah ... to wyjaśnia. (I tak, przepraszam, że usunąłem część Windows 2000 o moim komentarzu tuż przed wysłaniem, ponieważ pamiętałem, że nie ma 64-bitowego.) Nie szukałem odpowiedzi, ale zdecydowanie wydaje mi się poprawne; dzięki! :) – Mehrdad

4

Rzeczywiście możesz mieć kod x64 w pliku wykonywalnym x86, jeśli system ma warstwę emulacji WOW64 (Windows Vista +, nie wiem nic o XP). http://vxheavens.com/lib/vrg02.html

Przetestowałem tę technikę i działa na Win7 i WinVista. Napisałem mały stub w zespole, aby rozwiązać problem importowania i załadowałem kod C, który został skompilowany dla AMD64.

Microsoft mówi tylko, że nie można przechodzić w tę iz powrotem, ponieważ mogą to zmienić, ale wątpię, aby to się zmieniło, dopóki nie zmieni się podstawowa architektura, aby umożliwić uruchamianie czegoś takiego jak 128 bitów ... w tym momencie wątpię WOW64 będzie w pobliżu :), WOW128 ftl.

+1

+1 OMG to TAK niesamowite! : D dzięki za udostępnienie! – Mehrdad

Powiązane problemy