Autor Beitrag
Chris79
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 18.06.08 17:20 
Hallo!

Ich habe mit folgendem Programm Probleme:

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:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
program packfile;

{$APPTYPE CONSOLE}

uses
  SysUtils,Windows,Classes;

const
    NEWFILE_SIZE = 300000;

procedure ReadFileIntoMemory(sFileName: PAnsiChar; const pMem: Pointer; dwOffset: DWord);
var
  dwBufSize: DWord;
  dwBytesRead: DWord;

  fs: TFileStream;
  fr: TReader;

  pBuf: array of Byte;
  pThis: Pointer;
begin
  dwBufSize := 64;
  SetLength(pBuf, dwBufsize);
  pThis := Pointer(DWord(pMem) + dwOffset);
  fs := TFileStream.Create(String(sFileName), fmOpenRead);
  fr := TReader.Create(fs, dwBufSize);
  if fs.Size <= Int64(dwBufSize) then
    fr.Read(pThis, fs.Size)
  else
    begin
      fr.Read(pBuf, dwBufSize);
      CopyMemory(pThis, @pBuf, dwBufSize);
      dwBytesRead := dwBufSize;
      while dwBytesRead < fs.Size do
        begin
          if dwBufSize >= (fs.Size - dwBytesRead) then
            dwBufSize := (fs.Size - dwBytesRead);
          pThis := Pointer(DWord(pThis) + dwBufSize);
          fr.Read(pBuf, dwBufSize);
          CopyMemory(pThis, @pBuf, dwBufSize);
          Inc(dwBytesRead, dwBufSize);
        end;
    end;
  fr.Free;
  fs.Free;
end;



var
  pMem: Pointer;
begin
    GetMem(pMem, NEWFILE_SIZE);
    ReadFileIntoMemory(PChar('test.exe'), pMem, 0);
    Writeln('1');
    //ReadFileIntoMemory('test1.exe', pMem, 100000);
    //ReadFileIntoMemory('test3.exe', pMem, 200000);
end.


Wenn die Prozedur beendet ist, tritt eine AccessViolation auf.
Disassembly zeigt: push dowrd ptr [ebp+$0c] (ebp+$0c ist 00000000)

Die Konstruktion mit pBuf hatte ich ursprünglich gar nicht, sondern hatte direkt pMem benutzt. Das mochte aber der TReader nicht und das Programm ist direkt bei fr.read abgestürzt.

Irgendwelche Ideen?

Gruß,

Christian

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Ich habe jetzt zumindest schon die Problemstelle identifiziert:

Wen ich pBuf als festes Array deklariere, dann funktioniert es.

Wie kann ich das Array denn dynamisch verwenden? SetLength 63,64,65 funktioniert alles nicht.



Außerdem kommen in dem Array unterschiedliche Werte an, ja nachdem, ob ich es fest deklariere (korrekte Werte) oder dynamisch (falsche Werte).
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mi 18.06.08 19:17 
Verwende mal zum füllen von pBuf in fr.Read besser :
ausblenden Delphi-Quelltext
1:
fr.Read(pBuf[0], dwBufSize);					

Das könnte ein möglicher Fehler sein.

Und bei CopyMemory das gleiche :
ausblenden Delphi-Quelltext
1:
CopyMemory(pThis, @pBuf[0], dwBufSize);					

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?