If you need file pointers and such, just use _UNSIGNED _OFFSETs or _INTEGER64. Then you have access to 2 ^ 64 bytes. Why limit yourself to 32-bits when you can easily work with 64?
As for the 2^32 file size, you can just use an _UNSIGNED LONG to hold values that large.