Entwickler-Ecke

Windows API - Wo beginnt/endet der Speicher eines Prozesses


The-FoX - Sa 05.02.05 16:47
Titel: Wo beginnt/endet der Speicher eines Prozesses
Hallo,

Ich bin gerade dabei ein lustiges Programm zu erstellen :lol: (Dazu nachher mehr).

Also, ich möchte wissen, wie ich herausfinden kann, wo ein der Speicher eines Prozesses beginnt und wo er aufhört. Ich lese nämlich mit einer For-Schleife und ReadProcessmemory alle Werte aus und wandle diese dann in Farben um. Was dabei rauskommt ist der Hammer. Man kann anhand eines Bildes herausfinden, was das Programm gerade tut :lol: Ist ein unnötiges Programm, aber die Bilder die rauskommen machen einfach Spass. Das Problem ist jetzt, dass wenn ich bei $00000 beginne und bei $FFFFFF aufhöre sind 9 von 10 Werte nicht nicht "vergeben".

danke!


Delete - Sa 05.02.05 19:01

Nun ja, nicht jeder Prozess belegt auch seine 4 GB (2 GB) Adressraum, die er zugewiesen bekommt.


uall@ogc - Sa 05.02.05 19:20

fang bei 0x00400000 an zu lesen


The-FoX - Sa 05.02.05 19:26

habt dank!

Wenn ich bei 0x004000 anfange, funktioniert es!
Nur noch eine Frage: Wo hört der Speicher dann auf, bei $FFFFF?


tommie-lie - Sa 05.02.05 19:30

The-FoX hat folgendes geschrieben:
Nur noch eine Frage: Wo hört der Speicher dann auf, bei $FFFFF?
Der benutzbare Speicher bei $7FFFFFFF, darüber kommt Verwaltung, MMFs etc.


UC-Chewie - Sa 05.02.05 19:44

[quote="tommie-lie"]
The-FoX hat folgendes geschrieben:
Der benutzbare Speicher bei $7FFFFFFF, darüber kommt Verwaltung, MMFs etc.


Naja, MMFs sind ja auch "benutzbar" ;)


uall@ogc - So 06.02.05 11:51

du kannst es folgendermaßen machen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function sizeofmem(p: pointer): integer;
var dosh: PImageDosHeader;
    nth: PImageNtHeaders;
begin
  result := 0;
  dosh := p;
  if dosh^.e_magic = IMAGE_DOS_SIGNATURE then
  begin
    nth := pointer(integer(dosh)+dosh^._lfanew);
    if nth^.Signature = IMAGE_NT_SIGNATURE then
    begin
      result := nth^.OptionalHeader.SizeOfImage
    end;
  end;
end;



mit sizeofmem(pointer($00400000)) bekommste die größe des speichers der EXE, kannst auch
sizeofmem(pointer(getmodulehanlde('exename')) benutzen
mit sizeofmem(pointer(getmodulehandle('kernel32.dll'))) bekommste die speichergröße der kernel32.dll wobei
pointer(getmodulehandle('kernel32.dll')) der anfang ist

ne schleife für alle module könntest so machen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  var i,size: integer;
  for i := 0 to $7FFF do
  begin
    if not isbadreadptr(pointer(i*$10000),$1000then
    begin
      size := sizeofmem(pointer(i*$10000));
      if size <> 0 then
      begin
         // pointer(i*$10000) = anfang des speichers
         // size = größe des speichers
         // mit getmodulefilename(pointer(i*$10000),...) bekommste den modulnamen
      end;
    end;
  end;


beides ungetestet


The-FoX - So 06.02.05 18:11

Hm, deinen code muss ich mir nochmal genauer ansehen.
Danke!