Hancock: Alles Fälle, in denen die Lösung nicht praktikabel ist, oder gar nicht funktionieren wird.
Das ändert aber nichts daran, dass eine Datei um ausgeführt zu werden nicht grundsätzlich auch auf einem Speichermedium liegen
muss
Klar kann man den NT-Loader nachprogrammieren, aber damit bist du auf dem WINE-Trip und kannst gleich eine VM aufsetzen.
Das verstehe ich nicht. WINE führt PE-Binaries doch auch nativ aus und nicht in einer VM. Und wieso denn überhaupt eine VM aufsetzen, wenn man nur ein Programm starten will?
BTW: NULL-Check vergessen in Z. 248 ff. (2x)
Memory Leak (1x) Z. 254
Und weitere, weil du nur deutlich weniger aufräumst.
Und Z. 157: IsBadMemoryPtr? sind wir hier in Java?
Der Loader an sich ist tatsächlich der einzige Teil des Programms, der nicht ursprünglich von mir selbst ist. Siehe auch: Kommentar am Anfang der Datei. Ich bedanke mich für die Hinweise und werde die entsprechenden Korrekturen vornehmen.
€: Die von dir genannten Fehler habe ich korrigiert. Ich bezweifle, dass das alle waren, aber der Code ist wie gesagt nicht von mir und ich möchte ihn nicht aufgrund mangelnden Verständnisses kaputt machen, deswegen werde ich keine weiteren Änderungen aus eigenem Antrieb vornehmen.
Ein offensichtliches Problem ist, dass der Code, der am Ende von
load() angesprungen wird, nicht die
main() des angehängten Programms ist, sondern eine Funktion, die später
main() aufruft und danach das Programm beendet. Alles, was in
loader.c und
main.c nach der Zeile
entryretval = (*Entry)(argc, argv); folgt, wird deshalb nicht mehr abgearbeitet und der allokierte Speicher für das decodierte Programm (
uchar *data) und dessen Image, in das es geladen wurde (
PMEMORYMODULE result), werden nicht mehr freigegeben. Um dieses Problem zu beheben, müsste ich noch deutliche Änderungen vornehmen, die aber über mein eigentliches Ziel hinaus gehen. Und mein Interesse, ein über ein Jahr altes Projekt, das seinen Zweck erfüllt hat, noch einmal halb zum Leben zu erwecken, hält sich in Grenzen. Besonders, wenn der Aufwand in keinem Verhältnis zum Nutzen steht. Die zwei Speicherbereiche werden sowieso mit Beenden des Prozesses automatisch freigegeben und mehr würde ich nach der Rückkehr aus
main() eh nicht machen.