diff options
| -rw-r--r-- | src/include/myalign.h | 1 | ||||
| -rw-r--r-- | src/libtools/myalign.c | 8 | ||||
| -rw-r--r-- | src/wrapped/wrappedlibx11.c | 62 |
3 files changed, 32 insertions, 39 deletions
diff --git a/src/include/myalign.h b/src/include/myalign.h index c29237d6..8e33aef1 100644 --- a/src/include/myalign.h +++ b/src/include/myalign.h @@ -218,6 +218,7 @@ void* add_xcb_connection(void* src); void del_xcb_connection(void* src); uintptr_t getVArgs(x64emu_t* emu, int pos, uintptr_t* b, int N); +void setVArgs(x64emu_t* emu, int pos, uintptr_t* b, int N, uintptr_t a); // longjmp / setjmp typedef struct jump_buff_x64_s { diff --git a/src/libtools/myalign.c b/src/libtools/myalign.c index 123aa651..d60070bd 100644 --- a/src/libtools/myalign.c +++ b/src/libtools/myalign.c @@ -624,6 +624,14 @@ uintptr_t getVArgs(x64emu_t* emu, int pos, uintptr_t* b, int N) return emu->regs[regs_abi[pos+N]].q[0]; } +void setVArgs(x64emu_t* emu, int pos, uintptr_t* b, int N, uintptr_t a) +{ + if((pos+N)>5) + b[pos+N-6] = a; + else + emu->regs[regs_abi[pos+N]].q[0] = a; +} + #ifndef CONVERT_VALIST void myStackAlignValist(x64emu_t* emu, const char* fmt, uint64_t* mystack, x64_va_list_t va) { diff --git a/src/wrapped/wrappedlibx11.c b/src/wrapped/wrappedlibx11.c index bdfc3469..83bed6c5 100644 --- a/src/wrapped/wrappedlibx11.c +++ b/src/wrapped/wrappedlibx11.c @@ -1054,98 +1054,86 @@ GO(XNStatusDrawCallback) \ GO(XNR6PreeditCallback) \ GO(XNStringConversionCallback) -#define VA_CALL(FUNC, FIRST_ARG, VAARGS, VAARGSZ, RESULT) \ +#define VA_CALL(FUNC, FIRST_ARG, N, VAARGSZ, RESULT) \ switch (VAARGSZ) \ { \ case 2: \ - RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], NULL); \ + RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), NULL); \ break; \ case 4: \ - RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], NULL); \ + RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), NULL); \ break; \ case 6: \ - RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], NULL); \ + RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), NULL); \ break; \ case 8: \ - RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], NULL); \ + RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), getVArgs(emu, N, va, 6), getVArgs(emu, N, va, 7), NULL); \ break; \ case 10: \ - RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9], NULL); \ + RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), getVArgs(emu, N, va, 6), getVArgs(emu, N, va, 7), getVArgs(emu, N, va, 8), getVArgs(emu, N, va, 9), NULL); \ break; \ case 12: \ - RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9], VAARGS[10], VAARGS[11], NULL); \ + RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), getVArgs(emu, N, va, 6), getVArgs(emu, N, va, 7), getVArgs(emu, N, va, 8), getVArgs(emu, N, va, 9), getVArgs(emu, N, va, 10), getVArgs(emu, N, va, 11), NULL); \ break; \ case 14: \ - RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9], VAARGS[10], VAARGS[11], VAARGS[12], VAARGS[13], NULL); \ + RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), getVArgs(emu, N, va, 6), getVArgs(emu, N, va, 7), getVArgs(emu, N, va, 8), getVArgs(emu, N, va, 9), getVArgs(emu, N, va, 10), getVArgs(emu, N, va, 11), getVArgs(emu, N, va, 12), getVArgs(emu, N, va, 13), NULL); \ break; \ case 16: \ - RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9], VAARGS[10], VAARGS[11], VAARGS[12], VAARGS[13], VAARGS[14], VAARGS[15], NULL); \ + RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), getVArgs(emu, N, va, 6), getVArgs(emu, N, va, 7), getVArgs(emu, N, va, 8), getVArgs(emu, N, va, 9), getVArgs(emu, N, va, 10), getVArgs(emu, N, va, 11), getVArgs(emu, N, va, 12), getVArgs(emu, N, va, 13), getVArgs(emu, N, va, 14), getVArgs(emu, N, va, 15), NULL); \ break; \ case 18: \ - RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9], VAARGS[10], VAARGS[11], VAARGS[12], VAARGS[13], VAARGS[14], VAARGS[15], VAARGS[16], VAARGS[17], NULL); \ + RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), getVArgs(emu, N, va, 6), getVArgs(emu, N, va, 7), getVArgs(emu, N, va, 8), getVArgs(emu, N, va, 9), getVArgs(emu, N, va, 10), getVArgs(emu, N, va, 11), getVArgs(emu, N, va, 12), getVArgs(emu, N, va, 13), getVArgs(emu, N, va, 14), getVArgs(emu, N, va, 15), getVArgs(emu, N, va, 16), getVArgs(emu, N, va, 17), NULL); \ break; \ case 20: \ - RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9], VAARGS[10], VAARGS[11], VAARGS[12], VAARGS[13], VAARGS[14], VAARGS[15], VAARGS[16], VAARGS[17], VAARGS[18], VAARGS[19], NULL); \ + RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), getVArgs(emu, N, va, 6), getVArgs(emu, N, va, 7), getVArgs(emu, N, va, 8), getVArgs(emu, N, va, 9), getVArgs(emu, N, va, 10), getVArgs(emu, N, va, 11), getVArgs(emu, N, va, 12), getVArgs(emu, N, va, 13), getVArgs(emu, N, va, 14), getVArgs(emu, N, va, 15), getVArgs(emu, N, va, 16), getVArgs(emu, N, va, 17), getVArgs(emu, N, va, 18), getVArgs(emu, N, va, 19), NULL); \ break; \ default: \ printf_log(LOG_NONE, "warning: %s's vasize (%d) is too large, need create new call case!\n", __func__, VAARGSZ); \ break; \ } -#define GO(A) \ -if (new_va[i] && strcmp((char*)new_va[i], A) == 0) { \ - XICCallback* origin = (XICCallback*)new_va[i+1]; \ - new_va[i+1] = find##A##Fct(origin); \ +#define GO(A) \ +if (getVArgs(emu, 1, va, i) && strcmp((char*)getVArgs(emu, 1, va, i), A) == 0) { \ + XICCallback* origin = (XICCallback*)getVArgs(emu, 1, va, i+1); \ + setVArgs(emu, 1, va, i+1, (uintptr_t)find##A##Fct(origin)); \ } EXPORT void* my_XVaCreateNestedList(x64emu_t* emu, int unused, uintptr_t* va) { int n = 0; while (getVArgs(emu, 1, va, n)) n+=2 ; - void** new_va = box_malloc(sizeof(void*) * n); for (int i = 0; i < n; i += 2) { - new_va[i] = (void*)getVArgs(emu, 1, va, i); - new_va[i+1] = (void*)getVArgs(emu, 1, va, i+1); SUPER() } void* res = NULL; - VA_CALL(my->XVaCreateNestedList, unused, new_va, n, res); - box_free(new_va); + VA_CALL(my->XVaCreateNestedList, unused, 1, n, res); return res; } EXPORT void* my_XCreateIC(x64emu_t* emu, void* xim, uintptr_t* va) { int n = 0; while (getVArgs(emu, 1, va, n)) n+=2; - void** new_va = box_malloc(sizeof(void*) * n); for (int i = 0; i < n; i += 2) { - new_va[i] = (void*)getVArgs(emu, 1, va, i); - new_va[i+1] = (void*)getVArgs(emu, 1, va, i+1); SUPER() } void* res = NULL; - VA_CALL(my->XCreateIC, xim, new_va, n, res); - box_free(new_va); + VA_CALL(my->XCreateIC, xim, 1, n, res); return res; } EXPORT void* my_XSetICValues(x64emu_t* emu, void* xic, uintptr_t* va) { int n = 0; while (getVArgs(emu, 1, va, n)) n+=2; - void** new_va = box_malloc(sizeof(void*) * n); for (int i = 0; i < n; i += 2) { - new_va[i] = (void*)getVArgs(emu, 1, va, i); - new_va[i+1] = (void*)getVArgs(emu, 1, va, i+1); SUPER() } void* res = NULL; - VA_CALL(my->XSetICValues, xic, new_va, n, res); - box_free(new_va); + VA_CALL(my->XSetICValues, xic, 1, n, res); return res; } #undef GO @@ -1153,23 +1141,19 @@ EXPORT void* my_XSetICValues(x64emu_t* emu, void* xic, uintptr_t* va) { EXPORT void* my_XSetIMValues(x64emu_t* emu, void* xim, uintptr_t* va) { int n = 0; while (getVArgs(emu, 1, va, n)) n+=2; - void** new_va = box_malloc(sizeof(void*) * n); - #define GO(A) \ - if (new_va[i] && strcmp((char*)new_va[i], A) == 0) { \ - XIMCallback* origin = (XIMCallback*)new_va[i+1]; \ - new_va[i+1] = find##A##Fct(origin); \ + #define GO(A) \ + if (getVArgs(emu, 1, va, i) && strcmp((char*)getVArgs(emu, 1, va, i), A) == 0) { \ + XIMCallback* origin = (XIMCallback*)getVArgs(emu, 1, va, i+1); \ + setVArgs(emu, 1, va, i+1, (uintptr_t)find##A##Fct(origin)); \ } for (int i = 0; i < n; i += 2) { - new_va[i] = (void*)getVArgs(emu, 1, va, i); - new_va[i+1] = (void*)getVArgs(emu, 1, va, i+1); SUPER() } #undef GO void* res = NULL; - VA_CALL(my->XSetIMValues, xim, new_va, n, res) - box_free(new_va); + VA_CALL(my->XSetIMValues, xim, 1, n, res) return res; } #undef VA_CALL |