Speicherbereich auf Veränderung überwachen
-
Hallo,
zum einen hoffe ich, dass ich ier richtig bin und desweiteren das die Frage nicht zu dumm ist.Folgendes Problem:
Ich möchte einen Speicherbereich auf Veränderung überprüfen:(DWORD)&Speicher
diesen Überschreibe ich in einer Schleife in eine Variable und teste ob es verändert wurde.
Da es sich um ein Array handelt speichere ich bei Änderung den Speicherbereich in ein Array.while(true) { if(tmp_Speicher != *(DWORD*)&Speicher) { tmp_Speicher = *(DWORD*)&Speicher; for(....) { Array[i] = Speicher[i]; } } // An dieser Stelle ein Sleep(1) reduziert die Prozessorauslastung, // aber gibt mir nicht jede Veränderung! }Ohne Sleep funktioniert das ganze eigentlich sehr gut, abgesehen von der Auslastung des Prozessors.
Aber sobald ich auch anderen Code ausführen lasse, bekomme ich auch nicht alle Veränderungen. Hab es auch schon mit nem Thread probiert.
Meine Frage dazu, wie man das, oder ob man das anders lösen kann?
bedanke mich voraus für eure Hilfe.
-
Man kann über die Debug-Register der CPU ein paar Speicherstellen definieren die überwacht werden sollen.
Wird so eine Speicherstelle geändert, dann wird ein Interrupt ausgelöst.
Funktioniert aber unter gewissen Bedingungen nicht, z.B. nicht wenn die Speicherstelle von einem anderen Prozess aus oder vom Kernel überschrieben wird.Und ich hab' auf die Schnelle keine Informationen darüber gefunden wie man diese Register unter Windows selbst ansprechen/verwenden kann.
Was sehr einfach geht ist dieses Feature mit dem Debugger zu verwenden. Einfach einen Data-Breakpoint setzen und fertig.
-
Pette schrieb:
// An dieser Stelle ein Sleep(1) reduziert die Prozessorauslastung,
// aber gibt mir nicht jede Veränderung!wenn du den sleep(1) wegläßt, bekommst du auch nicht jede Veränderung mit, denn es kann sein, daß der überwachende Thread gerade inaktiv ist, während andere Threads den Speicher mehrmals verändern (race condition)
sicher ist die Überwachung nur, wenn du mit einem Debugger einen Watchpoint setzt oder dir einen eigenen Debugger schreibst
http://www.codeproject.com/Articles/43682/Writing-a-basic-Windows-debugger
http://blogs.msdn.com/b/reiley/archive/2011/07/21/data-breakpoint.aspx
-
Hab das ganze auf die schnelle zwar nicht durchschaut, aber Breakpoints scheinen wirklich 'ne super Lösung zu sein.
Danke euch beiden vielmals.