Hmm... not sure why'd it'd just stop truthfully, but here's a couple of things I notice:

Your buffer is an array. It appears you reallocate the buffer [array]. If you're reallocating a buffer, is there a possibility that the pointer to the buffer might change? (Since you're setting it, probably.) If you set buffer to a new value, the calling function will have no knowledge of this!

How does QuickWrite know the size of the buffer it's writing? What do cp() and ReallocOrFree() do?

This confuses me:
Code:
if (cbBytesTotal > cbMaxSize || ((((size_t) -1) - cbReadSize) - 1) < cbBytesTotal)
The first time through, would the second part of that not be:
-1 - 0x4000 - 1 < 0x4000... which is always true?

Finally, indent. Indent, please! It makes reading easier, trust me.

And what's wrong with using gotos? (In that sense) Yes, his code could be rewritten to not use them, but he'd have to free the resources in each error check, would he not? Terribly tedious. Adding other things such as file handles, or allocated memory, would be harder to add.