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),$1000) then begin size := sizeofmem(pointer(i*$10000)); if size <> 0 then begin end; end; end; |
beides ungetestet
The-FoX - So 06.02.05 18:11
Hm, deinen code muss ich mir nochmal genauer ansehen.
Danke!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!