Process-Image abspeichern
-
Hey,
kennt jemand ein Programm (für Windows), mit dem man einen laufenden Process unterbechen kann, ihn dann komplett abspeichern kann, und zu einem anderen Zeitpunkt einfach wieder laden kann und fortsetzten kann?Und wenn nicht, wie könnte man sowas programmieren?
Ich habs bisher geschaft, dass ich mittels WinAPI alle Thread eines Processes pausieren kann (SuspendThread) und fortsetzten (ResumeThread) und den CONTEXT abspeichern kann (GetThreadContext), was ja, so wie ich das gelesen hab, die cpu-register sein sollen...
Nur fehlt mir halt der komplette Rest. Und in der WinAPI kenn ich mich sowieso nicht sonderlich gut aus, da ich normalerweise mit Linux arbeite...Hoffe ihr könnt mir helfen...
Gruß,
Olli
-
Ich denke mal da mußt Du 'nen Driver schreiben, da Du auf den Speicher des Prozesses zugreifen willst.
-
Ich würde sagen, man kann ruhigen Gewissens behaupten, dass das eine nicht zu lösende Aufgabe ist.
Den Usermode-Speicher des Prozesses auszulesen ist kein Problem. Auf den Kernel-Mode-Speicher kann man mit einem Treiber zugreifen, das wäre also auch kein Problem. Allerdings sind weder die genauen Mechanismen bei der Erstellung eines Prozesses noch die Datenstrukturen dokumentiert und wenn dann auch nur teilweise.
Der Speicher des Prozesses und die Register der einzelnen Threads sind aber auch nicht die einzigen Dinge, die den Kontext eines Prozesses ausmachen. Das System hat diverse Objekte mit diesem Prozess verknüpft wie Events, Mutexes, geöffnete Dateien oder IO-Operationen, die sich gerade in Bearbeitung befinden. Zum Einen ist das Aussehen dieser Strukturen im Speicher nicht bekannt und zum Anderen gibt es etliche andere Probleme, die durch das komplette "hibernaten" und später wiederherstellen entstehen können.(Blockieren anderer Prozesse, die per IPC mit diesem Prozess kommuniziert haben; unerwartete zwischenzeitliche Veränderung von Dateien oder allein die Tatsache, dass GetTickCount von einem Aufruf zum anderen um ein paar Stunden weiterspringt und das Programm damit nicht klarkommt.)Wenn es dir aber zum Beispiel nur darum geht, dein Programm kurzfristig einzufrieren um CPU-Zeit und Speicher zu sparen, weil du von beidem nicht genug hast, könntest du es vielleicht hinbekommen, einen eigenen Speicher-Auslagerungsmechanismus für den virtuellen Speicher des Prozesses zu programmieren. Du hältst alle Threads an, sicherst den virtuellen Speicher auf der Festplatte und deallokierst ihn. Wenn du das Programm weiterlaufen lassen willst, allokierst du den Speicher wieder an der gleichen Adresse und lädst den Inhalt von Festplatte und lässt den Thread weiterlaufen. Wenn du Glück hast bemerkt dein Prozess davon nichts.