Windows: Zusammenspiel von Compiler+Linker und den Betriebssytem

pietMunzel

Cadet 4th Year
Registriert
März 2012
Beiträge
79
Hallo CB,

ich wollte mich an die WinApi machen, habe aber beschlossen, zuerst sauber zu verstehen, was eigentlich im Hintergrund von Windows geschieht, bevor ich eine Anwendung programmiere.

Meine Frage ist, ob das folgende richtig ist:

Wenn ich mit der IDE Visual C++ programmiere, dann enthält diese IDE sowohl den Compiler als auch den Linker. Die IDE selbst ist eine WinApi-Anwendung, also auch der Compiler und der Linker.

Wenn ich nun in der IDE execute, so wird der Code von der IDE IM USERMODE übersetzt und gelinkt, und die IDE meldet für mein Programm einen Prozess an (User-Mode geht mindestens hier kurzzeitig über in Kernal-Mode). Der Code, der im User-Mode erzeugt wurde, wird in den zugewiesenen Prozess-Speicher geladen, der Einstiegspunkt übergeben und ausgeführt.

Würde ich nicht in einer IDE executen sondern eine .exe laden, so wurde ein Loader IM USERMODUS die Datei analysieren (hier braucht er aber nicht zu kompilieren, nur zu linken), wiederum über einen System Call einen Prozess anmelden und ab hier wie oben mit der IDE.

Vor allem ob Compiler und Linker selbst Win-Api Anwendungen sind und Compiler und Linker im User-Mode ihre Arbeiten verrichten, will ich wissen.

Gruß
pietMunzel

Edit: Habe soeben gesehen, dass in der Überschrift ein ekelhafter Grammatikfehler ist. Ich bitte um Entschuldigung.
 
Zuletzt bearbeitet:
Hmm, ich sehe im Moment keine Grund, weshalb Compiler oder Linker zum Erstellen ihres Outputs in den Kernelmode wechseln sollten. Und alles, was unter Windows mit Oberflächen zu tun hat, ist irgendwo eine Win-API-Anwendung. Ob sie nun direkt auf die Win-API aufsetzt oder via einen drübergelegten Wrapper (MFC oder Qt z.B.), das ist ein anderer Punkt.
 
Nicht zum Erstellen des Outputs. Der Code wird im UserModus erzeugt, aber um den Code zur Ausführung zu bringen, muss es mindestens einen System Call zur Prozesserzeugung geben, der im Kernal-Modus verarbeitet wird.
 
Um ein Programm auszuführen, muss man nicht in den Kernelmode wechseln. Wenn du wissen willst, wie man es genau macht, siehe dieses Projekt von mir:

https://github.com/SirDzstic/cryptpe/blob/master/cryptpe/loader.c

€: Und Compiler, Linker, wasauchimmer starten den Prozess nicht. Das macht der Loader (der Teil des Win32-Subsystems ist, oder wie in obigem Projekt
auch selbst gebaut werden kann).

€2: Und das Win32 Subsystem läuft im Userspace, falls das nicht klar war :E
 
Zuletzt bearbeitet:
Also VS ruft nur cl.exe auf, das kannst du, wenn du willst, auch aus der Konsole machen...

Ich weiß nicht, was du wissen willst. Der Compiler/Linker/etc. stückelt dir eine Exe zusammen. Die kannst du dann ausführen. Die IDE bündelt halt den gewöhnlichen Entwicklungszyklus unter eine Haube.

Um die exe auszuführen, wird zuerst kernel32.dll und ntdll.dll geladen. Diese laden dann die exe in den Arbeitsspeicher und initialisieren den kompletten Prozess. Dann wird in der exe die unter EntryPoint angegebene Adresse angesprungen. Das ist dabei immer gleich, ob du über die Die oder Explorer oder über sonst irgendein Programm deine exe ausführst, das ist immer so.

Compiler und Linker sind Konsolenprogramme, nutzen aber, wie jedes andere Programm auch, unter Windows natürlich die Win-API und laufen im User-Mode.
 
Zurück
Oben