Autor Beitrag
SAiBOT
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 323
Erhaltene Danke: 6

XP SP2; 7
D7; D2009
BeitragVerfasst: Do 01.05.08 16:52 
Hier ist eine Funktion von mir die im Speicher Daten sucht!
Mein Problem ist das Result (Array of Pointer).
Bei jedem SetLength Befehl wird der Array geleert, dies habe ich über einen kleinen Umweg bewältigt, nur das gefällt mir nicht so richtig!
Ich komm einfach nicht drauf wie ich das best möglich mit dynamischen Arrays hinkriege, das nach dem aufrufen der Funktion Length u. Inhalt des Arrays korrekt sind.
Hier mein Code:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
type
  PointerArray = Array of Pointer;

function SearchInMemory(Source:Pointer; SourceLen:Integer;
  Data:Pointer; DataLen: Integer):PointerArray;
var
  SourceEnd,
  SourceStart: Integer;
  tmp: PointerArray;
  i:Integer;
begin
  SetLength(Result, 0);

  SourceStart := Integer(Source);
  SourceEnd := SourceStart + SourceLen - (DataLen - 1);

  while SourceStart < SourceEnd do
  begin
    if CompareMem(Pointer(SourceStart), Data, DataLen) then
    begin
      SetLength(tmp, Length(Result));
      tmp := result;

      SetLength(Result, Length(Result)+1);
      for i := 1 to Length(tmp) do
        Result[i] := tmp[i];  
      Result[Length(Result)] := Pointer(SourceStart);
      Inc(SourceStart, DataLen-1);
    end;
    inc(SourceStart);
  end;
end;


MfG
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 02.05.08 18:46 
Versuchs mal mit ReallocMem auf nen dynamisch mit GetMem geholten Speicherblock und kopier das Ergebnis erst am Ende in das Result-Array mit Move ...

Alternativ kannst Du auch einfach Spezialfähigkeit "korrektes Programmieren" benutzen und in Zeile 27
ausblenden Delphi-Quelltext
1:
Result[Length(Result)] := Pointer(SourceStart);					

durch
ausblenden Delphi-Quelltext
1:
Result[High(Result)] := Pointer(SourceStart);					

ersetzen :P

Klassischer Fall von Buffer Overflow :P

_________________
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.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 02.05.08 21:15 
Bei so einer wachsenden Menge mit unbekannter Endgröße würde ich eher auf eine TList setzen. Add lässt sich erst gar nicht falsch indizieren :mrgreen: .

user profile iconBenBE hat folgendes geschrieben:
Spezialfähigkeit "korrektes Programmieren"
Und nicht den Kaffee-Buff vergessen, um den Cooldown gering zu halten ;) .