fstr ist der string mit dem inhalt der EXE...
Soweit wahrscheinlich die Theorie. Eingelesen wird der Inhalt der Exe nach
buffer. Wie er magischer Weise nach fstr kommen soll, kann man Deinem Code nicht entnehmen.
Vermutung: fstr ist global, also zu Beginn = '', also length(fstr)=0. Und das ändert sich auch nicht.
Frage: Was zeigt denn
ShowMessage('Geschrieben Bytes: '+IntToStr(cntWritten))?
Nur wenn da was anderes als 0 käme, wäre es verwunderlich, wenn die neue Datei eine Länge von 0 hätte.