We wrote our own copy routine that:
1. Opens (fopen) a 'from' and 'to' file
2. using freads() and fwrites(), copies one file to the other
3. Closes (fclose) both files
Like 'Shell_copy' the hand written copy routine does not function when copying from a USB card to an SD card.
By printing out the 'copied' data we determined that it is the fread() that fails (i.e. it just returns bad data).
More investigation showed that the first fread() always returns good data but each subsequent ones return bad data.