![]() |
Speicher überwachen
Hi,
Gibt es eine Möglichkeit einen bestimmten Speicherbereich zu überwachen und dann auf Änderungen reagieren zu können? Gruß Neutral General |
Re: Speicher überwachen
- diesen Speicherbereich schützen
- auf Exception warten - diese abfrangen und Speicher entschützen aka Zugriff gewähren - prüfen ob sich was geändert hat oder pollen und regelmäßig schauen ob sich was geändert hat oder einen Emulator schreiben ... dann bekommst'e sowas auch mit :roll: |
Re: Speicher überwachen
Polling wäre in meinem Fall zu unzuverlässig...
Wie bekomme ich denn mit wenn in so einem Fall, wie du ihn zuerst beschrieben hast, eine Exception geworfen wird? |
Re: Speicher überwachen
Und wieder fehlt die entscheidende Information: Ist es ein eigener Prozess oder ein fremder?
|
Re: Speicher überwachen
Es ist ein eigener Prozess.
Also ich habe gerade mal etwas rumprobiert und war auch theoretisch recht erfolgreich:
Delphi-Quellcode:
Generell ist das also super. Allerdings scheint es dieses Exception.GetExceptionStackInfoProc-Feature erst in neueren Delphi Versionen zu geben. Wäre ganz gut wenn das auch in älteren ginge.
TForm1 = class(TForm)
private { Private-Deklarationen } public n: Integer; end; implementation function GetExceptionStackInfoProc(P: PExceptionRecord): Pointer; begin PInteger(p^.ExceptObject)^ := 20; end; procedure TForm1.FormCreate(Sender: TObject); begin Exception.GetExceptionStackInfoProc := GetExceptionStackInfoProc; end; procedure TForm1.Button1Click(Sender: TObject); var op: Cardinal; begin n := 10; VirtualProtect(@a,4,PAGE_EXECUTE_READWRITE or PAGE_GUARD,op); end; procedure TForm1.Button2Click(Sender: TObject); begin Caption := IntToStr(n); // n = 20, falls vorher auf Button1 geklickt wurde end; Gruß Neutral General |
Re: Speicher überwachen
Kannst du eine bestimmte Windows-Version voraussetzen? Wenn du mindests XP hast, kannst Vectored Exception Handling verwenden.
|
Re: Speicher überwachen
Delphi-Quellcode:
Sollte ab Windows2k funktionieren.
var
RtlDispatchExceptionNext: function(excRec: PExceptionRecord; excCtxt: PContext): integer; stdcall = nil; function RtlDispatchExceptionCallback(excRec: PExceptionRecord; excCtxt: PContext): integer; stdcall; begin result := RtlDispatchExceptionNext(excRec, excCtxt); // Exception Handling end; procedure InstallExcDispatchHook; var c1, c2: dword; begin c1 := dword(GetProcAddress(GetModuleHandle('ntdll.dll'), 'KiUserExceptionDispatcher')); if Byte(pointer(c1)^) = $FC then inc(c1); if (dword(pointer(c1)^) = $04244C8B) and // mov ecx, [esp+4] ; PContext (dword(pointer(c1 + 4)^) and $00FFFFFF = $241C8B) and // mov ebx, [esp+0] ; PExceptionRecord (byte(pointer(c1 + 7)^) = $51) and // push ecx (byte(pointer(c1 + 8)^) = $53) and // push ebx (byte(pointer(c1 + 9)^) = $E8) and // call RtlDispatchException VirtualProtect(pointer(c1 + 10), 4, PAGE_EXECUTE_READWRITE, c2) then begin RtlDispatchExceptionNext := pointer(c1 + 14 + dword(pointer(c1 + 10)^)); dword(pointer(c1 + 10)^) := dword(@RtlDispatchExceptionCallback) - c1 - 14; VirtualProtect(pointer(c1 + 10), 4, c2, c2); end; end; ReadProcessMemory verursacht übrigens keine Exception. Und mit VirtualProtectEx wirst du nichts mitbekommen... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz