Hallo!
Ich habe mit folgendem Programm Probleme:
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'); 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
Christian S.: Code- durch Delphi-Tags ersetzt
---
Moderiert von
Narses: 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).