diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-08 17:06:49 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-08 17:06:49 +0200 |
| commit | b038dd5c9d13be1f6e0e8355b1d503e0a9d45f3b (patch) | |
| tree | a933fca235a65567a2aba482a1cb94a2de151e36 /src | |
| parent | 2681a6db0d28e44ddd8012fcc63d1ff79af727ef (diff) | |
| download | box64-b038dd5c9d13be1f6e0e8355b1d503e0a9d45f3b.tar.gz box64-b038dd5c9d13be1f6e0e8355b1d503e0a9d45f3b.zip | |
Added a libvorbisfile wrapped function and fixed another one (structure as argument are in the stack, always)
Diffstat (limited to 'src')
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 2 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 4 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 4 | ||||
| -rwxr-xr-x | src/wrapped/wrappedvorbisfile.c | 24 | ||||
| -rwxr-xr-x | src/wrapped/wrappedvorbisfile_private.h | 4 |
5 files changed, 25 insertions, 13 deletions
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt index 9195cba4..b9612157 100644 --- a/src/wrapped/generated/functions_list.txt +++ b/src/wrapped/generated/functions_list.txt @@ -1080,7 +1080,7 @@ #() vFpplpppppi #() vFpppppippp #() iFEpiiiiipi -#() iFEpppipppp +#() iFEppplPPPP #() iFiiiiiiiip #() iFiiiipiiip #() iFipiipippi diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c index dcefdbc7..f429faf7 100644 --- a/src/wrapped/generated/wrapper.c +++ b/src/wrapped/generated/wrapper.c @@ -1113,7 +1113,7 @@ typedef void (*vFppiiipiii_t)(void*, void*, int64_t, int64_t, int64_t, void*, in typedef void (*vFpplpppppi_t)(void*, void*, intptr_t, void*, void*, void*, void*, void*, int64_t); typedef void (*vFpppppippp_t)(void*, void*, void*, void*, void*, int64_t, void*, void*, void*); typedef int64_t (*iFEpiiiiipi_t)(x64emu_t*, void*, int64_t, int64_t, int64_t, int64_t, int64_t, void*, int64_t); -typedef int64_t (*iFEpppipppp_t)(x64emu_t*, void*, void*, void*, int64_t, void*, void*, void*, void*); +typedef int64_t (*iFEppplPPPP_t)(x64emu_t*, void*, void*, void*, intptr_t, void*, void*, void*, void*); typedef int64_t (*iFiiiiiiiip_t)(int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, void*); typedef int64_t (*iFiiiipiiip_t)(int64_t, int64_t, int64_t, int64_t, void*, int64_t, int64_t, int64_t, void*); typedef int64_t (*iFipiipippi_t)(int64_t, void*, int64_t, int64_t, void*, int64_t, void*, void*, int64_t); @@ -2304,7 +2304,7 @@ void vFppiiipiii(x64emu_t *emu, uintptr_t fcn) { vFppiiipiii_t fn = (vFppiiipiii void vFpplpppppi(x64emu_t *emu, uintptr_t fcn) { vFpplpppppi_t fn = (vFpplpppppi_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (intptr_t)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(int64_t*)(R_RSP + 24)); } void vFpppppippp(x64emu_t *emu, uintptr_t fcn) { vFpppppippp_t fn = (vFpppppippp_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (int64_t)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24)); } void iFEpiiiiipi(x64emu_t *emu, uintptr_t fcn) { iFEpiiiiipi_t fn = (iFEpiiiiipi_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RDI, (int64_t)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (int64_t)R_R8, (int64_t)R_R9, *(void**)(R_RSP + 8), *(int64_t*)(R_RSP + 16)); } -void iFEpppipppp(x64emu_t *emu, uintptr_t fcn) { iFEpppipppp_t fn = (iFEpppipppp_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (int64_t)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16)); } +void iFEppplPPPP(x64emu_t *emu, uintptr_t fcn) { iFEppplPPPP_t fn = (iFEppplPPPP_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (intptr_t)R_RCX, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24), *(void**)(R_RSP + 32)); } void iFiiiiiiiip(x64emu_t *emu, uintptr_t fcn) { iFiiiiiiiip_t fn = (iFiiiiiiiip_t)fcn; R_RAX=(int64_t)fn((int64_t)R_RDI, (int64_t)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (int64_t)R_R8, (int64_t)R_R9, *(int64_t*)(R_RSP + 8), *(int64_t*)(R_RSP + 16), *(void**)(R_RSP + 24)); } void iFiiiipiiip(x64emu_t *emu, uintptr_t fcn) { iFiiiipiiip_t fn = (iFiiiipiiip_t)fcn; R_RAX=(int64_t)fn((int64_t)R_RDI, (int64_t)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (void*)R_R8, (int64_t)R_R9, *(int64_t*)(R_RSP + 8), *(int64_t*)(R_RSP + 16), *(void**)(R_RSP + 24)); } void iFipiipippi(x64emu_t *emu, uintptr_t fcn) { iFipiipippi_t fn = (iFipiipippi_t)fcn; R_RAX=(int64_t)fn((int64_t)R_RDI, (void*)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (void*)R_R8, (int64_t)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(int64_t*)(R_RSP + 24)); } diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h index e465ad06..c291cf73 100644 --- a/src/wrapped/generated/wrapper.h +++ b/src/wrapped/generated/wrapper.h @@ -14,7 +14,7 @@ typedef void (*wrapper_t)(x64emu_t* emu, uintptr_t fnc); // list of defined wrapper // v = void, i = int32, u = uint32, U/I= (u)int64 // l = signed long, L = unsigned long (long is an int with the size of a pointer) -// p = pointer, P = callback +// p = pointer, P = void* on the stack // f = float, d = double, D = long double, K = fake long double // V = vaargs, E = current x86emu struct, e = ref to current x86emu struct // 0 = constant 0, 1 = constant 1 @@ -1110,7 +1110,7 @@ void vFppiiipiii(x64emu_t *emu, uintptr_t fnc); void vFpplpppppi(x64emu_t *emu, uintptr_t fnc); void vFpppppippp(x64emu_t *emu, uintptr_t fnc); void iFEpiiiiipi(x64emu_t *emu, uintptr_t fnc); -void iFEpppipppp(x64emu_t *emu, uintptr_t fnc); +void iFEppplPPPP(x64emu_t *emu, uintptr_t fnc); void iFiiiiiiiip(x64emu_t *emu, uintptr_t fnc); void iFiiiipiiip(x64emu_t *emu, uintptr_t fnc); void iFipiipippi(x64emu_t *emu, uintptr_t fnc); diff --git a/src/wrapped/wrappedvorbisfile.c b/src/wrapped/wrappedvorbisfile.c index 36dfb357..b342523e 100755 --- a/src/wrapped/wrappedvorbisfile.c +++ b/src/wrapped/wrappedvorbisfile.c @@ -28,18 +28,20 @@ typedef struct { long (*tell_func) (void *datasource); } ov_callbacks; -typedef int32_t (*iFpppiC_t)(void*, void*, void*, int32_t, ov_callbacks); +typedef int32_t (*iFppplC_t)(void*, void*, void*, long, ov_callbacks); typedef struct vorbisfile_my_s { // functions - iFpppiC_t ov_open_callbacks; + iFppplC_t ov_open_callbacks; + iFppplC_t ov_test_callbacks; } vorbisfile_my_t; void* getVorbisfileMy(library_t* lib) { vorbisfile_my_t* my = (vorbisfile_my_t*)calloc(1, sizeof(vorbisfile_my_t)); #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A); - GO(ov_open_callbacks, iFpppiC_t) + GO(ov_open_callbacks, iFppplC_t) + GO(ov_test_callbacks, iFppplC_t) #undef GO return my; } @@ -49,8 +51,6 @@ void freeVorbisfileMy(void* lib) //vorbisfile_my_t *my = (vorbisfile_my_t *)lib; } -int32_t my_ov_open_callbacks(x64emu_t* emu, void* datasource, void* vf, void* initial, int32_t ibytes, void* read, void* seek, void* close, void* tell); - #define CUSTOM_INIT \ box64->vorbisfile = lib;\ lib->priv.w.p2 = getVorbisfileMy(lib); @@ -163,7 +163,7 @@ static void* findtellFct(void* fct) #undef SUPER -EXPORT int32_t my_ov_open_callbacks(x64emu_t* emu, void* datasource, void* vf, void* initial, int32_t ibytes, void* read_fnc, void* seek_fnc, void* close_fnc, void* tell_fnc) +EXPORT int32_t my_ov_open_callbacks(x64emu_t* emu, void* datasource, void* vf, void* initial, long ibytes, void* read_fnc, void* seek_fnc, void* close_fnc, void* tell_fnc) { vorbisfile_my_t* my = (vorbisfile_my_t*)emu->context->vorbisfile->priv.w.p2; ov_callbacks cbs = {0}; @@ -174,3 +174,15 @@ EXPORT int32_t my_ov_open_callbacks(x64emu_t* emu, void* datasource, void* vf, v int32_t ret = my->ov_open_callbacks(datasource, vf, initial, ibytes, cbs); return ret; } + +EXPORT int32_t my_ov_test_callbacks(x64emu_t* emu, void* datasource, void* vf, void* initial, long ibytes, void* read_fnc, void* seek_fnc, void* close_fnc, void* tell_fnc) +{ + vorbisfile_my_t* my = (vorbisfile_my_t*)emu->context->vorbisfile->priv.w.p2; + ov_callbacks cbs = {0}; + cbs.read_func = findreadFct(read_fnc); + cbs.seek_func = findseekFct(seek_fnc); + cbs.close_func = findcloseFct(close_fnc); + cbs.tell_func = findtellFct(tell_fnc); + int32_t ret = my->ov_test_callbacks(datasource, vf, initial, ibytes, cbs); + return ret; +} diff --git a/src/wrapped/wrappedvorbisfile_private.h b/src/wrapped/wrappedvorbisfile_private.h index 5cf5602c..d7213240 100755 --- a/src/wrapped/wrappedvorbisfile_private.h +++ b/src/wrapped/wrappedvorbisfile_private.h @@ -12,7 +12,7 @@ GO(ov_halfrate,iFpi) GO(ov_halfrate_p,iFp) GO(ov_info,pFpi) GO(ov_open,iFpppi) -GOM(ov_open_callbacks,iFEpppipppp) // ov_callbaks are not "by ref", so all 4 values are just on the stack +GOM(ov_open_callbacks,iFEppplPPPP) // ov_callbacks are not "by ref", so all 4 values are just on the stack GO(ov_pcm_seek,iFpI) GO(ov_pcm_seek_lap,iFpi) GO(ov_pcm_seek_page,iFpI) @@ -30,7 +30,7 @@ GO(ov_seekable,iFp) GO(ov_serialnumber,iFpi) GO(ov_streams,iFp) GO(ov_test,iFpppi) -//GO(ov_test_callbacks,iFpppiS) +GOM(ov_test_callbacks,iFEppplPPPP) GO(ov_test_open,iFp) GO(ov_time_seek,iFpd) GO(ov_time_seek_lap,iFpd) |