If the function succeeds, the return value is the low-order doubleword of the file size, and, if lpFileSizeHigh is non-NULL, the function puts the high-order doubleword of the file size into the variable pointed to by that parameter.
So I don't understand what the difference between the low-order and high-order doubleword is. Or better yet, what does high-order/low-order mean?
Don't waste your time using GetFileSize(), always use GetFileSizeEx().
If you insist on using GetFileSize() and the file is small enough, use it like this: DWORD lFileSize=GetFileSize(hFile,NULL); //Small files... no need to check upper 32