diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-25 16:35:54 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-25 16:35:54 +0100 |
| commit | 6e78bc1726047f5462517d5fd1954fcbe080e1b4 (patch) | |
| tree | 9839a0aceb8159c7227fa32e52cea2ed74a2a4c4 /src | |
| parent | 3b4181c616a78678ceabed82482a2fcc8ce26699 (diff) | |
| download | box64-6e78bc1726047f5462517d5fd1954fcbe080e1b4.tar.gz box64-6e78bc1726047f5462517d5fd1954fcbe080e1b4.zip | |
Added wrapped libICE and libSM plus a few more libc wrapped functions
Diffstat (limited to 'src')
| -rwxr-xr-x | src/library_list.h | 4 | ||||
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 3 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 6 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 3 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 50 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc_private.h | 8 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibice.c | 59 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibice_private.h | 113 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibsm.c | 175 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibsm_private.h | 45 |
10 files changed, 411 insertions, 55 deletions
diff --git a/src/library_list.h b/src/library_list.h index 906d5a7a..7fe5e905 100755 --- a/src/library_list.h +++ b/src/library_list.h @@ -114,8 +114,8 @@ GO("libpulse.so.0", pulse) //GO("libfontconfig.so.1", fontconfig) //GO("libfreetype.so.6", freetype) //GO("libbz2.so.1", bz2) -//GO("libSM.so.6", libsm) -//GO("libICE.so.6", libice) +GO("libSM.so.6", libsm) +GO("libICE.so.6", libice) //GO("libusb-1.0.so.0", libusb1) //GO("libncursesw.so.5", libncursesw) //GO("libformw.so.5", libformw) diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt index 9c86247f..1a50a2f1 100644 --- a/src/wrapped/generated/functions_list.txt +++ b/src/wrapped/generated/functions_list.txt @@ -712,6 +712,7 @@ #() vFuppppp #() vFffffff #() vFdddddd +#() vFpiiiii #() vFpiiuuu #() vFpipipV #() vFpipppi @@ -813,6 +814,7 @@ #() vFuuddiip #() vFuffffff #() vFudddddd +#() vFpiiliip #() vFpipipii #() vFpddiidd #() vFppiiipi @@ -981,6 +983,7 @@ #() iFiiiiiiiiiip #() iFpipllippppp #() iFppppiiuuiiL +#() pFEppiiLpppip #() pFEppuiipuuii #() vFuuiiiiiiiuip #() vFuuiiiiiiiuup diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c index 257037ce..59db1f3e 100644 --- a/src/wrapped/generated/wrapper.c +++ b/src/wrapped/generated/wrapper.c @@ -745,6 +745,7 @@ typedef void (*vFupupip_t)(uint32_t, void*, uint32_t, void*, int32_t, void*); typedef void (*vFuppppp_t)(uint32_t, void*, void*, void*, void*, void*); typedef void (*vFffffff_t)(float, float, float, float, float, float); typedef void (*vFdddddd_t)(double, double, double, double, double, double); +typedef void (*vFpiiiii_t)(void*, int32_t, int32_t, int32_t, int32_t, int32_t); typedef void (*vFpiiuuu_t)(void*, int32_t, int32_t, uint32_t, uint32_t, uint32_t); typedef void (*vFpipipV_t)(void*, int32_t, void*, int32_t, void*, void*); typedef void (*vFpipppi_t)(void*, int32_t, void*, void*, void*, int32_t); @@ -846,6 +847,7 @@ typedef void (*vFuuffiip_t)(uint32_t, uint32_t, float, float, int32_t, int32_t, typedef void (*vFuuddiip_t)(uint32_t, uint32_t, double, double, int32_t, int32_t, void*); typedef void (*vFuffffff_t)(uint32_t, float, float, float, float, float, float); typedef void (*vFudddddd_t)(uint32_t, double, double, double, double, double, double); +typedef void (*vFpiiliip_t)(void*, int32_t, int32_t, intptr_t, int32_t, int32_t, void*); typedef void (*vFpipipii_t)(void*, int32_t, void*, int32_t, void*, int32_t, int32_t); typedef void (*vFpddiidd_t)(void*, double, double, int32_t, int32_t, double, double); typedef void (*vFppiiipi_t)(void*, void*, int32_t, int32_t, int32_t, void*, int32_t); @@ -1014,6 +1016,7 @@ typedef int32_t (*iFEppppiiiiuu_t)(x64emu_t*, void*, void*, void*, void*, int32_ typedef int32_t (*iFiiiiiiiiiip_t)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, void*); typedef int32_t (*iFpipllippppp_t)(void*, int32_t, void*, intptr_t, intptr_t, int32_t, void*, void*, void*, void*, void*); typedef int32_t (*iFppppiiuuiiL_t)(void*, void*, void*, void*, int32_t, int32_t, uint32_t, uint32_t, int32_t, int32_t, uintptr_t); +typedef void* (*pFEppiiLpppip_t)(x64emu_t*, void*, void*, int32_t, int32_t, uintptr_t, void*, void*, void*, int32_t, void*); typedef void* (*pFEppuiipuuii_t)(x64emu_t*, void*, void*, uint32_t, int32_t, int32_t, void*, uint32_t, uint32_t, int32_t, int32_t); typedef void (*vFuuiiiiiiiuip_t)(uint32_t, uint32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, uint32_t, int32_t, void*); typedef void (*vFuuiiiiiiiuup_t)(uint32_t, uint32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, uint32_t, uint32_t, void*); @@ -1773,6 +1776,7 @@ void vFupupip(x64emu_t *emu, uintptr_t fcn) { vFupupip_t fn = (vFupupip_t)fcn; f void vFuppppp(x64emu_t *emu, uintptr_t fcn) { vFuppppp_t fn = (vFuppppp_t)fcn; fn((uint32_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9); } void vFffffff(x64emu_t *emu, uintptr_t fcn) { vFffffff_t fn = (vFffffff_t)fcn; fn(emu->xmm[0].f[0], emu->xmm[1].f[0], emu->xmm[2].f[0], emu->xmm[3].f[0], emu->xmm[4].f[0], emu->xmm[5].f[0]); } void vFdddddd(x64emu_t *emu, uintptr_t fcn) { vFdddddd_t fn = (vFdddddd_t)fcn; fn(emu->xmm[0].d[0], emu->xmm[1].d[0], emu->xmm[2].d[0], emu->xmm[3].d[0], emu->xmm[4].d[0], emu->xmm[5].d[0]); } +void vFpiiiii(x64emu_t *emu, uintptr_t fcn) { vFpiiiii_t fn = (vFpiiiii_t)fcn; fn((void*)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9); } void vFpiiuuu(x64emu_t *emu, uintptr_t fcn) { vFpiiuuu_t fn = (vFpiiuuu_t)fcn; fn((void*)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (uint32_t)R_RCX, (uint32_t)R_R8, (uint32_t)R_R9); } void vFpipipV(x64emu_t *emu, uintptr_t fcn) { vFpipipV_t fn = (vFpipipV_t)fcn; fn((void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (int32_t)R_RCX, (void*)R_R8, (void*)(R_RSP + 8)); } void vFpipppi(x64emu_t *emu, uintptr_t fcn) { vFpipppi_t fn = (vFpipppi_t)fcn; fn((void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (int32_t)R_R9); } @@ -1874,6 +1878,7 @@ void vFuuffiip(x64emu_t *emu, uintptr_t fcn) { vFuuffiip_t fn = (vFuuffiip_t)fcn void vFuuddiip(x64emu_t *emu, uintptr_t fcn) { vFuuddiip_t fn = (vFuuddiip_t)fcn; fn((uint32_t)R_RDI, (uint32_t)R_RSI, emu->xmm[0].d[0], emu->xmm[1].d[0], (int32_t)R_RDX, (int32_t)R_RCX, (void*)R_R8); } void vFuffffff(x64emu_t *emu, uintptr_t fcn) { vFuffffff_t fn = (vFuffffff_t)fcn; fn((uint32_t)R_RDI, emu->xmm[0].f[0], emu->xmm[1].f[0], emu->xmm[2].f[0], emu->xmm[3].f[0], emu->xmm[4].f[0], emu->xmm[5].f[0]); } void vFudddddd(x64emu_t *emu, uintptr_t fcn) { vFudddddd_t fn = (vFudddddd_t)fcn; fn((uint32_t)R_RDI, emu->xmm[0].d[0], emu->xmm[1].d[0], emu->xmm[2].d[0], emu->xmm[3].d[0], emu->xmm[4].d[0], emu->xmm[5].d[0]); } +void vFpiiliip(x64emu_t *emu, uintptr_t fcn) { vFpiiliip_t fn = (vFpiiliip_t)fcn; fn((void*)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (intptr_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(void**)(R_RSP + 8)); } void vFpipipii(x64emu_t *emu, uintptr_t fcn) { vFpipipii_t fn = (vFpipipii_t)fcn; fn((void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (int32_t)R_RCX, (void*)R_R8, (int32_t)R_R9, *(int32_t*)(R_RSP + 8)); } void vFpddiidd(x64emu_t *emu, uintptr_t fcn) { vFpddiidd_t fn = (vFpddiidd_t)fcn; fn((void*)R_RDI, emu->xmm[0].d[0], emu->xmm[1].d[0], (int32_t)R_RSI, (int32_t)R_RDX, emu->xmm[2].d[0], emu->xmm[3].d[0]); } void vFppiiipi(x64emu_t *emu, uintptr_t fcn) { vFppiiipi_t fn = (vFppiiipi_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (void*)R_R9, *(int32_t*)(R_RSP + 8)); } @@ -2042,6 +2047,7 @@ void iFEppppiiiiuu(x64emu_t *emu, uintptr_t fcn) { iFEppppiiiiuu_t fn = (iFEpppp void iFiiiiiiiiiip(x64emu_t *emu, uintptr_t fcn) { iFiiiiiiiiiip_t fn = (iFiiiiiiiiiip_t)fcn; R_RAX=fn((int32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(int32_t*)(R_RSP + 8), *(int32_t*)(R_RSP + 16), *(int32_t*)(R_RSP + 24), *(int32_t*)(R_RSP + 32), *(void**)(R_RSP + 40)); } void iFpipllippppp(x64emu_t *emu, uintptr_t fcn) { iFpipllippppp_t fn = (iFpipllippppp_t)fcn; R_RAX=fn((void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (intptr_t)R_RCX, (intptr_t)R_R8, (int32_t)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24), *(void**)(R_RSP + 32), *(void**)(R_RSP + 40)); } void iFppppiiuuiiL(x64emu_t *emu, uintptr_t fcn) { iFppppiiuuiiL_t fn = (iFppppiiuuiiL_t)fcn; R_RAX=fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(uint32_t*)(R_RSP + 8), *(uint32_t*)(R_RSP + 16), *(int32_t*)(R_RSP + 24), *(int32_t*)(R_RSP + 32), *(uintptr_t*)(R_RSP + 40)); } +void pFEppiiLpppip(x64emu_t *emu, uintptr_t fcn) { pFEppiiLpppip_t fn = (pFEppiiLpppip_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (uintptr_t)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(int32_t*)(R_RSP + 24), *(void**)(R_RSP + 32)); } void pFEppuiipuuii(x64emu_t *emu, uintptr_t fcn) { pFEppuiipuuii_t fn = (pFEppuiipuuii_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (uint32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (void*)R_R9, *(uint32_t*)(R_RSP + 8), *(uint32_t*)(R_RSP + 16), *(int32_t*)(R_RSP + 24), *(int32_t*)(R_RSP + 32)); } void vFuuiiiiiiiuip(x64emu_t *emu, uintptr_t fcn) { vFuuiiiiiiiuip_t fn = (vFuuiiiiiiiuip_t)fcn; fn((uint32_t)R_RDI, (uint32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(int32_t*)(R_RSP + 8), *(int32_t*)(R_RSP + 16), *(int32_t*)(R_RSP + 24), *(uint32_t*)(R_RSP + 32), *(int32_t*)(R_RSP + 40), *(void**)(R_RSP + 48)); } void vFuuiiiiiiiuup(x64emu_t *emu, uintptr_t fcn) { vFuuiiiiiiiuup_t fn = (vFuuiiiiiiiuup_t)fcn; fn((uint32_t)R_RDI, (uint32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(int32_t*)(R_RSP + 8), *(int32_t*)(R_RSP + 16), *(int32_t*)(R_RSP + 24), *(uint32_t*)(R_RSP + 32), *(uint32_t*)(R_RSP + 40), *(void**)(R_RSP + 48)); } diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h index 1ed68d5e..a908a234 100644 --- a/src/wrapped/generated/wrapper.h +++ b/src/wrapped/generated/wrapper.h @@ -742,6 +742,7 @@ void vFupupip(x64emu_t *emu, uintptr_t fnc); void vFuppppp(x64emu_t *emu, uintptr_t fnc); void vFffffff(x64emu_t *emu, uintptr_t fnc); void vFdddddd(x64emu_t *emu, uintptr_t fnc); +void vFpiiiii(x64emu_t *emu, uintptr_t fnc); void vFpiiuuu(x64emu_t *emu, uintptr_t fnc); void vFpipipV(x64emu_t *emu, uintptr_t fnc); void vFpipppi(x64emu_t *emu, uintptr_t fnc); @@ -843,6 +844,7 @@ void vFuuffiip(x64emu_t *emu, uintptr_t fnc); void vFuuddiip(x64emu_t *emu, uintptr_t fnc); void vFuffffff(x64emu_t *emu, uintptr_t fnc); void vFudddddd(x64emu_t *emu, uintptr_t fnc); +void vFpiiliip(x64emu_t *emu, uintptr_t fnc); void vFpipipii(x64emu_t *emu, uintptr_t fnc); void vFpddiidd(x64emu_t *emu, uintptr_t fnc); void vFppiiipi(x64emu_t *emu, uintptr_t fnc); @@ -1011,6 +1013,7 @@ void iFEppppiiiiuu(x64emu_t *emu, uintptr_t fnc); void iFiiiiiiiiiip(x64emu_t *emu, uintptr_t fnc); void iFpipllippppp(x64emu_t *emu, uintptr_t fnc); void iFppppiiuuiiL(x64emu_t *emu, uintptr_t fnc); +void pFEppiiLpppip(x64emu_t *emu, uintptr_t fnc); void pFEppuiipuuii(x64emu_t *emu, uintptr_t fnc); void vFuuiiiiiiiuip(x64emu_t *emu, uintptr_t fnc); void vFuuiiiiiiiuup(x64emu_t *emu, uintptr_t fnc); diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index cb99170a..21329bef 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -1658,54 +1658,6 @@ EXPORT int32_t my___cxa_thread_atexit_impl(x64emu_t* emu, void* dtor, void* obj, return 0; } -extern void __chk_fail(); -EXPORT unsigned long int my___fdelt_chk (unsigned long int d) -{ - if (d >= FD_SETSIZE) - __chk_fail (); - - return d / __NFDBITS; -} -#if 0 -EXPORT int32_t my_getrandom(x64emu_t* emu, void* buf, uint32_t buflen, uint32_t flags) -{ - // not always implemented on old linux version... - library_t* lib = my_lib; - if(!lib) return 0; - void* f = dlsym(lib->priv.w.lib, "getrandom"); - if(f) - return ((iFpuu_t)f)(buf, buflen, flags); - // do what should not be done, but it's better then nothing.... - FILE * rnd = fopen("/dev/urandom", "rb"); - uint32_t r = fread(buf, 1, buflen, rnd); - fclose(rnd); - return r; -} - -EXPORT int32_t my_recvmmsg(x64emu_t* emu, int32_t fd, void* msgvec, uint32_t vlen, uint32_t flags, void* timeout) -{ - // Implemented starting glibc 2.12+ - library_t* lib = my_lib; - if(!lib) return 0; - void* f = dlsym(lib->priv.w.lib, "recvmmsg"); - if(f) - return ((iFipuup_t)f)(fd, msgvec, vlen, flags, timeout); - // Use the syscall - return syscall(__NR_recvmmsg, fd, msgvec, vlen, flags, timeout); -} - -EXPORT int32_t my___sendmmsg(x64emu_t* emu, int32_t fd, void* msgvec, uint32_t vlen, uint32_t flags) -{ - // Implemented starting glibc 2.14+ - library_t* lib = my_lib; - if(!lib) return 0; - void* f = dlsym(lib->priv.w.lib, "__sendmmsg"); - if(f) - return ((iFipuu_t)f)(fd, msgvec, vlen, flags); - // Use the syscall - return syscall(__NR_sendmmsg, fd, msgvec, vlen, flags); -} - EXPORT int32_t my___register_atfork(x64emu_t *emu, void* prepare, void* parent, void* child, void* handle) { // this is partly incorrect, because the emulated funcionts should be executed by actual fork and not by my_atfork... @@ -1719,7 +1671,7 @@ EXPORT int32_t my___register_atfork(x64emu_t *emu, void* prepare, void* parent, my_context->atforks[my_context->atfork_sz].handle = handle; return 0; } - +#if 0 EXPORT uint64_t my___umoddi3(uint64_t a, uint64_t b) { return a%b; diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h index 55e4948c..fc1273be 100755 --- a/src/wrapped/wrappedlibc_private.h +++ b/src/wrapped/wrappedlibc_private.h @@ -18,8 +18,8 @@ GOW(access, iFpi) //GOW(advance, //GO(alarm, //GOW(aligned_alloc, -//GOW(alphasort, -//GOW(alphasort64, +GOW(alphasort, iFpp) +GOW(alphasort64, iFpp) //GO(__arch_prctl, //GOW(arch_prctl, //DATA(argp_err_exit_status, @@ -298,9 +298,9 @@ GOW(_Exit, vFi) //GO(__fbufsize, //GOW(fchdir, //GO(fchflags, -//GOW(fchmod, +GOW(fchmod, iFiu) //GO(fchmodat, -//GOW(fchown, +GOW(fchown, iFiuu) //GO(fchownat, GO(fclose, iFp) GOW(fcloseall, iFv) diff --git a/src/wrapped/wrappedlibice.c b/src/wrapped/wrappedlibice.c new file mode 100755 index 00000000..32334441 --- /dev/null +++ b/src/wrapped/wrappedlibice.c @@ -0,0 +1,59 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#define _GNU_SOURCE /* See feature_test_macros(7) */ +#include <dlfcn.h> + +#include "wrappedlibs.h" + +#include "debug.h" +#include "wrapper.h" +#include "bridge.h" +#include "librarian/library_private.h" +#include "x64emu.h" +#include "emu/x64emu_private.h" +#include "callback.h" +#include "librarian.h" +#include "box64context.h" +#include "emu/x64emu_private.h" +#include "myalign.h" + +const char* libiceName = "libICE.so.6"; +#define LIBNAME libice + +#if 0 +#define SUPER() + GO(BZ2_bzCompressInit, iFpiii_t) + +typedef struct libice_my_s { + // functions + #define GO(A, B) B A; + SUPER() + #undef GO +} libice_my_t; + +void* getICEMy(library_t* lib) +{ + libice_my_t* my = (libice_my_t*)calloc(1, sizeof(libice_my_t)); + #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A); + SUPER() + #undef GO + return my; +} +#undef SUPER + +void freeICEMy(void* lib) +{ + libice_my_t *my = (libice_my_t *)lib; +} + +#define CUSTOM_INIT \ + lib->priv.w.p2 = getICEMy(lib); + +#define CUSTOM_FINI \ + freeICEMy(lib->priv.w.p2); \ + free(lib->priv.w.p2); +#endif + +#include "wrappedlib_init.h" + diff --git a/src/wrapped/wrappedlibice_private.h b/src/wrapped/wrappedlibice_private.h new file mode 100755 index 00000000..813d5991 --- /dev/null +++ b/src/wrapped/wrappedlibice_private.h @@ -0,0 +1,113 @@ +#if !(defined(GO) && defined(GOM) && defined(GO2) && defined(DATA)) +#error meh! +#endif + +//GO(IceAcceptConnection, +//GO(IceAddConnectionWatch, +//GO(_IceAddOpcodeMapping, +//GO(_IceAddReplyWait, +//GO(IceAllocScratch, +//GO(IceAppLockConn, +//GO(IceAppUnlockConn, +//GO(IceAuthFileName, +//GO(_IceCheckReplyReady, +//GO(IceCheckShutdownNegotiation, +//GO(IceCloseConnection, +//GO(IceComposeNetworkIdList, +//GO(_IceConnectionClosed, +GO(IceConnectionNumber, iFp) +//GO(_IceConnectionOpened, +//GO(IceConnectionStatus, +//GO(IceConnectionString, +//GO(_IceErrorAuthenticationFailed, +//GO(_IceErrorAuthenticationRejected, +//GO(_IceErrorBadLength, +//GO(_IceErrorBadMajor, +//GO(_IceErrorBadMinor, +//GO(_IceErrorBadState, +//GO(_IceErrorBadValue, +//GO(_IceErrorMajorOpcodeDuplicate, +//GO(_IceErrorNoAuthentication, +//GO(_IceErrorNoVersion, +//GO(_IceErrorProtocolDuplicate, +//GO(_IceErrorSetupFailed, +//GO(_IceErrorUnknownProtocol, +//GO(IceFlush, +//GO(IceFreeAuthFileEntry, +//GO(_IceFreeConnection, +//GO(IceFreeListenObjs, +//GO(IceGenerateMagicCookie, +//GO(IceGetAuthFileEntry, +//GO(IceGetConnectionContext, +//GO(IceGetInBufSize, +//GO(IceGetListenConnectionNumber, +//GO(IceGetListenConnectionString, +//GO(IceGetOutBufSize, +//GO(_IceGetPaAuthData, +//GO(_IceGetPaValidAuthIndices, +//GO(IceGetPeerName, +//GO(_IceGetPeerName, +//GO(_IceGetPoAuthData, +//GO(_IceGetPoValidAuthIndices, +//GO(IceInitThreads, +//GO(IceLastReceivedSequenceNumber, +//GO(IceLastSentSequenceNumber, +//GO(IceListenForConnections, +//GO(IceListenForWellKnownConnections, +//GO(IceLockAuthFile, +//GO(IceOpenConnection, +//GO(_IcePaMagicCookie1Proc, +//GO(IcePing, +//GO(_IcePoMagicCookie1Proc, +GO(IceProcessMessages, iFppp) +//GO(IceProtocolRevision, +//GO(IceProtocolSetup, +//GO(IceProtocolShutdown, +//GO(IceProtocolVersion, +//GO(_IceRead, +//GO(IceReadAuthFileEntry, +//GO(_IceReadSkip, +//GO(IceRegisterForProtocolReply, +//GO(IceRegisterForProtocolSetup, +//GO(IceRelease, +//GO(IceRemoveConnectionWatch, +//GO(_IceSearchReplyWaits, +//GO(IceSetErrorHandler, +//GO(IceSetHostBasedAuthProc, +//GO(IceSetIOErrorHandler, +//GO(IceSetPaAuthData, +//GO(_IceSetReplyReady, +//GO(IceSetShutdownNegotiation, +//GO(IceSwapping, +//GO(_IceTransAccept, +//GO(_IceTransBytesReadable, +//GO(_IceTransClose, +//GO(_IceTransCloseForCloning, +//GO(_IceTransConnect, +//GO(_IceTransCreateListener, +//GO(_IceTransDisconnect, +//GO(_IceTransFreeConnInfo, +//GO(_IceTransGetConnectionNumber, +//GO(_IceTransGetHostname, +//GO(_IceTransGetMyAddr, +//GO(_IceTransGetMyNetworkId, +//GO(_IceTransGetPeerAddr, +//GO(_IceTransGetPeerNetworkId, +//GO(_IceTransIsLocal, +//GO(_IceTransMakeAllCLTSServerListeners, +//GO(_IceTransMakeAllCOTSServerListeners, +//GO(_IceTransNoListen, +//GO(_IceTransOpenCLTSClient, +//GO(_IceTransOpenCLTSServer, +//GO(_IceTransOpenCOTSClient, +//GO(_IceTransOpenCOTSServer, +//GO(_IceTransRead, +//GO(_IceTransReadv, +//GO(_IceTransResetListener, +//GO(_IceTransSetOption, +//GO(_IceTransWrite, +//GO(_IceTransWritev, +//GO(IceUnlockAuthFile, +//GO(IceVendor, +//GO(_IceWrite, +//GO(IceWriteAuthFileEntry, diff --git a/src/wrapped/wrappedlibsm.c b/src/wrapped/wrappedlibsm.c new file mode 100755 index 00000000..75f08e98 --- /dev/null +++ b/src/wrapped/wrappedlibsm.c @@ -0,0 +1,175 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#define _GNU_SOURCE /* See feature_test_macros(7) */ +#include <dlfcn.h> + +#include "wrappedlibs.h" + +#include "debug.h" +#include "wrapper.h" +#include "bridge.h" +#include "librarian/library_private.h" +#include "x64emu.h" +#include "emu/x64emu_private.h" +#include "callback.h" +#include "librarian.h" +#include "box64context.h" +#include "emu/x64emu_private.h" +#include "myalign.h" + +const char* libsmName = "libSM.so.6"; +#define LIBNAME libsm + +typedef int (*iFppp_t) (void*, void*, void*); +typedef int (*iFpipp_t) (void*, int, void*, void*); +typedef void* (*pFppiiLpppip_t) (void*, void*, int, int, unsigned long, void*, void*, void*, int, void*); + +#define SUPER() \ + GO(SmcOpenConnection, pFppiiLpppip_t) \ + GO(SmcInteractRequest, iFpipp_t) \ + GO(SmcRequestSaveYourselfPhase2, iFppp_t) + +typedef struct libsm_my_s { + // functions + #define GO(A, B) B A; + SUPER() + #undef GO +} libsm_my_t; + +void* getSMMy(library_t* lib) +{ + libsm_my_t* my = (libsm_my_t*)calloc(1, sizeof(libsm_my_t)); + #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A); + SUPER() + #undef GO + return my; +} +#undef SUPER + +void freeSMMy(void* lib) +{ + //libsm_my_t *my = (libsm_my_t *)lib; +} + +typedef struct my_SmcCallbacks_s { + struct { + void* callback; + void* client_data; + } save_yourself; + + struct { + void* callback; + void* client_data; + } die; + + struct { + void* callback; + void* client_data; + } save_complete; + + struct { + void* callback; + void* client_data; + } shutdown_cancelled; +} my_SmcCallbacks_t; +#define SmcSaveYourselfProcMask (1L << 0) +#define SmcDieProcMask (1L << 1) +#define SmcSaveCompleteProcMask (1L << 2) +#define SmcShutdownCancelledProcMask (1L << 3) + +static uintptr_t my_save_yourself_fct = 0; +static void my_save_yourself(void* smcConn, void* clientData, int saveType, int shutdown, int interactStyle, int fast) +{ + RunFunction(my_context, my_save_yourself_fct, 6, smcConn, clientData, saveType, shutdown, interactStyle, fast); +} + +static uintptr_t my_die_fct = 0; +static void my_die(void* smcConn, void* clientData) +{ + RunFunction(my_context, my_die_fct, 2, smcConn, clientData); +} + +static uintptr_t my_shutdown_cancelled_fct = 0; +static void my_shutdown_cancelled(void* smcConn, void* clientData) +{ + RunFunction(my_context, my_shutdown_cancelled_fct, 2, smcConn, clientData); +} + +static uintptr_t my_save_complete_fct = 0; +static void my_save_complete(void* smcConn, void* clientData) +{ + RunFunction(my_context, my_save_complete_fct, 2, smcConn, clientData); +} + + +EXPORT void* my_SmcOpenConnection(x64emu_t* emu, void* networkIdsList, void* context, int major, int minor, unsigned long mask, my_SmcCallbacks_t* cb, void* previousId, void* clientIdRet, int errorLength, void* errorRet) +{ + libsm_my_t* my = (libsm_my_t*)GetLibInternal(libsmName)->priv.w.p2; + my_SmcCallbacks_t nat = {0}; + #define GO(A, B) if(mask&A) {my_##B##_fct = (uintptr_t)cb->B.callback; nat.B.callback = my_##B; nat.B.client_data=cb->B.client_data;} + GO(SmcSaveYourselfProcMask, save_yourself) + GO(SmcDieProcMask, die) + GO(SmcSaveCompleteProcMask, save_complete) + GO(SmcShutdownCancelledProcMask, shutdown_cancelled) + #undef GO + return my->SmcOpenConnection(networkIdsList, context, major, minor, mask, &nat, previousId, clientIdRet, errorLength, errorRet); +} + +// utility functions +#define SUPER() \ +GO(0) \ +GO(1) \ +GO(2) \ +GO(3) \ +GO(4) + +// Request +#define GO(A) \ +static uintptr_t my_Request_fct_##A = 0; \ +static void my_Request_##A(void* a, void* b) \ +{ \ + RunFunction(my_context, my_Request_fct_##A, 2, a, b);\ +} +SUPER() +#undef GO +static void* findRequestFct(void* fct) +{ + if(!fct) return NULL; + void* p; + if((p = GetNativeFnc((uintptr_t)fct))) return p; + #define GO(A) if(my_Request_fct_##A == (uintptr_t)fct) return my_Request_##A; + SUPER() + #undef GO + #define GO(A) if(my_Request_fct_##A == 0) {my_Request_fct_##A = (uintptr_t)fct; return my_Request_##A; } + SUPER() + #undef GO + printf_log(LOG_NONE, "Warning, no more slot for libSM Request callback\n"); + return NULL; +} + +#undef SUPER + +EXPORT int my_SmcInteractRequest(x64emu_t* emu, void* smcConn, int f, void* cb, void* data) +{ + libsm_my_t* my = (libsm_my_t*)GetLibInternal(libsmName)->priv.w.p2; + + return my->SmcInteractRequest(smcConn, f, findRequestFct(cb), data); +} + +EXPORT int my_SmcRequestSaveYourselfPhase2(x64emu_t* emu, void* smcConn, void* cb, void* data) +{ + libsm_my_t* my = (libsm_my_t*)GetLibInternal(libsmName)->priv.w.p2; + + return my->SmcRequestSaveYourselfPhase2(smcConn, findRequestFct(cb), data); +} + +#define CUSTOM_INIT \ + lib->priv.w.p2 = getSMMy(lib); + +#define CUSTOM_FINI \ + freeSMMy(lib->priv.w.p2); \ + free(lib->priv.w.p2); + +#include "wrappedlib_init.h" + diff --git a/src/wrapped/wrappedlibsm_private.h b/src/wrapped/wrappedlibsm_private.h new file mode 100755 index 00000000..bc00fca9 --- /dev/null +++ b/src/wrapped/wrappedlibsm_private.h @@ -0,0 +1,45 @@ +#if !(defined(GO) && defined(GOM) && defined(GO2) && defined(DATA)) +#error meh! +#endif + +GO(SmcClientID, pFp) +GO(SmcCloseConnection, iFpip) +GO(_SmcDefaultErrorHandler, vFpiiliip) +GO(SmcDeleteProperties, vFpip) +GO(SmcGetIceConnection, pFp) +//GOM(SmcGetProperties, iFEpBp) +GO(SmcInteractDone, iFpi) +GOM(SmcInteractRequest, iFEpipp) +//GOM(SmcModifyCallbacks, vFEpuB) +GOM(SmcOpenConnection, pFEppiiLpppip) +//GO(_SmcProcessMessage, +GO(SmcProtocolRevision, iFp) +GO(SmcProtocolVersion, iFp) +GO(SmcRelease, pFp) +GO(SmcRequestSaveYourself, vFpiiiii) +GOM(SmcRequestSaveYourselfPhase2, iFEppp) +GO(SmcSaveYourselfDone, vFpi) +//GOM(SmcSetErrorHandler, BFEB) +GO(SmcSetProperties, vFpip) +GO(SmcVendor, pFp) +GO(SmFreeProperty, vFp) +GO(SmFreeReasons, vFpp) +GO(SmsCleanUp, vFp) +GO(SmsClientHostName, pFp) +GO(SmsClientID, pFp) +GO(_SmsDefaultErrorHandler, vFpiiliip) +GO(SmsDie, vFp) +GO(SmsGenerateClientID, pFp) +GO(SmsGetIceConnection, pFp) +//GOM(SmsInitialize, iFppBpBip) +GO(SmsInteract, vFp) +//GO(_SmsProcessMessage, +GO(SmsProtocolRevision, iFp) +GO(SmsProtocolVersion, iFp) +GO(SmsRegisterClientReply, iFpp) +GO(SmsReturnProperties, vFpip) +GO(SmsSaveComplete, vFp) +GO(SmsSaveYourself, vFpiiii) +GO(SmsSaveYourselfPhase2, vFp) +//GOM(SmsSetErrorHandler, BFEB) +GO(SmsShutdownCancelled, vFp) |