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 ?
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? –
@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