auf dem Stack wird das abgelegt was statich zur Procedure/Methode/Funktion gehört. Auf dem Heap wird der Speicher abgelegt der mit new, StrAlloc, GetMem etc. angefordert wird. Ein dynamisches Array würd also auch schon Abhilfe schaffen da bei SetLength dynamisch Speicher angefordert wird und nur der Pointer auf dem Stack landet.
derzeit legst du hier:
MemBuffer : array[0..BLOCKSIZE - 1] of Byte;
BLOCKSIZE Bytes auf dem Stack ab beim aufrufen der Funktion.
Bei meinem
BDS steht die MaxStackSize zum beispiel per Default auf 100000 womit es in Konflikt mit deinen 1048544 kommen würde