Allow Windows to read/write more than 4 gigs to a file in one shot.
Removes a FIXME, but the fix probably won't ever get used. :)
This commit is contained in:
parent
53fe6d360a
commit
66fbf41bc0
|
@ -638,34 +638,52 @@ void *__PHYSFS_platformOpenAppend(const char *filename)
|
|||
} /* __PHYSFS_platformOpenAppend */
|
||||
|
||||
|
||||
/* !!! FIXME: this function fails if len > 0xFFFFFFFF. */
|
||||
PHYSFS_sint64 __PHYSFS_platformRead(void *opaque, void *buf, PHYSFS_uint64 len)
|
||||
{
|
||||
HANDLE Handle = ((WinApiFile *) opaque)->handle;
|
||||
DWORD CountOfBytesRead = 0;
|
||||
PHYSFS_sint64 totalRead = 0;
|
||||
|
||||
if (!__PHYSFS_ui64FitsAddressSpace(len))
|
||||
BAIL_MACRO(PHYSFS_ERR_INVALID_ARGUMENT, -1);
|
||||
else if(!ReadFile(Handle, buf, (DWORD) len, &CountOfBytesRead, NULL))
|
||||
BAIL_MACRO(errcodeFromWinApi(), -1);
|
||||
|
||||
return (PHYSFS_sint64) CountOfBytesRead;
|
||||
while (len > 0)
|
||||
{
|
||||
const DWORD thislen = (len > 0xFFFFFFFF) ? 0xFFFFFFFF : (DWORD) len;
|
||||
DWORD numRead = 0;
|
||||
if (!ReadFile(Handle, buf, thislen, &numRead, NULL))
|
||||
BAIL_MACRO(errcodeFromWinApi(), -1);
|
||||
len -= (PHYSFS_uint64) numRead;
|
||||
totalRead += (PHYSFS_sint64) numRead;
|
||||
if (numRead != thislen)
|
||||
break;
|
||||
} /* while */
|
||||
|
||||
return totalRead;
|
||||
} /* __PHYSFS_platformRead */
|
||||
|
||||
|
||||
/* !!! FIXME: this function fails if len > 0xFFFFFFFF. */
|
||||
PHYSFS_sint64 __PHYSFS_platformWrite(void *opaque, const void *buffer,
|
||||
PHYSFS_uint64 len)
|
||||
{
|
||||
HANDLE Handle = ((WinApiFile *) opaque)->handle;
|
||||
DWORD CountOfBytesWritten = 0;
|
||||
PHYSFS_sint64 totalWritten = 0;
|
||||
|
||||
if (!__PHYSFS_ui64FitsAddressSpace(len))
|
||||
BAIL_MACRO(PHYSFS_ERR_INVALID_ARGUMENT, -1);
|
||||
else if(!WriteFile(Handle, buffer, (DWORD) len, &CountOfBytesWritten, NULL))
|
||||
BAIL_MACRO(errcodeFromWinApi(), -1);
|
||||
|
||||
return (PHYSFS_sint64) CountOfBytesWritten;
|
||||
while (len > 0)
|
||||
{
|
||||
const DWORD thislen = (len > 0xFFFFFFFF) ? 0xFFFFFFFF : (DWORD) len;
|
||||
DWORD numWritten = 0;
|
||||
if (!WriteFile(Handle, buffer, thislen, &numWritten, NULL))
|
||||
BAIL_MACRO(errcodeFromWinApi(), -1);
|
||||
len -= (PHYSFS_uint64) numWritten;
|
||||
totalWritten += (PHYSFS_sint64) numWritten;
|
||||
if (numWritten != thislen)
|
||||
break;
|
||||
} /* while */
|
||||
|
||||
return totalWritten;
|
||||
} /* __PHYSFS_platformWrite */
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue