From the old days, this is what I remember.
I never used EOF in combination with BlockRead.
BlockRead has an optional parameter that holds the actual bytes read.
You just keep on doing BlockRead (and process the data) until it reports it read less bytes then you requested.
Untested code.
repeat
BlockRead(InFile, Buf, BufLen, BytesRead);
BlockWrite(OutFile, Buf, BytesRead, BytesWritten);
if (BytesWritten<>BytesRead) then
FatalError('Harddisk broken?');
until (BytesRead <> BufLen);
Your BlockRead example will read just one time, because your buffer is exactly the length of the file in bytes and you request to read that amount of bytes?
And yes, it will store the bytes it read into Data[0].
Bart