13 #if ISOSPEC_GOT_MMAN && !ISOSPEC_GOT_SYSTEM_MMAN
21 #ifndef FILE_MAP_EXECUTE
22 #define FILE_MAP_EXECUTE 0x0020
26 static int __map_mman_error(
const DWORD err,
const int deferr)
34 static DWORD __map_mmap_prot_page(
const int prot)
38 if (prot == PROT_NONE)
41 if ((prot & PROT_EXEC) != 0)
43 protect = ((prot & PROT_WRITE) != 0) ?
44 PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
48 protect = ((prot & PROT_WRITE) != 0) ?
49 PAGE_READWRITE : PAGE_READONLY;
55 static DWORD __map_mmap_prot_file(
const int prot)
57 DWORD desiredAccess = 0;
59 if (prot == PROT_NONE)
62 if ((prot & PROT_READ) != 0)
63 desiredAccess |= FILE_MAP_READ;
64 if ((prot & PROT_WRITE) != 0)
65 desiredAccess |= FILE_MAP_WRITE;
66 if ((prot & PROT_EXEC) != 0)
67 desiredAccess |= FILE_MAP_EXECUTE;
72 void* mmap(
void *addr,
size_t len,
int prot,
int flags,
int fildes, OffsetType off)
76 void * map = MAP_FAILED;
80 #pragma warning(disable: 4293)
83 const DWORD dwFileOffsetLow = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
84 (DWORD)off : (DWORD)(off & 0xFFFFFFFFL);
85 const DWORD dwFileOffsetHigh = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
86 (DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFFL);
87 const DWORD protect = __map_mmap_prot_page(prot);
88 const DWORD desiredAccess = __map_mmap_prot_file(prot);
90 const OffsetType maxSize = off + (OffsetType)len;
92 const DWORD dwMaxSizeLow = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
93 (DWORD)maxSize : (DWORD)(maxSize & 0xFFFFFFFFL);
94 const DWORD dwMaxSizeHigh = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
95 (DWORD)0 : (DWORD)((maxSize >> 32) & 0xFFFFFFFFL);
105 || (flags & MAP_FIXED) != 0
107 || prot == PROT_EXEC)
113 h = ((flags & MAP_ANONYMOUS) == 0) ?
114 (HANDLE)_get_osfhandle(fildes) : INVALID_HANDLE_VALUE;
116 if ((flags & MAP_ANONYMOUS) == 0 && h == INVALID_HANDLE_VALUE)
122 fm = CreateFileMapping(h, NULL, protect, dwMaxSizeHigh, dwMaxSizeLow, NULL);
126 errno = __map_mman_error(GetLastError(), EPERM);
130 map = MapViewOfFile(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len);
136 errno = __map_mman_error(GetLastError(), EPERM);
143 int munmap(
void *addr,
size_t len)
145 if (UnmapViewOfFile(addr))
148 errno = __map_mman_error(GetLastError(), EPERM);
153 int _mprotect(
void *addr,
size_t len,
int prot)
155 DWORD newProtect = __map_mmap_prot_page(prot);
156 DWORD oldProtect = 0;
158 if (VirtualProtect(addr, len, newProtect, &oldProtect))
161 errno = __map_mman_error(GetLastError(), EPERM);
166 int msync(
void *addr,
size_t len,
int flags)
168 if (FlushViewOfFile(addr, len))
171 errno = __map_mman_error(GetLastError(), EPERM);
176 int mlock(
const void *addr,
size_t len)
178 if (VirtualLock((LPVOID)addr, len))
181 errno = __map_mman_error(GetLastError(), EPERM);
186 int munlock(
const void *addr,
size_t len)
188 if (VirtualUnlock((LPVOID)addr, len))
191 errno = __map_mman_error(GetLastError(), EPERM);