win32mmap.c
1 #include "common.h" 2 #include <windows.h> 3 4 static inline size_t xsize_t(off_t len) 5 { 6 if (len > (size_t) len) 7 die("Cannot handle files this big"); 8 return (size_t)len; 9 } 10 11 void *win32_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) 12 { 13 HANDLE hmap; 14 void *temp; 15 off_t len; 16 struct stat st; 17 uint64_t o = offset; 18 uint32_t l = o & 0xFFFFFFFF; 19 uint32_t h = (o >> 32) & 0xFFFFFFFF; 20 21 if (!fstat(fd, &st)) 22 len = st.st_size; 23 else 24 printf("mmap: could not determine filesize"); 25 26 if ((length + offset) > len) 27 length = xsize_t(len - offset); 28 29 if (!(flags & MAP_PRIVATE)) 30 printf("Invalid usage of mmap when built with USE_WIN32_MMAP"); 31 32 hmap = CreateFileMapping((HANDLE)_get_osfhandle(fd), 0, PAGE_WRITECOPY, 33 0, 0, 0); 34 35 if (!hmap) 36 return MAP_FAILED; 37 38 temp = MapViewOfFileEx(hmap, FILE_MAP_COPY, h, l, length, start); 39 40 if (!CloseHandle(hmap)) 41 printf("unable to close file mapping handle"); 42 43 return temp ? temp : MAP_FAILED; 44 } 45 46 int win32_munmap(void *start, size_t length) 47 { 48 return !UnmapViewOfFile(start); 49 }