Autor Beitrag
Inferno
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: Do 12.08.04 14:39 
Hi,

also ich bin langsam echt am verzweifeln, ich habe ne Funktion die mir ne speicheradresse auslesen soll(Speicherauszug). Ich übergebe die Startadresse und die Länge. Jetzt will ich aber zusätzlich noch die Info Start- und Endadresse in ein Logfile schreiben, was ich mit der Startadr. hinbekommen habe und nun versuche ich krampfhaft die länge auf die Startadresse zu addieren was ja theoretisch zur endadr. führen sollte :D

Beispiel:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure ReadMem(StartAddr : Pointer; Len : integer);
//... Vars
begin
// ... Datei öffnen usw.

  ShowMessage(Format('Start Address: %p', [StartAddr]));
// -> jetzt sollte die Endadresse folgen

// Speicher lesen und in Datei schreiben  
   Move(StartAddr^, Buf, Len);
   Writeln(Datei, StrPas(Buf));
// ... Datei schließen usw.
end;


Aufrufen der Funktion mit:

ausblenden Delphi-Quelltext
1:
  ReadMem(@Variable, SizeOf(Variable));					


Ich hab jezt mal die ganzen Fehlerabfangmethoden weggelassen aus Zeitgründen :)

Ein weiteres Prob ist das die Anwendung zwar den Inhalt des Speicherbereichs in das File schreibt, allerdings danach einfach zu geht (wohl zu viele exceptions *g*)

Naja vielleicht könnt ihr mir sagen wie ich die Endadr. rausbekommen und was ich beim auslesen des speicherbereichs falsch mache. Hab in der hilfe irgendwas gelesen das man ne Pointer Variable ned Dereferenzieren kann, aber der Compiler hat irgendwie nix dagegen ;)
Wenn ichs mit PChar mache hats auch ned funktioniert,
Bitte helft mir :D

mfg
Inferno
bttb930
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 33



BeitragVerfasst: Do 12.08.04 17:37 
Ich glaub Du solltest Inc benutzen. Weiß aber nicht ob das wirklich die Lösung ist...
Inferno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: Fr 13.08.04 08:00 
Sorry man kann leider Inc() nicht auf Pointer Variablen anwenden. Zumindest gehts bei mir ned, hatte ich auch schon getestet. ;)
Inferno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: Fr 13.08.04 11:58 
Also nachdem ich den Pointer an nen PChar zugewiesen habe, konnte ich mit Inc() die Address bestimmen.

naja ich betrachte das jetzt mal als abgeschlossen :D
Inferno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: Fr 13.08.04 12:31 
Huhu :)

hab noch ne bessere Möglichkeit gefunden, geht gut und man braucht keine Pointer -> PChar Zuweisung:

ausblenden Quelltext
1:
  Format('%p - %p  ', [StartAddr, Ptr((LongInt(StartAddr) + Len))]);					


Ausschlagebend sind die Funktionen Ptr() und LongInt(), hätte ich das mal früher gefunden :D

mfg
Inferno
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 13.08.04 21:31 
Longint ist keine Funktion, sondern ein Typecast.

Ansonsten sollte auch DWORD(Pointer)+Len-1 funzen.

Funktioniert übrigens mit jedem Typ:

Weiterhin: Zur Verwendung von Inc:
Keine Ahnung, warums nicht gehen sollte:

Inc(Pointer); //Auf nächstes Byte zeigen

B:^Word //PWord
Inc(B); //Auf nächstes Word zeigen!

Inc(B, 4); //4 Words!!! weiterspringen

Gleiches bei Rekords und anderen Typen.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Inferno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: Mo 16.08.04 07:37 
BenBE hat folgendes geschrieben:

Weiterhin: Zur Verwendung von Inc:
Keine Ahnung, warums nicht gehen sollte:

Inc(Pointer); //Auf nächstes Byte zeigen



hastes denn mal probiert, dann wüßtest du das es ned geht ;)
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Mo 16.08.04 08:21 
Moin!

Inferno hat folgendes geschrieben:
BenBE hat folgendes geschrieben:

Weiterhin: Zur Verwendung von Inc:
Keine Ahnung, warums nicht gehen sollte:

Inc(Pointer); //Auf nächstes Byte zeigen



hastes denn mal probiert, dann wüßtest du das es ned geht ;)


Inc() funktioniert auf alle typisierten Pointer, da es nur bei solchen die Grösse der Daten kennt und um genau diese den Zeiger erhöht. Bei nicht typisierten Zeigern verweigert der Compiler das Inc(), da er nicht weiss, wie weit er inkrementieren sollte.

@Inferno: Dann schreib bitte mit dazu, dass du den Parameter von dem Inc() "Pointer" als Typ gesehen hast und nicht als Variable - weil BenBE hat es genau anders herum gesehen - dann könnten wir uns solche langen Schneeballposts (geht - geht nicht - geht - geht nicht...) sparen...

MfG
Muetze1
Inferno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: Mo 16.08.04 09:14 
Muetze1 hat folgendes geschrieben:


@Inferno: Dann schreib bitte mit dazu, dass du den Parameter von dem Inc() "Pointer" als Typ gesehen hast und nicht als Variable - weil BenBE hat es genau anders herum gesehen - dann könnten wir uns solche langen Schneeballposts (geht - geht nicht - geht - geht nicht...) sparen...

MfG
Muetze1


schau mal bitte in meinem ersten Post die Übergabevar an speziell den Datentyp ;)

mfg
Inferno