Skip to content

Commit

Permalink
Allow Windows to read/write more than 4 gigs to a file in one shot.
Browse files Browse the repository at this point in the history
Removes a FIXME, but the fix probably won't ever get used.  :)
  • Loading branch information
icculus committed Mar 22, 2012
1 parent 53fe6d3 commit 66fbf41
Showing 1 changed file with 28 additions and 10 deletions.
38 changes: 28 additions & 10 deletions src/platform_windows.c
Expand Up @@ -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 */


Expand Down

0 comments on commit 66fbf41

Please sign in to comment.