From 2e04ff93cabdbdcef060ce5e40f544f4dd6f93bb Mon Sep 17 00:00:00 2001 From: rajdakin Date: Sun, 8 Sep 2024 15:10:45 +0200 Subject: [WRAPPED] Fixed some libc wrapped functions (#1806) * [WRAPPED] Fixed some libc wrapped functions * [WRAPPED] Fixed static build, added back * [WRAPPED] Fixed unlimited wrapping * [WRAPPED] Forgot to update --- src/wrapped/wrappedlibc.c | 101 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 83 insertions(+), 18 deletions(-) (limited to 'src/wrapped/wrappedlibc.c') diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index 71b6ccbe..5333b90b 100644 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -41,6 +41,7 @@ #include #include #include +#include #undef LOG_INFO #undef LOG_DEBUG @@ -902,6 +903,14 @@ EXPORT int my_vsprintf(x64emu_t* emu, void* buff, void * fmt, x64_va_list_t b) } EXPORT int my___vsprintf_chk(x64emu_t* emu, void* buff, void * fmt, x64_va_list_t b) __attribute__((alias("my_vsprintf"))); +EXPORT int my_scanf(x64emu_t* emu, void* fmt, uint64_t* b) +{ + myStackAlignScanf(emu, (const char*)fmt, b, emu->scratch, 1); + PREPARE_VALIST; + + return vscanf(fmt, VARARGS); +} + EXPORT int my_vfscanf(x64emu_t* emu, void* stream, void* fmt, x64_va_list_t b) { (void)emu; @@ -928,6 +937,38 @@ EXPORT int my_vsscanf(x64emu_t* emu, void* stream, void* fmt, x64_va_list_t b) EXPORT int my___vsscanf(x64emu_t* emu, void* stream, void* fmt, void* b) __attribute__((alias("my_vsscanf"))); +EXPORT int my_vfwscanf(x64emu_t* emu, void* F, void* fmt, x64_va_list_t b) +{ + (void)emu; + #ifdef CONVERT_VALIST + CONVERT_VALIST(b); + #else + myStackAlignScanfWValist(emu, (const char*)fmt, emu->scratch, b); + PREPARE_VALIST; + #endif + return vfwscanf(F, fmt, VARARGS); +} + +EXPORT int my_vwscanf(x64emu_t* emu, void* fmt, x64_va_list_t b) +{ + (void)emu; + #ifdef CONVERT_VALIST + CONVERT_VALIST(b); + #else + myStackAlignScanfWValist(emu, (const char*)fmt, emu->scratch, b); + PREPARE_VALIST; + #endif + return vwscanf(fmt, VARARGS); +} + +EXPORT int my_wscanf(x64emu_t* emu, void* fmt, uint64_t* b) +{ + myStackAlignScanfW(emu, (const char*)fmt, b, emu->scratch, 1); + PREPARE_VALIST; + + return vwscanf(fmt, VARARGS); +} + EXPORT int my_vswscanf(x64emu_t* emu, void* stream, void* fmt, x64_va_list_t b) { (void)emu; @@ -1078,31 +1119,43 @@ EXPORT int my_swscanf(x64emu_t* emu, void* stream, void* fmt, uint64_t* b) return vswscanf(stream, fmt, VARARGS); } -#if 0 -EXPORT void my_verr(x64emu_t* emu, int eval, void* fmt, void* b) { - #ifndef NOALIGN - myStackAlignW((const char*)fmt, (uint32_t*)b, emu->scratch); +EXPORT void my_error(x64emu_t *emu, int status, int errnum, void* fmt, void* b) { + myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 3); PREPARE_VALIST; - void* f = verr; - ((vFipp_t)f)(eval, fmt, VARARGS); - #else - void* f = verr; - ((vFipp_t)f)(eval, fmt, (uint32_t*)b); - #endif + char buf[512]; + vsnprintf(buf, 512, (const char*)fmt, VARARGS); + error(status, errnum, "%s", buf); +} +EXPORT void my_error_at_line(x64emu_t *emu, int status, int errnum, void* filename, uint32_t linenum, void* fmt, void* b) { + myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 5); + PREPARE_VALIST; + char buf[512]; + vsnprintf(buf, 512, (const char*)fmt, VARARGS); + error_at_line(status, errnum, filename, linenum, "%s", buf); } -EXPORT void my_vwarn(x64emu_t* emu, void* fmt, void* b) { - #ifndef NOALIGN - myStackAlignW((const char*)fmt, (uint32_t*)b, emu->scratch); +EXPORT void my_verr(x64emu_t* emu, int eval, void* fmt, x64_va_list_t b) { + if (!fmt) + return err(eval, NULL); + #ifdef CONVERT_VALIST + (void)emu; + CONVERT_VALIST(b); + #else + myStackAlignValist(emu, (const char*)fmt, emu->scratch, b); PREPARE_VALIST; - void* f = vwarn; - ((vFpp_t)f)(fmt, VARARGS); + #endif + return verr(eval, fmt, VARARGS); +} +EXPORT void my_verrx(x64emu_t* emu, int eval, void* fmt, x64_va_list_t b) { + #ifdef CONVERT_VALIST + (void)emu; + CONVERT_VALIST(b); #else - void* f = vwarn; - ((vFpp_t)f)(fmt, (uint32_t*)b); + myStackAlignValist(emu, (const char*)fmt, emu->scratch, b); + PREPARE_VALIST; #endif + return verrx(eval, fmt, VARARGS); } -#endif EXPORT void my_err(x64emu_t *emu, int eval, void* fmt, void* b) { myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 2); PREPARE_VALIST; @@ -1113,6 +1166,18 @@ EXPORT void my_errx(x64emu_t *emu, int eval, void* fmt, void* b) { PREPARE_VALIST; verrx(eval, (const char*)fmt, VARARGS); } +EXPORT void my_vwarn(x64emu_t* emu, void* fmt, x64_va_list_t b) { + if (!fmt) + return warn(NULL); + #ifdef CONVERT_VALIST + (void)emu; + CONVERT_VALIST(b); + #else + myStackAlignValist(emu, (const char*)fmt, emu->scratch, b); + PREPARE_VALIST; + #endif + return vwarn(fmt, VARARGS); +} EXPORT void my_warn(x64emu_t *emu, void* fmt, void* b) { myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 1); PREPARE_VALIST; -- cgit 1.4.1