Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speicheradresse um eins erhöhen (https://www.delphipraxis.net/109168-speicheradresse-um-eins-erhoehen.html)

napsterxx 25. Feb 2008 16:15


Speicheradresse um eins erhöhen
 
Liebe Leute,
ich suche eine Prozedur mit der ich eine Speicheradresse, z.B. 00400100 um eins erhöhen kann. :)

CalganX 25. Feb 2008 16:22

Re: Speicheradresse um eins erhöhen
 
Wenn du einen Pointer hast, kannst du ihn mit Delphi-Referenz durchsuchenInc auf die nachfolgende und mit Delphi-Referenz durchsuchenDec auf die vorherige Speicherstelle verschieben. Denk aber daran, dass das nur eingeschränkt möglich ist. D.h., du kannst mit dem Pointer nicht auf Speicherbereiche eines anderen Prozesses zugreifen.

Muetze1 25. Feb 2008 17:03

Re: Speicheradresse um eins erhöhen
 
Afaik erlaubt Delphi die Anwendung von Delphi-Referenz durchsuchenInc() und Delphi-Referenz durchsuchenDec() nicht auf untypisierte Zeiger sondern nur auf typisierte. Und dort wird die Adresse um jeweils den angegeben Wert (Default 1) multipliziert mit der Grösse des Typs erhöht bzw. verringert. Also eine PDWord wird um 4 Bytes verschoben, bei Dec(PDWord, 2) sogar um 8 Bytes.

Dax 25. Feb 2008 17:07

Re: Speicheradresse um eins erhöhen
 
Delphi-Quellcode:
procedure IncAt(address: Cardinal);
begin
  PCardinal(address)^ := PCardinal(address)^ + 1;
end;

SirThornberry 25. Feb 2008 17:15

Re: Speicheradresse um eins erhöhen
 
@Dax: Das ist nen bissl komisches Beispiel. Bei deinem Beispiel müsste man ja address die Adresse des Pointer zuweisen. Dann doch lieber so:
Delphi-Quellcode:
function inc_address(var address: pointer);
begin
  Cardinal(address) := Cardinal(address) + 1;
  result := address;
end;

DeddyH 25. Feb 2008 17:19

Re: Speicheradresse um eins erhöhen
 
@Jens, da hast Du aber was gehörig vermischt.
Delphi-Quellcode:
procedure inc_address(var address: pointer);
begin
  Cardinal(address) := Cardinal(address) + 1;
end;

Zacherl 25. Feb 2008 17:25

Re: Speicheradresse um eins erhöhen
 
Wenns um sowas wie Schleifen und Zugriff auf einzelne Bytes geht:

Delphi-Quellcode:
function DumpMem(P: Pointer; Len: Cardinal): String;
var
  I: Cardinal;
begin
  for I := 0 to Len do
  begin
    Result := Result + IntToHex(PByte(Cardinal(P) + I)^, 2);
  end;
end;

Muetze1 25. Feb 2008 23:07

Re: Speicheradresse um eins erhöhen
 
Zwar mal davon abgesehen, dass Cardinal() der richtige Typ wäre für den Typecast, aber afaik schmeisst Delphi dann eine Warnung bei der Addition von wegen Kombination von vorzeichenlosen und vorzeichenbehafteten Datentypen. Dadurch zwingt Delphi einem (leider) bei solcher Adressarithmetik zu der vorzeichenbehafteten Rechnung.

@Zacherl: Da er bei deiner Lösung immer wieder vom Pointer neu losrechnet (um i drauf zu rechnen), wäre es performanter einfacher eine lokale Variable vom Typ PByte anzulegen und dieser vor der Schleife den übergebenen Pointer zu übergeben. In der Schleife reicht dann einfach ein Delphi-Referenz durchsuchenInc().


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz