First of all, there is nothing wrong with SetFilePointer as it uses 64-bit file pointers; the problem is in _llseek which interprets its 32-bit filepointer as signed irregardless of the desired seek (from the beginning, from the current position, or from the end), and thus attempts to move the file pointer past the beginning of the file even when the desired seek is from the beginning (in which case a negative offset would be nonsensical). In the unfixed version of _llseek, SetFilePointer gets passed the sign-extended file pointer, causing *it* to attempt to seek past the beginning of the file. I have fixed this by forcing it to zero-extend the file pointer to 64 bits (thus keeping its sign positive) *only* when a seek from the beginning is specified. Otherwise the file pointer is signed and can be moved within the file as usual.Anonymous seems to have fixed shell32.dll to use SetFilePointer instead, although this still leaves _llseek flawed. SetFilePointer doesn't need any changes. That second paragraph regarding pre-enlargement was just a discussion of the benefits/disadvantages of implementing Copy2Gb by omitting pre-enlargement altogether (and thus avoiding the use of the flawed _llseek).