diff options
Diffstat (limited to 'src/tools')
| -rw-r--r-- | src/tools/wine_tools.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/tools/wine_tools.c b/src/tools/wine_tools.c index 0933325f..1716823b 100644 --- a/src/tools/wine_tools.c +++ b/src/tools/wine_tools.c @@ -69,13 +69,16 @@ void wine_prereserve(const char* reserve) int idx = 0; while(my_wine_reserve[idx].addr && my_wine_reserve[idx].size) { - if(!isBlockFree(my_wine_reserve[idx].addr, my_wine_reserve[idx].size)) { + void* ret = NULL; + if(!isBlockFree(my_wine_reserve[idx].addr, my_wine_reserve[idx].size) && ((ret=mmap(my_wine_reserve[idx].addr, my_wine_reserve[idx].size, 0, MAP_ANONYMOUS|MAP_NORESERVE, -1, 0))==my_wine_reserve[idx].addr)) { printf_log(LOG_NONE, "Warning, prereserve of %p:0x%lx is not free\n", my_wine_reserve[idx].addr, my_wine_reserve[idx].size); + if(ret) + munmap(ret, my_wine_reserve[idx].size); my_wine_reserve[idx].addr = NULL; my_wine_reserve[idx].size = 0; } else { setProtection_mmap((uintptr_t)my_wine_reserve[idx].addr, my_wine_reserve[idx].size, 0); - printf_log(LOG_DEBUG, "WINE prereserve of %p:0x%lx done\n", my_wine_reserve[idx].addr, my_wine_reserve[idx].size); + printf_log(/*LOG_DEBUG*/LOG_INFO, "WINE prereserve of %p:0x%lx done\n", my_wine_reserve[idx].addr, my_wine_reserve[idx].size); ++idx; } } @@ -90,6 +93,20 @@ void* get_wine_prereserve() return (void*)my_wine_reserve; } +extern int box64_quit; +int isAddrInPrereserve(uintptr_t addr) +{ + if(!wine_preloaded || box64_quit) + return 0; + int idx = 0; + while(my_wine_reserve[idx].addr && my_wine_reserve[idx].size) { + if(addr>=(uintptr_t)my_wine_reserve[idx].addr && addr<((uintptr_t)my_wine_reserve[idx].addr+my_wine_reserve[idx].size)) + return 1; + ++idx; + } + return 0; +} + #ifdef DYNAREC void dynarec_wine_prereserve() { |