about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-10-07 17:17:55 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-10-07 17:17:55 +0200
commitf073415510929646b7e2d5e254c4932b46b40233 (patch)
tree4adb71907705a9b6335de19ae05e1e177c31e6ca /src
parent4c69bcd97aff691b464f01ebed057cfcb912612b (diff)
downloadbox64-f073415510929646b7e2d5e254c4932b46b40233.tar.gz
box64-f073415510929646b7e2d5e254c4932b46b40233.zip
[BOX32] More work on 32bits wrapped functions
Diffstat (limited to 'src')
-rw-r--r--src/core.c33
-rw-r--r--src/emu/x64emu.c6
-rwxr-xr-xsrc/emu/x86int3.c3
-rw-r--r--src/emu/x86syscall_32.c6
-rw-r--r--src/libtools/my_x11_defs.h7
-rw-r--r--src/libtools/my_x11_defs_32.h7
-rwxr-xr-xsrc/libtools/myalign32.c16
-rw-r--r--src/libtools/threads.c2
-rwxr-xr-xsrc/libtools/threads32.c22
-rw-r--r--src/wrapped32/generated/functions_list.txt11
-rw-r--r--src/wrapped32/generated/wrappedlibx11types32.h5
-rw-r--r--src/wrapped32/generated/wrappedlibxcursortypes32.h6
-rw-r--r--src/wrapped32/generated/wrapper32.c4
-rw-r--r--src/wrapped32/generated/wrapper32.h2
-rwxr-xr-xsrc/wrapped32/wrappedlibc.c238
-rwxr-xr-xsrc/wrapped32/wrappedlibc_private.h16
-rw-r--r--src/wrapped32/wrappedlibx11.c23
-rw-r--r--src/wrapped32/wrappedlibx11_private.h4
-rw-r--r--src/wrapped32/wrappedlibxcursor.c52
-rw-r--r--src/wrapped32/wrappedlibxcursor_private.h4
20 files changed, 169 insertions, 298 deletions
diff --git a/src/core.c b/src/core.c
index a07b1aff..58acfd30 100644
--- a/src/core.c
+++ b/src/core.c
@@ -2388,6 +2388,22 @@ int initialize(int argc, const char **argv, char** env, x64emu_t** emulator, elf
 
     // export symbols
     AddSymbols(my_context->maplib, elf_header);
+    if(wine_preloaded) {
+        uintptr_t wineinfo = 0;
+        int ver = -1, veropt = 0;
+        const char* vername = NULL;
+        if(!ElfGetGlobalSymbolStartEnd(elf_header, &wineinfo, NULL, "wine_main_preload_info", &ver, &vername, 1, &veropt))
+            if(!ElfGetWeakSymbolStartEnd(elf_header, &wineinfo, NULL, "wine_main_preload_info", &ver, &vername, 1, &veropt))
+                ElfGetLocalSymbolStartEnd(elf_header, &wineinfo, NULL, "wine_main_preload_info", &ver, &vername, 1, &veropt);
+        if(!wineinfo) {printf_log(LOG_NONE, "Warning, Symbol wine_main_preload_info not found\n");}
+        else {
+            *(void**)wineinfo = get_wine_prereserve();
+            printf_log(LOG_DEBUG, "WINE wine_main_preload_info found and updated %p -> %p\n", get_wine_prereserve(), *(void**)wineinfo);
+        }
+        #ifdef DYNAREC
+        dynarec_wine_prereserve();
+        #endif
+    }
     AddMainElfToLinkmap(elf_header);
     // pre-load lib if needed
     if(ld_preload.size) {
@@ -2421,23 +2437,6 @@ int initialize(int argc, const char **argv, char** env, x64emu_t** emulator, elf
     }
     // and handle PLT
     RelocateElfPlt(my_context->maplib, NULL, 0, 0, elf_header);
-    // wine preload special case
-    if(wine_preloaded) {
-        uintptr_t wineinfo = 0;
-        int ver = -1, veropt = 0;
-        const char* vername = NULL;
-        if(!ElfGetGlobalSymbolStartEnd(elf_header, &wineinfo, NULL, "wine_main_preload_info", &ver, &vername, 1, &veropt))
-            if(!ElfGetWeakSymbolStartEnd(elf_header, &wineinfo, NULL, "wine_main_preload_info", &ver, &vername, 1, &veropt))
-                ElfGetLocalSymbolStartEnd(elf_header, &wineinfo, NULL, "wine_main_preload_info", &ver, &vername, 1, &veropt);
-        if(!wineinfo) {printf_log(LOG_NONE, "Warning, Symbol wine_main_preload_info not found\n");}
-        else {
-            printf_log(LOG_INFO, "WINE wine_main_preload_info found and updated %p -> %p\n", (void**)wineinfo, get_wine_prereserve());
-            *(void**)wineinfo = get_wine_prereserve();
-        }
-        #ifdef DYNAREC
-        dynarec_wine_prereserve();
-        #endif
-    }
     // deferred init
     setupTraceInit();
     RunDeferredElfInit(emu);
diff --git a/src/emu/x64emu.c b/src/emu/x64emu.c
index fbb15e7b..e6487d5d 100644
--- a/src/emu/x64emu.c
+++ b/src/emu/x64emu.c
@@ -202,10 +202,8 @@ void CallAllCleanup(x64emu_t *emu)
 
 static void internalFreeX64(x64emu_t* emu)
 {
-    if(emu && emu->stack2free) {
-        if(!internal_munmap(emu->stack2free, emu->size_stack))
-            freeProtection((uintptr_t)emu->stack2free, emu->size_stack);
-    }
+    if(emu && emu->stack2free)
+        !munmap(emu->stack2free, emu->size_stack);
 }
 
 EXPORTDYN
diff --git a/src/emu/x86int3.c b/src/emu/x86int3.c
index f2055f1d..66c362f4 100755
--- a/src/emu/x86int3.c
+++ b/src/emu/x86int3.c
@@ -370,6 +370,9 @@ void x86Int3(x64emu_t* emu, uintptr_t* addr)
                 } else  if(!strcmp(s, "syscall")) {
                     snprintf(buff, 255, "%04d|%p: Calling %s(%d, %p, %p, %p...)", tid, from_ptrv(*(ptr_t*)from_ptr(R_ESP)), (char *)s, *(int32_t*)from_ptr(R_ESP+4), from_ptrv(*(ptr_t*)from_ptr(R_ESP+8)), from_ptrv(*(ptr_t*)from_ptr(R_ESP+12)), from_ptrv(*(ptr_t*)from_ptr(R_ESP+16)));
                     perr = 1;
+                } else  if(!strcmp(s, "snd_device_name_get_hint")) {
+                    snprintf(buff, 255, "%04d|%p: Calling %s(%p, \"%s\")", tid, from_ptrv(*(ptr_t*)from_ptr(R_ESP)), (char *)s, from_ptrv(from_ptri(ptr_t, R_ESP+4)), from_ptrv(from_ptri(ptr_t, R_ESP+8)));
+                    post = 2;
                 } else {
                     snprintf(buff, 255, "%04d|%p: Calling %s (%08X, %08X, %08X...)", tid, from_ptrv(*(ptr_t*)from_ptr(R_ESP)), (char *)s, *(uint32_t*)from_ptr(R_ESP+4), *(uint32_t*)from_ptr(R_ESP+8), *(uint32_t*)from_ptr(R_ESP+12));
                 }
diff --git a/src/emu/x86syscall_32.c b/src/emu/x86syscall_32.c
index 7b2c25d0..f34aa94a 100644
--- a/src/emu/x86syscall_32.c
+++ b/src/emu/x86syscall_32.c
@@ -246,7 +246,7 @@ struct i386_robust_list_head {
 
 typedef struct i386_stack_s i386_stack_t;
 
-int32_t my32_open(x64emu_t* emu, void* pathname, int32_t flags, uint32_t mode);
+int32_t my_open(x64emu_t* emu, void* pathname, int32_t flags, uint32_t mode);
 int32_t my32_execve(x64emu_t* emu, const char* path, char* const argv[], char* const envp[]);
 ssize_t my32_read(int fd, void* buf, size_t count);
 void* my32_mmap64(x64emu_t* emu, void *addr, size_t length, int prot, int flags, int fd, int64_t offset);
@@ -299,7 +299,7 @@ void EXPORT x86Syscall(x64emu_t *emu)
         case 5: // sys_open
             if(s==5) {printf_log(LOG_DEBUG, " => sys_open(\"%s\", %d, %d)", (char*)from_ptrv(R_EBX), of_convert32(R_ECX), R_EDX);}; 
             //S_EAX = open((void*)R_EBX, of_convert32(R_ECX), R_EDX);
-            S_EAX = my32_open(emu, from_ptrv(R_EBX), of_convert32(R_ECX), R_EDX);
+            S_EAX = my_open(emu, from_ptrv(R_EBX), of_convert32(R_ECX), R_EDX);
             break;
         case 6:  // sys_close
             S_EAX = close((int)R_EBX);
@@ -448,7 +448,7 @@ uint32_t EXPORT my32_syscall(x64emu_t *emu, ptr_t* b)
         case 4:  // sys_write
             return (uint32_t)to_long(write(i32(4), p(8), u32(12)));
         case 5: // sys_open
-            return my32_open(emu, p(4), of_convert32(u32(8)), u32(12));
+            return my_open(emu, p(4), of_convert32(u32(8)), u32(12));
         case 6:  // sys_close
             return (uint32_t)close(i32(4));
         case 11: // execve
diff --git a/src/libtools/my_x11_defs.h b/src/libtools/my_x11_defs.h
index 2e8ede07..483046f0 100644
--- a/src/libtools/my_x11_defs.h
+++ b/src/libtools/my_x11_defs.h
@@ -954,4 +954,11 @@ typedef struct my_XDevice_s {
      my_XInputClassInfo_t*  classes;
 } my_XDevice_t;
 
+typedef struct my_XcursorCursors_s {
+    void*      dpy;     //Display*
+    int        ref;
+    int        ncursor;
+    void*      cursors; //Cursor*
+} my_XcursorCursors_t;
+
 #endif//MY_X11_DEFS
\ No newline at end of file
diff --git a/src/libtools/my_x11_defs_32.h b/src/libtools/my_x11_defs_32.h
index 322ebd2d..2fed047a 100644
--- a/src/libtools/my_x11_defs_32.h
+++ b/src/libtools/my_x11_defs_32.h
@@ -887,4 +887,11 @@ typedef struct __attribute__((packed, aligned(4))) my_XDevice_32_s {
      ptr_t  classes;    //my_XInputClassInfo_t*
 } my_XDevice_32_t;
 
+typedef struct __attribute__((packed, aligned(4))) my_XcursorCursors_32_s {
+    ptr_t      dpy;     //Display*
+    int        ref;
+    int        ncursor;
+    ptr_t      cursors; //Cursor*
+} my_XcursorCursors_32_t;
+
 #endif//MY_X11_DEFS_32
\ No newline at end of file
diff --git a/src/libtools/myalign32.c b/src/libtools/myalign32.c
index 63ae2951..e14912a0 100755
--- a/src/libtools/myalign32.c
+++ b/src/libtools/myalign32.c
@@ -201,6 +201,7 @@ size_t myStackAlignScanf32(const char* fmt, uint32_t* st, uint64_t* mystack, siz
                     case '#':
                     case '+': 
                     case '-': ++p; break; // formating, ignored
+                    case '[': state += 60; ++p; break;
                     case 'm': state = 0; ++p; break; // no argument
                     case 'n':
                     case 'p': state = 30; break; // pointers
@@ -251,6 +252,13 @@ size_t myStackAlignScanf32(const char* fmt, uint32_t* st, uint64_t* mystack, siz
                 state = 0;
                 ++p;
                 break;
+            case 61:
+                switch(*p) {
+                    case ']': state = 50; break;
+                    case '\\': ++p; if(*p) ++p; break;
+                    default: ++p; break;
+                }
+                break;
             default:
                 // whaaaat?
                 state = 0;
@@ -321,6 +329,7 @@ void myStackAlignScanf32_final(const char* fmt, uint32_t* st, uint64_t* mystack,
                     case '#':
                     case '+': 
                     case '-': ++p; break; // formating, ignored
+                    case '[': state += 60; ++p; break;
                     case 'm': state = 0; ++p; break; // no argument
                     case 'n':
                     case 'p': state = 30; break; // pointers
@@ -381,6 +390,13 @@ void myStackAlignScanf32_final(const char* fmt, uint32_t* st, uint64_t* mystack,
                 ++p;
                 if(!--n) return;
                 break;
+            case 61:
+                switch(*p) {
+                    case ']': state = 50; break;
+                    case '\\': ++p; if(*p) ++p; break;
+                    default: ++p; break;
+                }
+                break;
             default:
                 // whaaaat?
                 state = 0;
diff --git a/src/libtools/threads.c b/src/libtools/threads.c
index 6ca80bba..e19b3fda 100644
--- a/src/libtools/threads.c
+++ b/src/libtools/threads.c
@@ -166,7 +166,7 @@ void thread_set_emu(x64emu_t* emu)
 {
 	emuthread_t *et = (emuthread_t*)pthread_getspecific(thread_key);
 	if(!emu) {
-		if(et) box_free(et);
+		if(et) emuthread_destroy(et);
 		pthread_setspecific(thread_key, NULL);
 		return;
 	}
diff --git a/src/libtools/threads32.c b/src/libtools/threads32.c
index ae2a48c7..adbfd894 100755
--- a/src/libtools/threads32.c
+++ b/src/libtools/threads32.c
@@ -111,7 +111,7 @@ static void emuthread_cancel(void* p)
 		my32_longjmp(et->emu, ((i386_unwind_buff_t*)et->cancels[i])->__cancel_jmp_buf, 1);
 		DynaRun(et->emu);	// will return after a __pthread_unwind_next()
 	}
-	free(et->cancels);
+	box_free(et->cancels);
 	et->cancels=NULL;
 	et->cancel_size = et->cancel_cap = 0;
 }
@@ -246,7 +246,7 @@ void* my32_prepare_thread(x64emu_t *emu, void* f, void* arg, int ssize, void** p
 	int stacksize = (ssize)?ssize:(2*1024*1024);	//default stack size is 2Mo
 	//void* stack = malloc(stacksize);
 	void* stack = mmap64(NULL, stacksize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN|MAP_32BIT, -1, 0);
-	emuthread_t *et = (emuthread_t*)calloc(1, sizeof(emuthread_t));
+	emuthread_t *et = (emuthread_t*)box_calloc(1, sizeof(emuthread_t));
     x64emu_t *emuthread = NewX64Emu(emu->context, (uintptr_t)f, (uintptr_t)stack, stacksize, 1);
 	SetupX64Emu(emuthread, emu);
 	et->emu = emuthread;
@@ -271,7 +271,7 @@ EXPORT void my32___pthread_register_cancel(x64emu_t* emu, i386_unwind_buff_t* bu
 	emuthread_t *et = (emuthread_t*)thread_get_et();
 	if(et->cancel_cap == et->cancel_size) {
 		et->cancel_cap+=8;
-		et->cancels = realloc(et->cancels, sizeof(i386_unwind_buff_t*)*et->cancel_cap);
+		et->cancels = box_realloc(et->cancels, sizeof(i386_unwind_buff_t*)*et->cancel_cap);
 	}
 	et->cancels[et->cancel_size++] = buff;
 }
@@ -456,7 +456,7 @@ static pthread_cond_t* add_cond(void* cond)
 	if(!ret)
 		c = kh_value(mapcond, k);	// already there... reinit an existing one?
 	else 
-		c = kh_value(mapcond, k) = (pthread_cond_t*)calloc(1, sizeof(pthread_cond_t));
+		c = kh_value(mapcond, k) = (pthread_cond_t*)box_calloc(1, sizeof(pthread_cond_t));
 	//*(ptr_t*)cond = to_ptrv(cond);
 	mutex_unlock(&my_context->mutex_thread);
 	return c;
@@ -471,7 +471,7 @@ static pthread_cond_t* get_cond(void* cond)
 		khint_t k = kh_get(mapcond, mapcond, (uintptr_t)cond);
 		if(k==kh_end(mapcond)) {
 			printf_log(LOG_DEBUG, "BOX32: Note: phtread_cond not found, create a new empty one\n");
-			ret = (pthread_cond_t*)calloc(1, sizeof(pthread_cond_t));
+			ret = (pthread_cond_t*)box_calloc(1, sizeof(pthread_cond_t));
 			k = kh_put(mapcond, mapcond, (uintptr_t)cond, &r);
 			kh_value(mapcond, k) = ret;
 			//*(ptr_t*)cond = to_ptrv(cond);
@@ -490,7 +490,7 @@ static void del_cond(void* cond)
 	mutex_lock(&my_context->mutex_thread);
 	khint_t k = kh_get(mapcond, mapcond, *(uintptr_t*)cond);
 	if(k!=kh_end(mapcond)) {
-		free(kh_value(mapcond, k));
+		box_free(kh_value(mapcond, k));
 		kh_del(mapcond, mapcond, k);
 	}
 	mutex_unlock(&my_context->mutex_thread);
@@ -715,7 +715,7 @@ EXPORT int my32_pthread_attr_setstackaddr(x64emu_t* emu, void* attr, void* p)
 EXPORT int my32_pthread_attr_setstacksize(x64emu_t* emu, void* attr, size_t p)
 {
 	// PTHREAD_STACK_MIN on x86 might be lower than the current platform...
-	if(p>=65536 && p<PTHREAD_STACK_MIN && !(p&4095))
+	if(p>=0xc000 && p<PTHREAD_STACK_MIN && !(p&4095))
 		p = PTHREAD_STACK_MIN;
 	return pthread_attr_setstacksize(get_attr(attr), p);
 }
@@ -832,7 +832,7 @@ pthread_mutex_t* getAlignedMutex(pthread_mutex_t* m)
 		pthread_rwlock_unlock(&m_lock);
 		pthread_rwlock_wrlock(&m_lock);
 		k = kh_put(mutex, unaligned_mutex, (uintptr_t)m, &r);
-		ret = kh_value(unaligned_mutex, k) = (pthread_mutex_t*)calloc(1, sizeof(pthread_mutex_t));
+		ret = kh_value(unaligned_mutex, k) = (pthread_mutex_t*)box_calloc(1, sizeof(pthread_mutex_t));
 		memcpy(ret, m, 24);
 	}
 	pthread_rwlock_unlock(&m_lock);
@@ -847,7 +847,7 @@ EXPORT int my32_pthread_mutex_destroy(pthread_mutex_t *m)
 		kh_del(mutex, unaligned_mutex, k);
 		pthread_rwlock_unlock(&m_lock);
 		int ret = pthread_mutex_destroy(n);
-		free(n);
+		box_free(n);
 		return ret;
 	}
 	pthread_rwlock_unlock(&m_lock);
@@ -939,14 +939,14 @@ void fini_pthread_helper_32(box64context_t* context)
 	pthread_cond_t *cond;
 	kh_foreach_value(mapcond, cond, 
 		pthread_cond_destroy(cond);
-		free(cond);
+		box_free(cond);
 	);
 	kh_destroy(mapcond, mapcond);
 	mapcond = NULL;
 	pthread_mutex_t *m;
 	kh_foreach_value(unaligned_mutex, m, 
 		pthread_mutex_destroy(m);
-		free(m);
+		box_free(m);
 	);
 	kh_destroy(mutex, unaligned_mutex);
 
diff --git a/src/wrapped32/generated/functions_list.txt b/src/wrapped32/generated/functions_list.txt
index 34953316..f20dfde5 100644
--- a/src/wrapped32/generated/functions_list.txt
+++ b/src/wrapped32/generated/functions_list.txt
@@ -1246,6 +1246,7 @@
 #() vFXppiiii -> vFXppiiii
 #() iFEpLiipV -> iFEpLiipV
 #() iFEpLiLpV -> iFEpLiLpV
+#() iFEpppipp -> iFEpppipp
 #() iFEpppupp -> iFEpppupp
 #() iFEpppppp -> iFEpppppp
 #() iFEXLpiiL -> iFEXLpiiL
@@ -1272,7 +1273,6 @@
 #() pFEpLiiiI -> pFEpLiiiI
 #() pFEpLiiil -> pFEpLiiil
 #() vFXLLiiibl_ -> vFXLLiiiB
-#() iFEpppibL_p -> iFEpppiBp
 #() iFXiLibiip_ip -> iFXiLiBip
 #() iFXLibL_ubL_u -> iFXLiBuBu
 #() vFXLpiibpiip_i -> vFXLpiiBi
@@ -2052,13 +2052,14 @@ wrappedlibx11:
   - XSubImage
 - pFXpppp:
   - XCreateFontSet
+- iFpppipp:
+  - XmbLookupString
+  - Xutf8LookupString
 - iFXLpppp:
   - XQueryTree
 - iFXppppp:
   - XRegisterIMInstantiateCallback
   - XUnregisterIMInstantiateCallback
-- iFpppibL_p:
-  - XmbLookupString
 - iFXLLLiipi:
   - XChangeProperty
 - pFXLiiuuLi:
@@ -2076,6 +2077,10 @@ wrappedlibx11:
   - XCreateWindow
 wrappedlibxcomposite:
 wrappedlibxcursor:
+- vFp:
+  - XcursorCursorsDestroy
+- pFXi:
+  - XcursorCursorsCreate
 wrappedlibxext:
 - vFp:
   - XdbeFreeVisualInfo
diff --git a/src/wrapped32/generated/wrappedlibx11types32.h b/src/wrapped32/generated/wrappedlibx11types32.h
index bb7be7d8..6f292dc4 100644
--- a/src/wrapped32/generated/wrappedlibx11types32.h
+++ b/src/wrapped32/generated/wrappedlibx11types32.h
@@ -45,9 +45,9 @@ typedef int32_t (*iFXpiup_t)(void*, void*, int32_t, uint32_t, void*);
 typedef int32_t (*iFXpppp_t)(void*, void*, void*, void*, void*);
 typedef void* (*pFpiiuu_t)(void*, int32_t, int32_t, uint32_t, uint32_t);
 typedef void* (*pFXpppp_t)(void*, void*, void*, void*, void*);
+typedef int32_t (*iFpppipp_t)(void*, void*, void*, int32_t, void*, void*);
 typedef int32_t (*iFXLpppp_t)(void*, uintptr_t, void*, void*, void*, void*);
 typedef int32_t (*iFXppppp_t)(void*, void*, void*, void*, void*, void*);
-typedef int32_t (*iFpppibL_p_t)(void*, void*, void*, int32_t, struct_L_t*, void*);
 typedef int32_t (*iFXLLLiipi_t)(void*, uintptr_t, uintptr_t, uintptr_t, int32_t, int32_t, void*, int32_t);
 typedef void* (*pFXLiiuuLi_t)(void*, uintptr_t, int32_t, int32_t, uint32_t, uint32_t, uintptr_t, int32_t);
 typedef void (*vFXLpppippp_t)(void*, uintptr_t, void*, void*, void*, int32_t, void*, void*, void*);
@@ -105,10 +105,11 @@ typedef uintptr_t (*LFXLiiuuuiupLp_t)(void*, uintptr_t, int32_t, int32_t, uint32
 	GO(XQueryExtension, iFXpppp_t) \
 	GO(XSubImage, pFpiiuu_t) \
 	GO(XCreateFontSet, pFXpppp_t) \
+	GO(XmbLookupString, iFpppipp_t) \
+	GO(Xutf8LookupString, iFpppipp_t) \
 	GO(XQueryTree, iFXLpppp_t) \
 	GO(XRegisterIMInstantiateCallback, iFXppppp_t) \
 	GO(XUnregisterIMInstantiateCallback, iFXppppp_t) \
-	GO(XmbLookupString, iFpppibL_p_t) \
 	GO(XChangeProperty, iFXLLLiipi_t) \
 	GO(XGetImage, pFXLiiuuLi_t) \
 	GO(XSetWMProperties, vFXLpppippp_t) \
diff --git a/src/wrapped32/generated/wrappedlibxcursortypes32.h b/src/wrapped32/generated/wrappedlibxcursortypes32.h
index b4161913..8433e982 100644
--- a/src/wrapped32/generated/wrappedlibxcursortypes32.h
+++ b/src/wrapped32/generated/wrappedlibxcursortypes32.h
@@ -11,7 +11,11 @@
 #define ADDED_FUNCTIONS() 
 #endif
 
+typedef void (*vFp_t)(void*);
+typedef void* (*pFXi_t)(void*, int32_t);
 
-#define SUPER() ADDED_FUNCTIONS()
+#define SUPER() ADDED_FUNCTIONS() \
+	GO(XcursorCursorsDestroy, vFp_t) \
+	GO(XcursorCursorsCreate, pFXi_t)
 
 #endif // __wrappedlibxcursorTYPES32_H_
diff --git a/src/wrapped32/generated/wrapper32.c b/src/wrapped32/generated/wrapper32.c
index 2465563e..f2f0a602 100644
--- a/src/wrapped32/generated/wrapper32.c
+++ b/src/wrapped32/generated/wrapper32.c
@@ -1336,6 +1336,7 @@ typedef void (*vFXpiipii_t)(void*, void*, int32_t, int32_t, void*, int32_t, int3
 typedef void (*vFXppiiii_t)(void*, void*, void*, int32_t, int32_t, int32_t, int32_t);
 typedef int32_t (*iFEpLiipV_t)(x64emu_t*, void*, uintptr_t, int32_t, int32_t, void*, void*);
 typedef int32_t (*iFEpLiLpV_t)(x64emu_t*, void*, uintptr_t, int32_t, uintptr_t, void*, void*);
+typedef int32_t (*iFEpppipp_t)(x64emu_t*, void*, void*, void*, int32_t, void*, void*);
 typedef int32_t (*iFEpppupp_t)(x64emu_t*, void*, void*, void*, uint32_t, void*, void*);
 typedef int32_t (*iFEpppppp_t)(x64emu_t*, void*, void*, void*, void*, void*, void*);
 typedef int32_t (*iFEXLpiiL_t)(x64emu_t*, void*, uintptr_t, void*, int32_t, int32_t, uintptr_t);
@@ -1362,7 +1363,6 @@ typedef void* (*pFEpLiiii_t)(x64emu_t*, void*, uintptr_t, int32_t, int32_t, int3
 typedef void* (*pFEpLiiiI_t)(x64emu_t*, void*, uintptr_t, int32_t, int32_t, int32_t, int64_t);
 typedef void* (*pFEpLiiil_t)(x64emu_t*, void*, uintptr_t, int32_t, int32_t, int32_t, intptr_t);
 typedef void (*vFXLLiiibl__t)(void*, uintptr_t, uintptr_t, int32_t, int32_t, int32_t, struct_l_t*);
-typedef int32_t (*iFEpppibL_p_t)(x64emu_t*, void*, void*, void*, int32_t, struct_L_t*, void*);
 typedef int32_t (*iFXiLibiip_ip_t)(void*, int32_t, uintptr_t, int32_t, struct_iip_t*, int32_t, void*);
 typedef int32_t (*iFXLibL_ubL_u_t)(void*, uintptr_t, int32_t, struct_L_t*, uint32_t, struct_L_t*, uint32_t);
 typedef void (*vFXLpiibpiip_i_t)(void*, uintptr_t, void*, int32_t, int32_t, struct_piip_t*, int32_t);
@@ -2811,6 +2811,7 @@ void vFXpiipii_32(x64emu_t *emu, uintptr_t fcn) { vFXpiipii_t fn = (vFXpiipii_t)
 void vFXppiiii_32(x64emu_t *emu, uintptr_t fcn) { vFXppiiii_t fn = (vFXppiiii_t)fcn; fn(getDisplay(from_ptriv(R_ESP + 4)), from_ptriv(R_ESP + 8), from_ptriv(R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptri(int32_t, R_ESP + 20), from_ptri(int32_t, R_ESP + 24), from_ptri(int32_t, R_ESP + 28)); }
 void iFEpLiipV_32(x64emu_t *emu, uintptr_t fcn) { iFEpLiipV_t fn = (iFEpLiipV_t)fcn; R_EAX = fn(emu, from_ptriv(R_ESP + 4), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptri(int32_t, R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptriv(R_ESP + 20), from_ptrv(R_ESP + 24)); }
 void iFEpLiLpV_32(x64emu_t *emu, uintptr_t fcn) { iFEpLiLpV_t fn = (iFEpLiLpV_t)fcn; R_EAX = fn(emu, from_ptriv(R_ESP + 4), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptri(int32_t, R_ESP + 12), from_ulong(from_ptri(ulong_t, R_ESP + 16)), from_ptriv(R_ESP + 20), from_ptrv(R_ESP + 24)); }
+void iFEpppipp_32(x64emu_t *emu, uintptr_t fcn) { iFEpppipp_t fn = (iFEpppipp_t)fcn; R_EAX = fn(emu, from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8), from_ptriv(R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptriv(R_ESP + 20), from_ptriv(R_ESP + 24)); }
 void iFEpppupp_32(x64emu_t *emu, uintptr_t fcn) { iFEpppupp_t fn = (iFEpppupp_t)fcn; R_EAX = fn(emu, from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8), from_ptriv(R_ESP + 12), from_ptri(uint32_t, R_ESP + 16), from_ptriv(R_ESP + 20), from_ptriv(R_ESP + 24)); }
 void iFEpppppp_32(x64emu_t *emu, uintptr_t fcn) { iFEpppppp_t fn = (iFEpppppp_t)fcn; R_EAX = fn(emu, from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8), from_ptriv(R_ESP + 12), from_ptriv(R_ESP + 16), from_ptriv(R_ESP + 20), from_ptriv(R_ESP + 24)); }
 void iFEXLpiiL_32(x64emu_t *emu, uintptr_t fcn) { iFEXLpiiL_t fn = (iFEXLpiiL_t)fcn; R_EAX = fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptri(int32_t, R_ESP + 20), from_ulong(from_ptri(ulong_t, R_ESP + 24))); }
@@ -2837,7 +2838,6 @@ void pFEpLiiii_32(x64emu_t *emu, uintptr_t fcn) { pFEpLiiii_t fn = (pFEpLiiii_t)
 void pFEpLiiiI_32(x64emu_t *emu, uintptr_t fcn) { pFEpLiiiI_t fn = (pFEpLiiiI_t)fcn; R_EAX = to_ptrv(fn(emu, from_ptriv(R_ESP + 4), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptri(int32_t, R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptri(int32_t, R_ESP + 20), from_ptri(int64_t, R_ESP + 24))); }
 void pFEpLiiil_32(x64emu_t *emu, uintptr_t fcn) { pFEpLiiil_t fn = (pFEpLiiil_t)fcn; R_EAX = to_ptrv(fn(emu, from_ptriv(R_ESP + 4), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptri(int32_t, R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptri(int32_t, R_ESP + 20), from_long(from_ptri(long_t, R_ESP + 24)))); }
 void vFXLLiiibl__32(x64emu_t *emu, uintptr_t fcn) { vFXLLiiibl__t fn = (vFXLLiiibl__t)fcn; struct_l_t arg_28={0}; if (*(ptr_t*)(from_ptr((R_ESP + 28)))) from_struct_l(&arg_28, *(ptr_t*)(from_ptr((R_ESP + 28)))); fn(getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ulong(from_ptri(ulong_t, R_ESP + 12)), from_ptri(int32_t, R_ESP + 16), from_ptri(int32_t, R_ESP + 20), from_ptri(int32_t, R_ESP + 24), *(ptr_t*)(from_ptr((R_ESP + 28))) ? &arg_28 : NULL); if (*(ptr_t*)(from_ptr((R_ESP + 28)))) to_struct_l(*(ptr_t*)(from_ptr((R_ESP + 28))), &arg_28); }
-void iFEpppibL_p_32(x64emu_t *emu, uintptr_t fcn) { iFEpppibL_p_t fn = (iFEpppibL_p_t)fcn; struct_L_t arg_20={0}; if (*(ptr_t*)(from_ptr((R_ESP + 20)))) from_struct_L(&arg_20, *(ptr_t*)(from_ptr((R_ESP + 20)))); R_EAX = fn(emu, from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8), from_ptriv(R_ESP + 12), from_ptri(int32_t, R_ESP + 16), *(ptr_t*)(from_ptr((R_ESP + 20))) ? &arg_20 : NULL, from_ptriv(R_ESP + 24)); if (*(ptr_t*)(from_ptr((R_ESP + 20)))) to_struct_L(*(ptr_t*)(from_ptr((R_ESP + 20))), &arg_20); }
 void iFXiLibiip_ip_32(x64emu_t *emu, uintptr_t fcn) { iFXiLibiip_ip_t fn = (iFXiLibiip_ip_t)fcn; struct_iip_t arg_20={0}; if (*(ptr_t*)(from_ptr((R_ESP + 20)))) from_struct_iip(&arg_20, *(ptr_t*)(from_ptr((R_ESP + 20)))); R_EAX = fn(getDisplay(from_ptriv(R_ESP + 4)), from_ptri(int32_t, R_ESP + 8), from_ulong(from_ptri(ulong_t, R_ESP + 12)), from_ptri(int32_t, R_ESP + 16), *(ptr_t*)(from_ptr((R_ESP + 20))) ? &arg_20 : NULL, from_ptri(int32_t, R_ESP + 24), from_ptriv(R_ESP + 28)); if (*(ptr_t*)(from_ptr((R_ESP + 20)))) to_struct_iip(*(ptr_t*)(from_ptr((R_ESP + 20))), &arg_20); }
 void iFXLibL_ubL_u_32(x64emu_t *emu, uintptr_t fcn) { iFXLibL_ubL_u_t fn = (iFXLibL_ubL_u_t)fcn; struct_L_t arg_16={0}; if (*(ptr_t*)(from_ptr((R_ESP + 16)))) from_struct_L(&arg_16, *(ptr_t*)(from_ptr((R_ESP + 16)))); struct_L_t arg_24={0}; if (*(ptr_t*)(from_ptr((R_ESP + 24)))) from_struct_L(&arg_24, *(ptr_t*)(from_ptr((R_ESP + 24)))); R_EAX = fn(getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptri(int32_t, R_ESP + 12), *(ptr_t*)(from_ptr((R_ESP + 16))) ? &arg_16 : NULL, from_ptri(uint32_t, R_ESP + 20), *(ptr_t*)(from_ptr((R_ESP + 24))) ? &arg_24 : NULL, from_ptri(uint32_t, R_ESP + 28)); if (*(ptr_t*)(from_ptr((R_ESP + 16)))) to_struct_L(*(ptr_t*)(from_ptr((R_ESP + 16))), &arg_16); if (*(ptr_t*)(from_ptr((R_ESP + 24)))) to_struct_L(*(ptr_t*)(from_ptr((R_ESP + 24))), &arg_24); }
 void vFXLpiibpiip_i_32(x64emu_t *emu, uintptr_t fcn) { vFXLpiibpiip_i_t fn = (vFXLpiibpiip_i_t)fcn; struct_piip_t arg_24={0}; if (*(ptr_t*)(from_ptr((R_ESP + 24)))) from_struct_piip(&arg_24, *(ptr_t*)(from_ptr((R_ESP + 24)))); fn(getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptri(int32_t, R_ESP + 20), *(ptr_t*)(from_ptr((R_ESP + 24))) ? &arg_24 : NULL, from_ptri(int32_t, R_ESP + 28)); if (*(ptr_t*)(from_ptr((R_ESP + 24)))) to_struct_piip(*(ptr_t*)(from_ptr((R_ESP + 24))), &arg_24); }
diff --git a/src/wrapped32/generated/wrapper32.h b/src/wrapped32/generated/wrapper32.h
index 3d413e63..c5d842d5 100644
--- a/src/wrapped32/generated/wrapper32.h
+++ b/src/wrapped32/generated/wrapper32.h
@@ -1287,6 +1287,7 @@ void vFXpiipii_32(x64emu_t *emu, uintptr_t fnc);
 void vFXppiiii_32(x64emu_t *emu, uintptr_t fnc);
 void iFEpLiipV_32(x64emu_t *emu, uintptr_t fnc);
 void iFEpLiLpV_32(x64emu_t *emu, uintptr_t fnc);
+void iFEpppipp_32(x64emu_t *emu, uintptr_t fnc);
 void iFEpppupp_32(x64emu_t *emu, uintptr_t fnc);
 void iFEpppppp_32(x64emu_t *emu, uintptr_t fnc);
 void iFEXLpiiL_32(x64emu_t *emu, uintptr_t fnc);
@@ -1313,7 +1314,6 @@ void pFEpLiiii_32(x64emu_t *emu, uintptr_t fnc);
 void pFEpLiiiI_32(x64emu_t *emu, uintptr_t fnc);
 void pFEpLiiil_32(x64emu_t *emu, uintptr_t fnc);
 void vFXLLiiibl__32(x64emu_t *emu, uintptr_t fnc);
-void iFEpppibL_p_32(x64emu_t *emu, uintptr_t fnc);
 void iFXiLibiip_ip_32(x64emu_t *emu, uintptr_t fnc);
 void iFXLibL_ubL_u_32(x64emu_t *emu, uintptr_t fnc);
 void vFXLpiibpiip_i_32(x64emu_t *emu, uintptr_t fnc);
diff --git a/src/wrapped32/wrappedlibc.c b/src/wrapped32/wrappedlibc.c
index ad3478fb..70c06d16 100755
--- a/src/wrapped32/wrappedlibc.c
+++ b/src/wrapped32/wrappedlibc.c
@@ -1401,45 +1401,7 @@ static int isProcSelf(const char *path, const char* w)
     return 0;
 }
 
-EXPORT int32_t my32_readlink(x64emu_t* emu, void* path, void* buf, uint32_t sz)
-{
-    if(isProcSelf((const char*)path, "exe")) {
-        // special case for self...
-        return strlen(strncpy((char*)buf, emu->context->fullpath, sz));
-    }
-    return readlink((const char*)path, (char*)buf, sz);
-}
-#ifndef NOALIGN
-
-void CreateCPUInfoFile(int fd);
 int getNCpu();
-static int isCpuTopology(const char* p) {
-    if(strstr(p, "/sys/devices/system/cpu/cpu")!=p)
-        return -1;  //nope
-    if( FileExist(p, -1))
-        return -1;  //no need to fake it
-    char buf[512];
-    const char* p2 = p + strlen("/sys/devices/system/cpu/cpu");
-    int n = 0;
-    while(*p2>='0' && *p2<='9') {
-        n = n*10+ *p2 - '0';
-        ++p2;
-    }
-    if(n>=getNCpu()) // filter for non existing cpu
-        return -1;
-    snprintf(buf, 512, "/sys/devices/system/cpu/cpu%d/topology/core_id", n);
-    if(!strcmp(p, buf))
-        return n;
-    return -1;
-}
-static void CreateCPUTopologyCoreID(int fd, int cpu)
-{
-    char buf[512];
-    snprintf(buf, 512, "%d\n", cpu);
-    size_t dummy = write(fd, buf, strlen(buf));
-    (void)dummy;
-}
-
 
 #ifdef ANDROID
 static int shm_open(const char *name, int oflag, mode_t mode) {
@@ -1449,68 +1411,7 @@ static int shm_unlink(const char *name) {
     return -1;
 }
 #endif
-#endif
-#define TMP_CPUINFO "box32_tmpcpuinfo"
-#define TMP_CPUTOPO "box32_tmpcputopo%d"
-
-#define TMP_MEMMAP  "box32_tmpmemmap"
-#define TMP_CMDLINE "box32_tmpcmdline"
-EXPORT int32_t my32_open(x64emu_t* emu, void* pathname, int32_t flags, uint32_t mode)
-{
-    if(isProcSelf((const char*) pathname, "cmdline")) {
-        // special case for self command line...
-        #if 0
-        char tmpcmdline[200] = {0};
-        char tmpbuff[100] = {0};
-        sprintf(tmpbuff, "%s/cmdlineXXXXXX", getenv("TMP")?getenv("TMP"):".");
-        int tmp = mkstemp(tmpbuff);
-        int dummy;
-        if(tmp<0) return open(pathname, flags, mode);
-        dummy = write(tmp, emu->context->fullpath, strlen(emu->context->fullpath)+1);
-        for (int i=1; i<emu->context->argc; ++i)
-            dummy = write(tmp, emu->context->argv[i], strlen(emu->context->argv[i])+1);
-        lseek(tmp, 0, SEEK_SET);
-        #else
-        int tmp = shm_open(TMP_CMDLINE, O_RDWR | O_CREAT, S_IRWXU);
-        if(tmp<0) return open(pathname, flags, mode);
-        shm_unlink(TMP_CMDLINE);    // remove the shm file, but it will still exist because it's currently in use
-        int dummy = write(tmp, emu->context->fullpath, strlen(emu->context->fullpath)+1);
-        (void)dummy;
-        for (int i=1; i<emu->context->argc; ++i)
-            dummy = write(tmp, emu->context->argv[i], strlen(emu->context->argv[i])+1);
-        lseek(tmp, 0, SEEK_SET);
-        #endif
-        return tmp;
-    }
-    if(isProcSelf((const char*)pathname, "exe")) {
-        return open(emu->context->fullpath, flags, mode);
-    }
-    #ifndef NOALIGN
-    if(strcmp((const char*)pathname, "/proc/cpuinfo")==0) {
-        // special case for cpuinfo
-        int tmp = shm_open(TMP_CPUINFO, O_RDWR | O_CREAT, S_IRWXU);
-        if(tmp<0) return open(pathname, flags, mode); // error fallback
-        shm_unlink(TMP_CPUINFO);    // remove the shm file, but it will still exist because it's currently in use
-        CreateCPUInfoFile(tmp);
-        lseek(tmp, 0, SEEK_SET);
-        return tmp;
-    }
-    if(isCpuTopology((const char*)pathname)!=-1) {
-        int n = isCpuTopology((const char*)pathname);
-        char buf[512];
-        snprintf(buf, 512, TMP_CPUTOPO, n);
-        int tmp = shm_open(buf, O_RDWR | O_CREAT, S_IRWXU);
-        if(tmp<0) return open(pathname, flags, mode); // error fallback
-        shm_unlink(buf);    // remove the shm file, but it will still exist because it's currently in use
-        CreateCPUTopologyCoreID(tmp, n);
-        lseek(tmp, 0, SEEK_SET);
-        return tmp;
-    }
-    #endif
-    int ret = open(pathname, flags, mode);
-    return ret;
-}
-EXPORT int32_t my32___open(x64emu_t* emu, void* pathname, int32_t flags, uint32_t mode) __attribute__((alias("my32_open")));
+
 
 #ifdef DYNAREC
 static int hasDBFromAddress(uintptr_t addr)
@@ -1543,143 +1444,6 @@ EXPORT ssize_t my32_read(int fd, void* buf, size_t count)
     return ret;
 }
 
-EXPORT int32_t my32_open64(x64emu_t* emu, void* pathname, int32_t flags, uint32_t mode)
-{
-    if(isProcSelf((const char*)pathname, "cmdline")) {
-        // special case for self command line...
-        int tmp = shm_open(TMP_CMDLINE, O_RDWR | O_CREAT, S_IRWXU);
-        if(tmp<0) return open64(pathname, flags, mode);
-        shm_unlink(TMP_CMDLINE);    // remove the shm file, but it will still exist because it's currently in use
-        int dummy = write(tmp, emu->context->fullpath, strlen(emu->context->fullpath)+1);
-        (void)dummy;
-        for (int i=1; i<emu->context->argc; ++i)
-            dummy = write(tmp, emu->context->argv[i], strlen(emu->context->argv[i])+1);
-        lseek(tmp, 0, SEEK_SET);
-        return tmp;
-    }
-    if(isProcSelf((const char*)pathname, "exe")) {
-        return open64(emu->context->fullpath, flags, mode);
-    }
-    #ifndef NOALIGN
-    if(strcmp((const char*)pathname, "/proc/cpuinfo")==0) {
-        // special case for cpuinfo
-        int tmp = shm_open(TMP_CPUINFO, O_RDWR | O_CREAT, S_IRWXU);
-        if(tmp<0) return open64(pathname, flags, mode); // error fallback
-        shm_unlink(TMP_CPUINFO);    // remove the shm file, but it will still exist because it's currently in use
-        CreateCPUInfoFile(tmp);
-        lseek(tmp, 0, SEEK_SET);
-        return tmp;
-    }
-    if(isCpuTopology((const char*)pathname)!=-1) {
-        int n = isCpuTopology((const char*)pathname);
-        char buf[512];
-        snprintf(buf, 512, TMP_CPUTOPO, n);
-        int tmp = shm_open(buf, O_RDWR | O_CREAT, S_IRWXU);
-        if(tmp<0) return open64(pathname, flags, mode); // error fallback
-        shm_unlink(buf);    // remove the shm file, but it will still exist because it's currently in use
-        CreateCPUTopologyCoreID(tmp, n);
-        lseek(tmp, 0, SEEK_SET);
-        return tmp;
-    }
-    #endif
-    return open64(pathname, flags, mode);
-}
-
-EXPORT FILE* my32_fopen(x64emu_t* emu, const char* path, const char* mode)
-{
-    if(isProcSelf(path, "maps")) {
-        // special case for self memory map
-        int tmp = shm_open(TMP_MEMMAP, O_RDWR | O_CREAT, S_IRWXU);
-        if(tmp<0) return fopen(path, mode); // error fallback
-        shm_unlink(TMP_MEMMAP);    // remove the shm file, but it will still exist because it's currently in use
-        CreateMemorymapFile(emu->context, tmp);
-        lseek(tmp, 0, SEEK_SET);
-        return fdopen(tmp, mode);
-    }
-    #ifndef NOALIGN
-    if(strcmp(path, "/proc/cpuinfo")==0) {
-        // special case for cpuinfo
-        int tmp = shm_open(TMP_CPUINFO, O_RDWR | O_CREAT, S_IRWXU);
-        if(tmp<0) return fopen(path, mode); // error fallback
-        shm_unlink(TMP_CPUINFO);    // remove the shm file, but it will still exist because it's currently in use
-        CreateCPUInfoFile(tmp);
-        lseek(tmp, 0, SEEK_SET);
-        return fdopen(tmp, mode);
-    }
-    if(isCpuTopology(path)!=-1) {
-        int n = isCpuTopology(path);
-        char buf[512];
-        snprintf(buf, 512, TMP_CPUTOPO, n);
-        int tmp = shm_open(buf, O_RDWR | O_CREAT, S_IRWXU);
-        if(tmp<0) return fopen(path, mode); // error fallback
-        shm_unlink(buf);    // remove the shm file, but it will still exist because it's currently in use
-        CreateCPUTopologyCoreID(tmp, n);
-        lseek(tmp, 0, SEEK_SET);
-        return fdopen(tmp, mode);;
-    }
-    #endif
-    if(isProcSelf(path, "exe")) {
-        return fopen(emu->context->fullpath, mode);
-    }
-    return fopen(path, mode);
-}
-
-EXPORT FILE* my32_fopen64(x64emu_t* emu, const char* path, const char* mode)
-{
-    if(isProcSelf(path, "maps")) {
-        // special case for self memory map
-        int tmp = shm_open(TMP_MEMMAP, O_RDWR | O_CREAT, S_IRWXU);
-        if(tmp<0) return fopen64(path, mode); // error fallback
-        shm_unlink(TMP_MEMMAP);    // remove the shm file, but it will still exist because it's currently in use
-        CreateMemorymapFile(emu->context, tmp);
-        lseek(tmp, 0, SEEK_SET);
-        return fdopen(tmp, mode);
-    }
-    #ifndef NOALIGN
-    if(strcmp(path, "/proc/cpuinfo")==0) {
-        // special case for cpuinfo
-        int tmp = shm_open(TMP_CPUINFO, O_RDWR | O_CREAT, S_IRWXU);
-        if(tmp<0) return fopen64(path, mode); // error fallback
-        shm_unlink(TMP_CPUINFO);    // remove the shm file, but it will still exist because it's currently in use
-        CreateCPUInfoFile(tmp);
-        lseek(tmp, 0, SEEK_SET);
-        return fdopen(tmp, mode);
-    }
-    if(isCpuTopology(path)!=-1) {
-        int n = isCpuTopology(path);
-        char buf[512];
-        snprintf(buf, 512, TMP_CPUTOPO, n);
-        int tmp = shm_open(buf, O_RDWR | O_CREAT, S_IRWXU);
-        if(tmp<0) return fopen(path, mode); // error fallback
-        shm_unlink(buf);    // remove the shm file, but it will still exist because it's currently in use
-        CreateCPUTopologyCoreID(tmp, n);
-        lseek(tmp, 0, SEEK_SET);
-        return fdopen(tmp, mode);;
-    }
-    #endif
-    if(isProcSelf(path, "exe")) {
-        return fopen64(emu->context->fullpath, mode);
-    }
-    return fopen64(path, mode);
-}
-
-#ifndef _SC_NPROCESSORS_ONLN
-#define _SC_NPROCESSORS_ONLN    84
-#endif 
-#ifndef _SC_NPROCESSORS_CONF
-#define _SC_NPROCESSORS_CONF    83
-#endif 
-EXPORT long my32_sysconf(x64emu_t* emu, int what) {
-    if(what==_SC_NPROCESSORS_ONLN) {
-        return getNCpu();
-    }
-    if(what==_SC_NPROCESSORS_CONF) {
-        return getNCpu();
-    }
-    return sysconf(what);
-}
-EXPORT long my32___sysconf(x64emu_t* emu, int what) __attribute__((alias("my32_sysconf")));
-
 #if 0
 EXPORT int my32_mkstemps64(x64emu_t* emu, char* template, int suffixlen)
 {
diff --git a/src/wrapped32/wrappedlibc_private.h b/src/wrapped32/wrappedlibc_private.h
index 75eb218f..785ad1d4 100755
--- a/src/wrapped32/wrappedlibc_private.h
+++ b/src/wrapped32/wrappedlibc_private.h
@@ -366,8 +366,8 @@ GOW(_flushlbf, vFv)
 //GO(fmemopen, pFpup)
 // fmtmsg
 GO(fnmatch, iFppi)
-GOM(fopen, SFEpp)           //%%
-GOWM(fopen64, SFEpp)         //%%
+GO2(fopen, SFEpp, my_fopen)           //%%
+GOW2(fopen64, SFEpp, my_fopen64)         //%%
 //GOM(fopencookie, pFEpppppp) //%% last 4p are a struct with 4 callbacks...
 GOWM(fork, iFEv)             //%%
 GOM(__fork, iFEv)           //%%
@@ -1199,10 +1199,10 @@ GOW(ntohs, WFW)
 // __obstack_vprintf_chk
 //GOWM(on_exit, iFEpp)  //%%
 //GO2(__on_exit, iFEpp, my_on_exit)   //%%
-GOWM(open, iFEpON)    //%%
-//GOWM(__open, iFEpON)  //%%
+GOW2(open, iFEpON, my_open)    //%%
+GOW2(__open, iFEpON, my_open)  //%%
 //GO(__open_2, iFpO)
-GOWM(open64, iFEpON)  //%%
+GOW2(open64, iFEpON, my_open64)  //%%
 // __open64 // Weak
 //GO(__open64_2, iFpO)
 //GOW(openat, iFipON)
@@ -1351,7 +1351,7 @@ GOM(read, lFipL) //%%,noE
 GOWM(readdir, pFEp)  //%%
 GO(readdir64, pFp)  // check if alignement is correct
 //GOM(readdir_r, iFEppp)  //%% should also be weak
-GOM(readlink, lFEppL) //%%
+GO2(readlink, lFEppL, my_readlink) //%%
 GOM(readlinkat, iFEippL)
 // __readlinkat_chk
 // __readlink_chk
@@ -1768,8 +1768,8 @@ GO(sync, vFv)
 GO(syncfs, iFi)
 // sync_file_range
 GOM(syscall, lFEV) //%%
-GOWM(sysconf, lFEi)
-GOM(__sysconf, lFEi)
+GOW2(sysconf, lFEi, my_sysconf)
+GO2(__sysconf, lFEi, my_sysconf)
 // sysctl   // Weak
 //GO(__sysctl, iFp)
 //DATA(_sys_errlist, 4)
diff --git a/src/wrapped32/wrappedlibx11.c b/src/wrapped32/wrappedlibx11.c
index 16d06214..9f44cd39 100644
--- a/src/wrapped32/wrappedlibx11.c
+++ b/src/wrapped32/wrappedlibx11.c
@@ -2294,20 +2294,35 @@ EXPORT unsigned long my32_XLookupKeysym(x64emu_t* emu, my_XEvent_32_t* evt, int
     return my->XLookupKeysym(evt?(&event):NULL, index);
 }
 
-EXPORT int my32_XLookupString(x64emu_t* emu, my_XEvent_32_t* evt, void* buff, int len, void* keysym, void* status)
+EXPORT int my32_XLookupString(x64emu_t* emu, my_XEvent_32_t* evt, void* buff, int len, ulong_t* keysym, void* status)
 {
     my_XEvent_t event = {0};
+    XID keysym_l = 0;
     if(evt) unconvertXEvent(&event, evt);
-    return my->XLookupString(evt?(&event):NULL, buff, len, keysym, status);
+    int ret = my->XLookupString(evt?(&event):NULL, buff, len, keysym?(&keysym_l):NULL, status);
+    if(keysym) *keysym = to_ulong(keysym_l);
+    return ret;
 }
 
-EXPORT int my32_XmbLookupString(x64emu_t* emu, void* xic, my_XEvent_32_t* evt, void* buff, int len, void* keysym, void* status)
+EXPORT int my32_XmbLookupString(x64emu_t* emu, void* xic, my_XEvent_32_t* evt, void* buff, int len, ulong_t* keysym, void* status)
 {
     my_XEvent_t event = {0};
+    XID keysym_l = 0;
     if(evt) unconvertXEvent(&event, evt);
-    return my->XmbLookupString(xic, evt?(&event):NULL, buff, len, keysym, status);
+    int ret = my->XmbLookupString(xic, evt?(&event):NULL, buff, len, keysym?(&keysym_l):NULL, status);
+    if(keysym) *keysym = to_ulong(keysym_l);
+    return ret;
 }
 
+EXPORT int my32_Xutf8LookupString(x64emu_t* emu, void* xic, my_XEvent_32_t* evt, void* buff, int len, ulong_t* keysym, void* status)
+{
+    my_XEvent_t event = {0};
+    XID keysym_l = 0;
+    if(evt) unconvertXEvent(&event, evt);
+    int ret = my->Xutf8LookupString(xic, evt?(&event):NULL, buff, len, keysym?(&keysym_l):NULL, status);
+    if(keysym) *keysym = to_ulong(keysym_l);
+    return ret;
+}
 
 EXPORT int my32_XSetWMProtocols(x64emu_t* emu, void* dpy, XID window, XID_32* protocol, int count)
 {
diff --git a/src/wrapped32/wrappedlibx11_private.h b/src/wrapped32/wrappedlibx11_private.h
index 9884c016..3c3b1240 100644
--- a/src/wrapped32/wrappedlibx11_private.h
+++ b/src/wrapped32/wrappedlibx11_private.h
@@ -905,7 +905,7 @@ GO(XmbDrawText, vFXLpiibpiip_i)
 //GO(_XmbGenericTextExtents, 
 //GO(_XmbGenericTextPerCharExtents, 
 GO(_Xmblen, iFpi)
-GOM(XmbLookupString, iFEpppibL_p)
+GOM(XmbLookupString, iFEpppipp)
 GO(XmbResetIC, pFp)
 //GO(XmbSetWMProperties, vFpLpppippp)
 //GO(_Xmbstoutf8, 
@@ -1182,7 +1182,7 @@ GO(Xutf8DrawText, vFXLpiibpiip_i)
 //GO(_Xutf8GenericTextEscapement, 
 //GO(_Xutf8GenericTextExtents, 
 //GO(_Xutf8GenericTextPerCharExtents, 
-//GO(Xutf8LookupString, iFpbiLiXLLLLiiiiuui_pibL_p)
+GOM(Xutf8LookupString, iFEpppipp)
 GO(Xutf8ResetIC, pFp)
 GOM(Xutf8SetWMProperties, vFEXLpppippp) // Warning: failed to confirm
 GO(Xutf8TextEscapement, iFppi)
diff --git a/src/wrapped32/wrappedlibxcursor.c b/src/wrapped32/wrappedlibxcursor.c
index 58186502..655484ee 100644
--- a/src/wrapped32/wrappedlibxcursor.c
+++ b/src/wrapped32/wrappedlibxcursor.c
@@ -6,10 +6,16 @@
 
 #include "wrappedlibs.h"
 
+#include "debug.h"
 #include "wrapper32.h"
 #include "bridge.h"
 #include "librarian/library_private.h"
 #include "x64emu.h"
+#include "emu/x64emu_private.h"
+#include "callback.h"
+#include "librarian.h"
+#include "box32context.h"
+#include "emu/x64emu_private.h"
 
 #ifdef ANDROID
 	static const char* libxcursorName = "libXcursor.so";
@@ -25,5 +31,51 @@
 #define NEEDED_LIBS "libX11.so.6", "libXfixes.so.3", "libXrender.so.1"
 #endif
 
+#include "libtools/my_x11_defs.h"
+#include "libtools/my_x11_defs_32.h"
+
+#include "generated/wrappedlibxcursortypes32.h"
+
+#include "wrappercallback32.h"
+
+void* getDisplay(void*);
+void* FindDisplay(void*);
+
+void inplace_XcursorCursors_shrink(void* a)
+{
+	if(!a) return;
+	my_XcursorCursors_t* src = a;
+	my_XcursorCursors_32_t* dst = a;
+
+	dst->dpy = to_ptrv(getDisplay(src->dpy));
+	dst->ref = src->ref;
+	dst->ncursor = src->ncursor;
+	dst->cursors = to_ptrv(src->cursors);
+}
+void inplace_XcursorCursors_enlarge(void* a)
+{
+	if(!a) return;
+	my_XcursorCursors_32_t* src = a;
+	my_XcursorCursors_t* dst = a;
+
+	dst->cursors = from_ptrv(src->cursors);
+	dst->ncursor = src->ncursor;
+	dst->ref = src->ref;
+	dst->dpy = FindDisplay(from_ptrv(src->dpy));
+}
+
+EXPORT void* my32_XcursorCursorsCreate(x64emu_t* emu, void* dpy, int n)
+{
+	void* ret = my->XcursorCursorsCreate(dpy, n);
+	inplace_XcursorCursors_shrink(ret);
+	return ret;
+}
+
+EXPORT void my32_XcursorCursorsDestroy(x64emu_t* emu, void* a)
+{
+	inplace_XcursorCursors_enlarge(a);
+	my->XcursorCursorsDestroy(a);
+}
+
 #include "wrappedlib_init32.h"
 
diff --git a/src/wrapped32/wrappedlibxcursor_private.h b/src/wrapped32/wrappedlibxcursor_private.h
index 528b0ff4..7d2a07ee 100644
--- a/src/wrapped32/wrappedlibxcursor_private.h
+++ b/src/wrapped32/wrappedlibxcursor_private.h
@@ -11,8 +11,8 @@
 //GO(XcursorCommentsDestroy, vFp)
 //GO(_XcursorCreateFontCursor, 
 //GO(_XcursorCreateGlyphCursor, 
-//GO(XcursorCursorsCreate, pFpi)
-//GO(XcursorCursorsDestroy, vFp)
+GOM(XcursorCursorsCreate, pFEXi)
+GOM(XcursorCursorsDestroy, vFEp)
 //GO(XcursorFileLoad, iFSpp)
 //GO(XcursorFileLoadAllImages, pFS)
 //GO(XcursorFileLoadImage, pFSi)