(Win32) Some Win32 compatibility patches (courtesy of mudlord)

This commit is contained in:
twinaphex 2013-08-13 02:32:10 +02:00 committed by notaz
parent f81107f590
commit e8b6193660

View file

@ -10,7 +10,11 @@
#include <stdio.h> #include <stdio.h>
#include <stdarg.h> #include <stdarg.h>
#include <string.h> #include <string.h>
#ifndef _WIN32
#include <sys/mman.h> #include <sys/mman.h>
#else
#include <windows.h>
#endif
#include <errno.h> #include <errno.h>
#ifdef __MACH__ #ifdef __MACH__
#include <libkern/OSCacheControl.h> #include <libkern/OSCacheControl.h>
@ -66,27 +70,75 @@ void cache_flush_d_inval_i(void *start, void *end)
#endif #endif
} }
#ifdef _WIN32
void* mmap(void *desired_addr,
size_t len,
int mmap_prot,
int mmap_flags,
HANDLE fd,
size_t off)
{
HANDLE fmh;
void *base_addr;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
fmh = CreateFileMapping(fd, &sa, PAGE_WRITECOPY , 0, len, NULL);
if (fmh == NULL){ return NULL; }
base_addr = MapViewOfFileEx(fmh, FILE_MAP_WRITE|FILE_MAP_READ, 0, off, len, desired_addr);
CloseHandle(fmh);
return base_addr;
}
void munmap(
void *base_addr,
size_t len
)
{
UnmapViewOfFile(base_addr);
}
#define MAP_FAILED 0
#define PROT_READ 0
#define PROT_WRITE 0
#define MAP_PRIVATE 0
#define MAP_ANONYMOUS 0
#endif
void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed) void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed)
{ {
int flags = MAP_PRIVATE | MAP_ANONYMOUS; #ifndef _WIN32
void *req, *ret; int flags = 0;
void *ret = mmap((void*)addr,size,PROT_READ | PROT_WRITE, flags, -1, 0);
if (addr != 0 && ret != (void *)addr) {
lprintf("warning: wanted to map @%08lx, got %p\n",
addr, ret);
req = (void *)addr; if (is_fixed) {
ret = mmap(req, size, PROT_READ | PROT_WRITE, flags, -1, 0); munmap(ret, size);
if (ret == MAP_FAILED) { return NULL;
lprintf("mmap(%08lx, %zd) failed: %d\n", addr, size, errno); }
return NULL; }
} #else
int flags = MAP_PRIVATE | MAP_ANONYMOUS;
void *req, *ret;
if (addr != 0 && ret != (void *)addr) { req = (void *)addr;
lprintf("warning: wanted to map @%08lx, got %p\n", ret = mmap(req, size, PROT_READ | PROT_WRITE, flags, -1, 0);
addr, ret); if (ret == MAP_FAILED) {
lprintf("mmap(%08lx, %zd) failed: %d\n", addr, size, errno);
return NULL;
}
if (is_fixed) { if (addr != 0 && ret != (void *)addr) {
munmap(ret, size); lprintf("warning: wanted to map @%08lx, got %p\n",
return NULL; addr, ret);
}
} if (is_fixed) {
munmap(ret, size);
return NULL;
}
}
#endif
return ret; return ret;
} }
@ -132,10 +184,15 @@ void plat_munmap(void *ptr, size_t size)
int plat_mem_set_exec(void *ptr, size_t size) int plat_mem_set_exec(void *ptr, size_t size)
{ {
int ret = mprotect(ptr, size, PROT_READ | PROT_WRITE | PROT_EXEC); #ifdef _WIN32
if (ret != 0) int ret = VirtualProtect(ptr,size,PAGE_EXECUTE_READWRITE,0);
lprintf("mprotect(%p, %zd) failed: %d\n", ptr, size, errno); if (ret == 0)
lprintf("mprotect(%p, %zd) failed: %d\n", ptr, size, 0);
#else
int ret = mprotect(ptr, size, PROT_READ | PROT_WRITE | PROT_EXEC);
if (ret != 0)
lprintf("mprotect(%p, %zd) failed: %d\n", ptr, size, errno);
#endif
return ret; return ret;
} }