WinFuture-Forum.de: Delphi - Speicherbereich Eines Prozess Ermitteln - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Delphi - Speicherbereich Eines Prozess Ermitteln


#1 Mitglied ist offline   HollaDieWaldfee2005 

  • Gruppe: aktive Mitglieder
  • Beiträge: 39
  • Beigetreten: 01. Mai 05
  • Reputation: 0

geschrieben 17. März 2007 - 13:25

Ich habe folgendes Problem:
Ich möchte gerne von einem Prozess den Speicherbereich herausbekommen und die End-Adresse. Ich weiß nun nicht ob GetProcessWorkingSetSize die richtige Lösung ist oder ob ich einfach nur den Speicherverbrauch des Prozesses ermitteln muss. Wenn ich mit GetProcessWorkingSetSize arbeite, bekomme ich bei unterschiedlichen Prozessen immer die selben 2 Werte. Kann mir jemand sagen, wo mein Fehler liegt oder wie ich an die richtigen Bereichadressen komme ?

procedure TForm1.RangeClick(Sender: TObject);
var lpMin,lpMax,ProcessID,test:Cardinal;
begin
 ProcessID := HexToInt (Label4.Caption);
 test := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID);
 GetProcessWorkingSetSize(test, lpMin, lpMax);
 l_min.Caption := IntToHex(lpMin,8);
 l_max.Caption := IntToHex(lpMax,8);
 if lpmin or lpmax = 0 then begin
   l_min.Caption := IntToHex(0,8);
   l_max.Caption := IntToHex(0,8);
   end;
   CloseHandle (test);
end;

0

Anzeige



#2 Mitglied ist offline   HollaDieWaldfee2005 

  • Gruppe: aktive Mitglieder
  • Beiträge: 39
  • Beigetreten: 01. Mai 05
  • Reputation: 0

geschrieben 20. März 2007 - 19:45

Danke, habs allein geschafft dank VirtualQueryEx
0

#3 Mitglied ist offline   simjoh 

  • Gruppe: Mitglieder
  • Beiträge: 1
  • Beigetreten: 01. April 07
  • Reputation: 0

geschrieben 01. April 2007 - 17:24

Hallo, könnte ich mal den Quellcode deiner Routine haben? Danke.
0

#4 Mitglied ist offline   HollaDieWaldfee2005 

  • Gruppe: aktive Mitglieder
  • Beiträge: 39
  • Beigetreten: 01. Mai 05
  • Reputation: 0

geschrieben 04. April 2007 - 13:09

Also bisher läuft der Quelltext fehlerfrei, allerdings könnte es noch ein paar änderungen brauchen, weil bisher nur Integer-Zahlen benutzbar sind.

Ich stell mal den Source für die Speicherbereichserkennung zur verfügung, wenn jemand interesse hat, kann er an den Projekt gerne mitarbeiten. Alle Einträge landen in einer Listbox, die Einträge in der Listbox sind alle lesbaren Speicheradressen, die man mit ReadProcessMemory ansprechen und mit WritePro.... ändern kann. In der zweiten Spalten landen die Anzahl der Pages, eine Page ist maximal 4096 Bytes groß und lässt sich durch die Suche von Werten und das ermittel von Adressen, besser "errechnen". Ich bin den Weg gegangen, möglichst viele Werte in einen Buffer zu schreiben, dass das schneller ist, als jeden Wert einzeln auszulesen. Bis vor kurzen war ich ein Dau auf den Gebiet und das hat sich durch Try&Error schnell geändert.

procedure TForm1.GetAdressRange;
var mbi:MEMORY_BASIC_INFORMATION;
	l:TListItem;
	Size:Longint;
	big:Longint;
	s:Pointer;
	a:DWord;
begin
 MemArea.Clear;
 ProcessID:=HexToInt (Label4.Caption);
 test := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID);
 if test = 0 then ShowMessage ('Fehler');
 S:=Pointer(0);
 repeat
 a:= VirtualQueryEx (test,s,mbi,sizeof(mbi));
 Size := Longint(mbi.RegionSize div 4096);
 big := Longint (mbi.BaseAddress)+(Size*4096);
 s:=Pointer(big);
 if MEM_COMMIT = MBI.State then begin
  l := MemArea.Items.Add;
  l.Caption:=IntToHex(Longint(mbi.BaseAddress),8);
  l.SubItems.Add(IntToStr(Size));
  Application.ProcessMessages;
  end;
 until a <> sizeof (mbi);
 end;

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0