Moin Fox,
auf diesem Wege kannst Du Dir alle zu einem Prozess gehörenden Speicherbereiche auslesen (entsprechende Berechtigung vorausgesetzt).
Eine zusammenhängende Region umfasst immer einen Speicherbereich, bei dem der Wert für State und AllocationProtect (siehe
MEMORY_BASIC_INFORMATION gleich ist.
(Das ganze ist nicht Copy&Paste fähig, nur fast
)
Delphi-Quellcode:
procedure GetMemoryList(const AhProcID : DWORD);
var
hProc : DWORD;
pMemStart : Pointer;
dwRead : DWORD;
mbi : MEMORY_BASIC_INFORMATION;
pBufLocal : Pointer;
dwReadToBuf : DWORD;
begin
// Prozess öffnen
hProc := OpenProcess(PROCESS_ALL_ACCESS,true,AhProcID);
// Lies sich nicht öffen ==> Fertig (kann bei ALL_ACCESS schon mal passieren ;-)
if hProc = 0 then exit;
try
// wir beginnen bei Adresse 0
pMemStart := nil;
// auslesen des MBI für die Adresse in pMemStart
dwRead := VirtualQueryEx(hProc,pMemStart,mbi,SizeOf(mbi));
// Solange Daten ausgelesen werden können weitermachen
while dwRead = SizeOf(mbi) do begin
// Speicherbereich vom Prozess belegt?
if (mbi.State = MEM_COMMIT) then begin
// Puffer reservieren
pBufLocal := AllocMem(mbi.RegionSize);
try
// Versuchen den Speicher auszulesen
if ReadProcessMemory(hProc,mbi.BaseAddress,pBufLocal,mbi.RegionSize,dwReadToBuf) then begin
// Hier kann dann etwas mit dem gelesenen Speicher geschehen
end;
finally
// Buffer wieder freigeben
FreeMem(pBufLocal,mbi.RegionSize);
end;
end;
// Auf nächste mögliche Speicheradresse setzen
pMemStart := Pointer(DWORD(mbi.BaseAddress)+mbi.RegionSize);
// und den nächsten MBI auslesen
dwRead := VirtualQueryEx(hProc,pMemStart,mbi,SizeOf(mbi));
end;
finally
CloseHandle(hProc);
end;
end;