I don't have definitive answers to your questions, but I have some ideas: 1) The major difference between static arrays and dynamic arrays is that static arrays are normal variables, whereas dynamic arrays are pointers. I guess what might be happening is that when you pass your dynamic array to the BlockWrite procedure as an untyped var, it is the memory data for the POINTER (and the stuff from there onwards) that is being written to the disk. You want to write the stuff that the pointer is pointing to be written to disk, so you have to dereference that pointer somehow and pass that data to the BlockWrite procedure.
2) I have a suspicion that the optimal buffer to write to disk depends on many factors. Common sense tends to tell me that a buffer size similar to the hard disk's sector size would be faster to write than arbitrary sizes. Is this true though, given hard disk caching, etc? I don't know. Ultimately, will the gain in speed from writing in optimally sized chunks be noticeable to the user? I don't know. I suggest you play around and perhaps you can let us know what you find?

