void FArchiveFileReaderWindows::Serialize( void* V, INT Length )
{
	while( Length>0 )
	{
		INT Copy = Min( Length, BufferBase+BufferCount-Pos );
		if( Copy<=0 )
		{
			if( Length >= ARRAY_COUNT(Buffer) )
			{
				INT Count=0;
				// Read data from device via Win32 ReadFile API.
				{
					SCOPED_FILE_IO_READ_STATS( StatsHandle, Length, Pos );
					ReadFile( Handle, V, Length, (DWORD*)&Count, NULL );
				}
				if( Count!=Length )
				{
					ArIsError = 1;
					Error->Logf( TEXT("ReadFile failed: Count=%i Length=%i Error=%s for file %s"), 
						Count, Length, appGetSystemErrorMessage(), *Filename );
				}
				Pos += Length;
				BufferBase += Length;
				return;
			}
			InternalPrecache( Pos, MAXINT );
			Copy = Min( Length, BufferBase+BufferCount-Pos );
			if( Copy<=0 )
			{
				ArIsError = 1;
				Error->Logf( TEXT("ReadFile beyond EOF %i+%i/%i for file %s"), 
					Pos, Length, Size, *Filename );
			}
			if( ArIsError )
			{
				return;
			}
		}
		appMemcpy( V, Buffer+Pos-BufferBase, Copy );
		Pos       += Copy;
		Length    -= Copy;
		V          = (BYTE*)V + Copy;
	}
}
void FArchiveFileReaderGeneric::Serialize( void* V, int64 Length )
{
	while( Length>0 )
	{
		int64 Copy = FMath::Min( Length, BufferBase+BufferCount-Pos );
		if( Copy<=0 )
		{
			if( Length >= ARRAY_COUNT( Buffer ) )
			{
				int64 Count=0;
				{
					ReadLowLevel(( uint8* )V, Length, Count );
				}
				if( Count!=Length )
				{
					TCHAR ErrorBuffer[1024];
					ArIsError = true;
					UE_LOG( LogFileManager, Warning, TEXT( "ReadFile failed: Count=%lld Length=%lld Error=%s for file %s" ), 
						Count, Length, FPlatformMisc::GetSystemErrorMessage( ErrorBuffer, 1024, 0 ), *Filename );
				}
				Pos += Length;
				return;
			}
			InternalPrecache( Pos, MAX_int32 );
			Copy = FMath::Min( Length, BufferBase+BufferCount-Pos );
			if( Copy<=0 )
			{
				ArIsError = true;
				UE_LOG( LogFileManager, Error, TEXT( "ReadFile beyond EOF %lld+%lld/%lld for file %s" ), 
					Pos, Length, Size, *Filename );
			}
			if( ArIsError )
			{
				return;
			}
		}
		FMemory::Memcpy( V, Buffer+Pos-BufferBase, Copy );
		Pos       += Copy;
		Length    -= Copy;
		V          =( uint8* )V + Copy;
	}
}