13 #if ISOSPEC_GOT_MMAN && !ISOSPEC_GOT_SYSTEM_MMAN
21 #ifndef FILE_MAP_EXECUTE
22 #define FILE_MAP_EXECUTE 0x0020
25 static int __map_mman_error(
const DWORD err,
const int deferr)
33 static DWORD __map_mmap_prot_page(
const int prot)
37 if (prot == PROT_NONE)
40 if ((prot & PROT_EXEC) != 0)
42 protect = ((prot & PROT_WRITE) != 0) ?
43 PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
47 protect = ((prot & PROT_WRITE) != 0) ?
48 PAGE_READWRITE : PAGE_READONLY;
54 static DWORD __map_mmap_prot_file(
const int prot)
56 DWORD desiredAccess = 0;
58 if (prot == PROT_NONE)
61 if ((prot & PROT_READ) != 0)
62 desiredAccess |= FILE_MAP_READ;
63 if ((prot & PROT_WRITE) != 0)
64 desiredAccess |= FILE_MAP_WRITE;
65 if ((prot & PROT_EXEC) != 0)
66 desiredAccess |= FILE_MAP_EXECUTE;
71 void* mmap(
void *addr,
size_t len,
int prot,
int flags,
int fildes, OffsetType off)
75 void * map = MAP_FAILED;
79 #pragma warning(disable: 4293)
82 const DWORD dwFileOffsetLow = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
83 (DWORD)off : (DWORD)(off & 0xFFFFFFFFL);
84 const DWORD dwFileOffsetHigh = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
85 (DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFFL);
86 const DWORD protect = __map_mmap_prot_page(prot);
87 const DWORD desiredAccess = __map_mmap_prot_file(prot);
89 const OffsetType maxSize = off + (OffsetType)len;
91 const DWORD dwMaxSizeLow = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
92 (DWORD)maxSize : (DWORD)(maxSize & 0xFFFFFFFFL);
93 const DWORD dwMaxSizeHigh = (
sizeof(OffsetType) <=
sizeof(DWORD)) ?
94 (DWORD)0 : (DWORD)((maxSize >> 32) & 0xFFFFFFFFL);
104 || (flags & MAP_FIXED) != 0
106 || prot == PROT_EXEC)
112 h = ((flags & MAP_ANONYMOUS) == 0) ?
113 (HANDLE)_get_osfhandle(fildes) : INVALID_HANDLE_VALUE;
115 if ((flags & MAP_ANONYMOUS) == 0 && h == INVALID_HANDLE_VALUE)
121 fm = CreateFileMapping(h, NULL, protect, dwMaxSizeHigh, dwMaxSizeLow, NULL);
125 errno = __map_mman_error(GetLastError(), EPERM);
129 map = MapViewOfFile(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len);
135 errno = __map_mman_error(GetLastError(), EPERM);
142 int munmap(
void *addr,
size_t len)
144 if (UnmapViewOfFile(addr))
147 errno = __map_mman_error(GetLastError(), EPERM);
152 int _mprotect(
void *addr,
size_t len,
int prot)
154 DWORD newProtect = __map_mmap_prot_page(prot);
155 DWORD oldProtect = 0;
157 if (VirtualProtect(addr, len, newProtect, &oldProtect))
160 errno = __map_mman_error(GetLastError(), EPERM);
165 int msync(
void *addr,
size_t len,
int flags)
167 if (FlushViewOfFile(addr, len))
170 errno = __map_mman_error(GetLastError(), EPERM);
175 int mlock(
const void *addr,
size_t len)
177 if (VirtualLock((LPVOID)addr, len))
180 errno = __map_mman_error(GetLastError(), EPERM);
185 int munlock(
const void *addr,
size_t len)
187 if (VirtualUnlock((LPVOID)addr, len))
190 errno = __map_mman_error(GetLastError(), EPERM);