16#if ISOSPEC_GOT_MMAN && !ISOSPEC_GOT_SYSTEM_MMAN
25#ifndef FILE_MAP_EXECUTE
26#define FILE_MAP_EXECUTE 0x0020
30static int __map_mman_error(
const DWORD err,
const int )
38static DWORD __map_mmap_prot_page(
const int prot)
42 if (prot == PROT_NONE)
45 if ((prot & PROT_EXEC) != 0)
47 protect = ((prot & PROT_WRITE) != 0) ?
48 PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
52 protect = ((prot & PROT_WRITE) != 0) ?
53 PAGE_READWRITE : PAGE_READONLY;
59static DWORD __map_mmap_prot_file(
const int prot)
61 DWORD desiredAccess = 0;
63 if (prot == PROT_NONE)
66 if ((prot & PROT_READ) != 0)
67 desiredAccess |= FILE_MAP_READ;
68 if ((prot & PROT_WRITE) != 0)
69 desiredAccess |= FILE_MAP_WRITE;
70 if ((prot & PROT_EXEC) != 0)
71 desiredAccess |= FILE_MAP_EXECUTE;
76void* mmap(
void * ,
size_t len,
int prot,
int flags,
int fildes, OffsetType off)
80 void * map = MAP_FAILED;
84#pragma warning(disable: 4293)
87 const DWORD dwFileOffsetLow = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
88 (DWORD)off : (DWORD)(off & 0xFFFFFFFFL);
89 const DWORD dwFileOffsetHigh = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
90 (DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFFL);
91 const DWORD protect = __map_mmap_prot_page(prot);
92 const DWORD desiredAccess = __map_mmap_prot_file(prot);
94 const OffsetType maxSize = off + (OffsetType)len;
96 const DWORD dwMaxSizeLow = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
97 (DWORD)maxSize : (DWORD)(maxSize & 0xFFFFFFFFL);
98 const DWORD dwMaxSizeHigh = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
99 (DWORD)0 : (DWORD)((maxSize >> 32) & 0xFFFFFFFFL);
109 || (flags & MAP_FIXED) != 0
111 || prot == PROT_EXEC)
117 h = ((flags & MAP_ANONYMOUS) == 0) ?
118 (HANDLE)_get_osfhandle(fildes) : INVALID_HANDLE_VALUE;
120 if ((flags & MAP_ANONYMOUS) == 0 && h == INVALID_HANDLE_VALUE)
126 fm = CreateFileMapping(h, NULL, protect, dwMaxSizeHigh, dwMaxSizeLow, NULL);
130 errno = __map_mman_error(GetLastError(), EPERM);
134 map = MapViewOfFile(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len);
140 errno = __map_mman_error(GetLastError(), EPERM);
147int munmap(
void *addr,
size_t )
149 if (UnmapViewOfFile(addr))
152 errno = __map_mman_error(GetLastError(), EPERM);
161int _mprotect(
void *addr,
size_t len,
int prot)
163 DWORD newProtect = __map_mmap_prot_page(prot);
164 DWORD oldProtect = 0;
166 if (VirtualProtect(addr, len, newProtect, &oldProtect))
169 errno = __map_mman_error(GetLastError(), EPERM);
174int msync(
void *addr,
size_t len,
int )
176 if (FlushViewOfFile(addr, len))
179 errno = __map_mman_error(GetLastError(), EPERM);
184int mlock(
const void *addr,
size_t len)
186 if (VirtualLock((LPVOID)addr, len))
189 errno = __map_mman_error(GetLastError(), EPERM);
194int munlock(
const void *addr,
size_t len)
196 if (VirtualUnlock((LPVOID)addr, len))
199 errno = __map_mman_error(GetLastError(), EPERM);