Prozessabbild speichern und wiederherstellen

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Prozessabbild speichern und wiederherstellen

Beitrag von GronkhLP »

Hallo Freunde aus der lieben PureBasic-Community :) ,

ich möchte sehr gerne den aktuellen Arbeitsspeicherstand meines eigenen Prozesses speichern und diesen jederzeit wiederherstellen. Mein Vorhaben ist, wenn nach Speicherung meines Prozessabbildes grundsätzliche Änderungen vorgenommen wurden, dass man mit Hilfe des von mir gespeicherten Prozess-Image zurücksetzen kann, damit der Prozess auf dem selben Stand war wie vor der Speicherung meiner Prozessseicherdatei.

Beispiel:
1. Prozessabbild anlegen
2. Variablen des Programms im Speicher werden verändert, GUI umkonfiguriert und vieles mehr
3. Prozessabbild wiederherstellen auf den Stand vor dem Anlegen meiner Prozessabbilddatei.

Ziel ist es, die Application ohne einzelne aufbereitete, zwischengespeicherte Rückgängigkeitsschritte auf einen vorherigen Prozessstand zu versetzen.

Ich nehme an, dass dies nur mit nativen PureBasic-Funktionen nicht möglich ist und dass man wahrscheinlich auf die Win32-Umgebung zugreifen müsste, um das zu realisieren. Ich hoffe, dass es grundsätzlich möglich ist. Wenn ja, wie soll ich vorgehen und welche Funktionen aus Win32 muss ich verwenden? Gibt es zufälligerweise bereits vorhandene von einem User geschriebene Beispiele?

Falls was unklar sein sollte und wenn meine Beschreibung nicht ganz verständlich ist, dann einfach nachfragen. :)
Bild
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Prozessabbild speichern und wiederherstellen

Beitrag von SBond »

....das würde mich jetzt auch interessieren. Ist so etwas überhaupt möglich? Ich denke da ggf. an dynamische Objekte, die nicht nur eine statische Größe im Arbeitsspeicher belegen (LinkedList & Co.).

Hast du schon einen konkreten Anwendungsfall?


viele Grüße,
SBond
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Re: Prozessabbild speichern und wiederherstellen

Beitrag von GronkhLP »

SBond hat geschrieben:Hast du schon einen konkreten Anwendungsfall?
Hallo SBond :) ,
ja sogar zwei. Wenn die Umsetzung dieses Vorhabens möglich ist, dann kann man es in vielen Bereichen einsetzen:
  • Automatische Sicherung des aktuellen Programmzustandes, um nach einem Programmabsturz wiederherzustellen. Wenn die eigene Anwendung aufgrund eines Fehlers abgestürzt ist, dann wäre es hilfreich, den vorherigen Zustand wiederherzustellen, damit der Benutzer zum Beispiel nicht nochmal seine Dateien in seinem Editor reinladen muss. Wenn es möglich ist, dann hätte man nach dem Laden des Prozessbildes alle Verweise und Objekte im Speicher. Falls man es nicht über ein Abbild machen könnte, dann müsste man die Funktion aufwendig entwickeln, um zum Beispiel die geöffneten Tabs im Editor mit den Dateien zu öffnen. Aber mit Hilfe eines Abbildes kann man einfach wiederherstellen und zack ist alles wieder da ohne etwas manuelles machen zu müssen.
  • Spielstand eines Spiels wiederherzustellen. Normalerweise müsste man jede Variable, die für das aktuelle Spielgeschehen zuständig sind, einzeln zwischenspeichern. Wenn man es über ein Abbild automatisieren könnte, wäre das perfekt und es ist kein Aufwand mehr erforderlich wenn man weitere Variablen hinzufügt.
Kurzum: Automatisierung der Wiederherstellungsvorgänge von älteren Programmzuständen.
Bild
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Re: Prozessabbild speichern und wiederherstellen

Beitrag von Tommy »

Geile Idee :allright: Das würde mich auch interessieren aber kein Plan wie und ob das geht.
Zuletzt geändert von Tommy am 27.01.2015 10:55, insgesamt 2-mal geändert.
PB 5.41 x64
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Prozessabbild speichern und wiederherstellen

Beitrag von STARGÅTE »

Ich behaupte mal das es in der Art wie "ihr" das plant nicht möglich ist.

Einfaches Gegenbeispiel:
Ich starte mein Programm (A) und erstelle sehr viele Objekte (Speicher im Ram).
Nun erstelle ich ein Speicherabbild.
Danach lösche ich sehr viele Objkte (zB durch eine Fehlbedienung).
Windows (oder allgemein das OS) gibt bereiche (Pages) des Prozessspeichers wieder zur Nutzung frei.
Danach starte ich ein anderes Programm (B) welches nun zufälligerweise den alten Platz von A nutzt.

Für Programm A ist es damit nicht mehr möglich sich zum alten Stand wiederherzustellen, da der Platz von B plockiert wird.
Ich kann aber B genauso wenig wie A einfach verschieben, denn dann verlieren Pointer (deren Adresse ja absolut ist) ihre Gültigkeit.

Nun zu den Beispielen:
In Spielen muss (zum speichern des Spielstands) eh alles "per Hand" gespeichert werden.
Dabei muss man ja garnicht jede Variable einzeln speichern. Du kannst das Spiel (statische und dynamische Elemente) in einer Struktur speichern, die dann als ganzes gespeichert wird. Diese routiene geht natürlich dann auch zur wiederherstellung.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Prozessabbild speichern und wiederherstellen

Beitrag von SBond »

wäre wahrscheinlich auch zu schön gewesen. ...schade.

Eventuell müsste man ein Modul entwickeln, in dem man Gadgets oder Variablen registriert und überwacht, bzw. in dem die Werte periodisch gesichert werden (z.B. in eine XML-Datei). Ich kann aber nur schwer einschätzen, wie aufwändig das wird und welche Probleme auftreten könnten.

...sowas könnte sogar ich gebrauchen. Da muss ich mal etwas experimentieren :)
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Re: Prozessabbild speichern und wiederherstellen

Beitrag von GronkhLP »

Hallo lieber STARGÅTE,

ich verstehe, aber ein Gegenbeispiel für dein Gegenbeispiel: Wenn man sofort nach Programmbeendigung selber den Speicher wieder in Anspruch nimmt, ohne dass ein anderer Prozess den derzeitigen freien Speicherbereich wegnimmt, dann sollte es theoretisch gehen, da die Pointeradressen noch auf den selben Bereich zeigen, der noch verfügbar ist. Würde es dann in dem Fall funktionieren?
Anfänger-Frage: Kann man nicht einfach den vollständigen Programmspeicherbereich peeken und anschließen poken?
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Prozessabbild speichern und wiederherstellen

Beitrag von STARGÅTE »

Guck dir mal das hier an:
http://www.purebasic.fr/english/viewtop ... 12&t=44754

Mit ReadProcessMemory und WriteProcessMemory kann man Prozess-Speicher lesen und schreiben (wenn man die nötigen Rechte hat).
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Re: Prozessabbild speichern und wiederherstellen

Beitrag von GronkhLP »

Danke für den Link mit dem bereitgestellten Code, der auf jeden Fall eine gute Vorlage ist. :allright:
Ich habe mein bestes versucht aber das testweise Poken funktioniert bei mir nicht. Mein bisheriger Code:

Code: Alles auswählen

EnableExplicit

Procedure ManiMem(StartMemAddr, EndMemAddr, StrToFind$, StrToReplace$)
  Protected StrToFindLen = Len(StrToFind$)
  Protected hProcess
  Protected result
  Protected mbi.MEMORY_BASIC_INFORMATION
  Protected sBuffer
  Protected res
  Protected written
  Protected x
  Protected tmp$
  
  hProcess = OpenProcess_(#PROCESS_ALL_ACCESS, #False, GetCurrentProcessId_());
  Repeat
    result=VirtualQueryEx_(hProcess, StartMemAddr, @mbi.MEMORY_BASIC_INFORMATION, SizeOf(MEMORY_BASIC_INFORMATION))
    If mbi\State = #MEM_COMMIT And mbi\Protect <> #PAGE_READONLY And mbi\Protect <> #PAGE_EXECUTE_READ And mbi\Protect <> #PAGE_GUARD And mbi\Protect <> #PAGE_NOACCESS
      sBuffer = AllocateMemory(mbi\RegionSize)
      res = ReadProcessMemory_(hProcess, StartMemAddr, sBuffer, mbi\RegionSize, @written)
      If written > 0
        For x = 0 To written
          tmp$ = PeekS(sBuffer+x, StrToFindLen) 
          If FindString(tmp$, StrToFind$, 1)
            Debug "FOUND MATCH - " + Hex(mbi\BaseAddress+x) + "=" + tmp$
            Debug PokeS(sBuffer+x, StrToReplace$, StrToFindLen) ; <<<<<<<<<<<<<<<<<<<<< ? :D
          EndIf
        Next
      EndIf 
      FreeMemory(sBuffer)
    EndIf
    StartMemAddr = mbi\BaseAddress + mbi\RegionSize
  Until StartMemAddr >= EndMemAddr Or result = 0
EndProcedure

If OpenWindow(0, 0, 0, 300, 100, "ManiMem", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TextGadget(1, 10, 10, 480, 20, "MeinTestTempText", 0)
  
  ManiMem(0, $7FFFFFFF, "MeinTestTempText", "M31nT3stT3mpT3xt")
  
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Ich finde meinen String in meinem Speicher wieder und versuche mit Hilfe der Speicheradressenposition durch meinen anderen String zu ersetzen, aber es klappt aus irgendeinem Grund nicht. Ich brauche deshalb von euch Hilfe und wäre für jede Lösung und Tipps dankbar. Auch eine Säuberung des Codes wäre nicht schlecht. Danke an euch:)
Bild
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Prozessabbild speichern und wiederherstellen

Beitrag von PMV »

Ihr wollt doch "nur" den jetzt Zustand in eine Datei speichern.
Das ist nichts weiter als das klassische Speichern wie z.B. bei
spielen. :wink: Um den aktuellen Stand eines Spiels zu speichern
müssen lediglich alle relevanten Variablen in die Datei geschrieben
werden und dann wieder ausgelesen werden. :wink:

Der Zustand eines Prozesses kann natürlich kompliziert werden,
aber seit PB5.30 gibt es tatsächlich eine sehr mächtige und für
dich perfekte neue Funktion. Serialisieren der Daten im Speicher
nach JSON oder XML und damit die Möglichkeit, mit nur wenig Zeilen
Code ganze komplexe Strukturen, Listen, Arrays, usw. in Dateien zu
schreiben und genau so aus zu lesen. Wie die Funktion heißt hab
ich aber grad nicht auf dem Schirm. :oops:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten