3 #if !defined(WIN32) && defined(UNIX)
5 #elif defined(WIN32) && !defined(UNIX)
8 #define PROT_NONE 0x00 // no access (not supported on Win32)
10 #define PROT_WRITE 0x02
13 #define MAP_SHARED 0x01 // share changes across processes
14 #define MAP_PRIVATE 0x02 // private copy-on-write mapping
15 #define MAP_FIXED 0x04
19 extern void* mmap(
void* start,
size_t len,
int prot,
int flags,
int fd, off_t offset);
20 extern int munmap(
void* start,
size_t len);
24 void* mmap(
void*
const user_start,
const size_t len,
const int prot,
const int flags,
const int fd,
const off_t offset) {
30 HANDLE hFile = INVALID_HANDLE_VALUE;
32 hFile = mk_handle(_get_osfhandle(fd));
33 if(hFile == INVALID_HANDLE_VALUE) {
34 debug_warn(
"mmap: invalid file handle");
41 if(flags & MAP_FIXED) {
50 SECURITY_ATTRIBUTES sec = {
sizeof(SECURITY_ATTRIBUTES), (
void*)0, FALSE };
51 DWORD flProtect = PAGE_READONLY;
52 DWORD dwAccess = FILE_MAP_READ;
58 if(prot & PROT_WRITE) {
59 flProtect = PAGE_READWRITE;
61 const bool shared = (flags & MAP_SHARED ) != 0;
62 const bool priv = (flags & MAP_PRIVATE) != 0;
69 sec.bInheritHandle = TRUE;
70 dwAccess = FILE_MAP_ALL_ACCESS;
75 flProtect = PAGE_WRITECOPY;
76 dwAccess = FILE_MAP_COPY;
81 const DWORD len_hi = (DWORD)((u64)len >> 32);
83 const DWORD len_lo = (DWORD)len & 0xffffffff;
84 const HANDLE hMap = CreateFileMapping(hFile, &sec, flProtect, len_hi, len_lo, (LPCSTR)0);
85 if(hMap == INVALID_HANDLE_VALUE)
88 void* ptr = MapViewOfFileEx(hMap, dwAccess, len_hi, offset, len_lo, start);
93 if(hMap != INVALID_HANDLE_VALUE)
101 assert(!(flags & MAP_FIXED) || (ptr == start));
104 WIN_RESTORE_LAST_ERROR;
113 int munmap(
void*
const start,
const size_t len) {
115 BOOL ok = UnmapViewOfFile(start);