Du darfst nicht einfach immer sizeof(b) Bytes lesen, sondern die Anzahl der zu lesenden Bytes vorher ausrechnen.
Delphi-Quellcode:
var
bsize : integer; // evtl. Int64 je nach Delphi Version
...
bsize := ms.Size-ms.Position;
if bsize > sizeof(b) then
bsize := sizeof(b);
while bsize > 0 do
ms.ReadBuffer(b, bsize);
.....