16 #if ISOSPEC_GOT_MMAN && !ISOSPEC_GOT_SYSTEM_MMAN
24 #ifndef FILE_MAP_EXECUTE
25 #define FILE_MAP_EXECUTE 0x0020
29 static int __map_mman_error(
const DWORD err,
const int deferr)
37 static DWORD __map_mmap_prot_page(
const int prot)
41 if (prot == PROT_NONE)
44 if ((prot & PROT_EXEC) != 0)
46 protect = ((prot & PROT_WRITE) != 0) ?
47 PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
51 protect = ((prot & PROT_WRITE) != 0) ?
52 PAGE_READWRITE : PAGE_READONLY;
58 static DWORD __map_mmap_prot_file(
const int prot)
60 DWORD desiredAccess = 0;
62 if (prot == PROT_NONE)
65 if ((prot & PROT_READ) != 0)
66 desiredAccess |= FILE_MAP_READ;
67 if ((prot & PROT_WRITE) != 0)
68 desiredAccess |= FILE_MAP_WRITE;
69 if ((prot & PROT_EXEC) != 0)
70 desiredAccess |= FILE_MAP_EXECUTE;
75 void* mmap(
void *addr,
size_t len,
int prot,
int flags,
int fildes, OffsetType off)
79 void * map = MAP_FAILED;
83 #pragma warning(disable: 4293)
86 const DWORD dwFileOffsetLow = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
87 (DWORD)off : (DWORD)(off & 0xFFFFFFFFL);
88 const DWORD dwFileOffsetHigh = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
89 (DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFFL);
90 const DWORD protect = __map_mmap_prot_page(prot);
91 const DWORD desiredAccess = __map_mmap_prot_file(prot);
93 const OffsetType maxSize = off + (OffsetType)len;
95 const DWORD dwMaxSizeLow = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
96 (DWORD)maxSize : (DWORD)(maxSize & 0xFFFFFFFFL);
97 const DWORD dwMaxSizeHigh = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
98 (DWORD)0 : (DWORD)((maxSize >> 32) & 0xFFFFFFFFL);
108 || (flags & MAP_FIXED) != 0
110 || prot == PROT_EXEC)
116 h = ((flags & MAP_ANONYMOUS) == 0) ?
117 (HANDLE)_get_osfhandle(fildes) : INVALID_HANDLE_VALUE;
119 if ((flags & MAP_ANONYMOUS) == 0 && h == INVALID_HANDLE_VALUE)
125 fm = CreateFileMapping(h, NULL, protect, dwMaxSizeHigh, dwMaxSizeLow, NULL);
129 errno = __map_mman_error(GetLastError(), EPERM);
133 map = MapViewOfFile(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len);
139 errno = __map_mman_error(GetLastError(), EPERM);
146 int munmap(
void *addr,
size_t len)
148 if (UnmapViewOfFile(addr))
151 errno = __map_mman_error(GetLastError(), EPERM);
156 int _mprotect(
void *addr,
size_t len,
int prot)
158 DWORD newProtect = __map_mmap_prot_page(prot);
159 DWORD oldProtect = 0;
161 if (VirtualProtect(addr, len, newProtect, &oldProtect))
164 errno = __map_mman_error(GetLastError(), EPERM);
169 int msync(
void *addr,
size_t len,
int flags)
171 if (FlushViewOfFile(addr, len))
174 errno = __map_mman_error(GetLastError(), EPERM);
179 int mlock(
const void *addr,
size_t len)
181 if (VirtualLock((LPVOID)addr, len))
184 errno = __map_mman_error(GetLastError(), EPERM);
189 int munlock(
const void *addr,
size_t len)
191 if (VirtualUnlock((LPVOID)addr, len))
194 errno = __map_mman_error(GetLastError(), EPERM);