I think I came up with a workable solution, haven't had the chance to test it yet as I'm still cleaning up stuff that exposed the OVERLAPPED structure to the developer:

Code:
PAW_MIN_API pawzd pawfio_writeat( pawfio fio, pawp src, pawzd cap, pawju pos )
{
	if ( cap > 0 )
	{
		pawzu ps = sysconf( _SC_PAGE_SIZE );
		pawju from = PawToLowerMultiple( pos, ps );
		pawzu size = PawToUpperMultiple( cap, ps );
		void *dest = mmap( NULL, size, PROT_WRITE, MAP_SHARED, fio, from );
		if ( !dest ) return -1;
		paw_cpy( dest + (pos - from), src, cap );
		munmap( dest, size );
		return cap;
	}
	return -(cap < 0);
}

PAW_MIN_API pawzd pawfio_fetchat( pawfio fio, void *dst, pawzd cap, pawju pos )
{
	if ( cap > 0 )
	{
		pawzu ps = sysconf( _SC_PAGE_SIZE );
		pawju from = PawToLowerMultiple( pos, ps );
		pawzu size = PawToUpperMultiple( cap, ps );
		void *data = mmap( NULL, size, PROT_READ, MAP_SHARED, fio, from );
		if ( !data ) return -1;
		paw_cpy( dst, data + (pos - from), cap );
		munmap( data, size );
		return cap;
	}
	return -(cap < 0);
}

PAW_MIN_API pawzd	pawfio_write( pawfio fio, pawp src, pawzd cap )
	{ return pawfio_writeat( fio, src, cap, pawfio_tell( fio ) ); }
PAW_MIN_API pawzd	pawfio_fetch( pawfio fio, void *dst, pawzd cap )
	{ return pawfio_fetchat( fio, dst, cap, pawfio_tell( fio ) ); }
Roughly translated to pure linux code (no typedefs etc for cross platform compatability) it looks like this:

Code:
#define PawToLowerDivision( N, BY ) ((BY) ? (N) / (BY) : 0)
#define PawToUpperDivision( N, BY ) ((BY) ? ((N) / (BY)) + !!((N) % (BY)) : 0)
#define PawToLowerMultiple( N, OF ) ((OF) * PawToLowerDivision(N,OF))
#define PawToUpperMultiple( N, OF ) ((OF) * PawToUpperDivision(N,OF))

ssize_t pawfio_writeat( int fd, void const *src, ssize_t cap, uintmax_t pos )
{
	if ( cap > 0 )
	{
		size_t ps = sysconf( _SC_PAGE_SIZE );
		uintmax_t from = PawToLowerMultiple( pos, ps );
		size_t size = PawToUpperMultiple( cap, ps );
		void *dest = mmap( NULL, size, PROT_WRITE, MAP_SHARED, fd, from );
		if ( !dest ) return -1;
		memcpy( dest + (pos - from), src, cap );
		munmap( dest, size );
		return cap;
	}
	return -(cap < 0);
}

ssize_t pawfio_fetchat( int fd, void *dst, ssize_t cap, uintmax_t pos )
{
	if ( cap > 0 )
	{
		size_t ps = sysconf( _SC_PAGE_SIZE );
		uintmax_t from = PawToLowerMultiple( pos, ps );
		size_t size = PawToUpperMultiple( cap, ps );
		void *data = mmap( NULL, size, PROT_READ, MAP_SHARED, fd, from );
		if ( !data ) return -1;
		memcpy( dst, data + (pos - from), cap );
		munmap( data, size );
		return cap;
	}
	return -(cap < 0);
}

ssize_t pawfio_write( int fd, void const *src, ssize_t cap ) { return pawfio_writeat( fd, src, cap, lseek64( fd, 0, SEEK_CUR ) ); }
ssize_t pawfio_fetch( int fd, void *dst, ssize_t cap ) { return pawfio_fetchat( fd, dst, cap, lseek64( fd, 0, SEEK_CUR ) ); }
If someone's inclined please test it out while I continue with fixing up the windows code in other files that doesn't yet compile