diff --git a/.travis.yml b/.travis.yml index 6c32c89..b4e70d1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -65,7 +65,7 @@ before_deploy: - versiontag="$(./gitrev.sh)" - (cd loader && make) - cp example_plugin/example_plugin.mod wiiu/plugins -- cp plugins/*.mod wiiu/plugins +- find plugins -type f -name "*.mod" | xargs -i cp {} wiiu/plugins - cp loader/meta/* wiiu/apps/wiiupluginloader - cp loader/wiiupluginloader.elf wiiu/apps/wiiupluginloader - zip -r WiiUPluginLoader_$versiontag.zip wiiu diff --git a/example_plugin/src/main.cpp b/example_plugin/src/main.cpp index 723f379..dee4ebd 100644 --- a/example_plugin/src/main.cpp +++ b/example_plugin/src/main.cpp @@ -11,7 +11,7 @@ WUPS_MODULE_VERSION("v1.0"); WUPS_MODULE_AUTHOR("Maschell"); WUPS_MODULE_LICENSE("BSD"); -INITIALIZE(){ +INITIALIZE(args){ InitOSFunctionPointers(); InitSocketFunctionPointers(); diff --git a/loader/src/common/common.h b/loader/src/common/common.h index 7d145fc..d187f55 100644 --- a/loader/src/common/common.h +++ b/loader/src/common/common.h @@ -19,14 +19,6 @@ extern "C" { #define ELF_DATA_SIZE (*(volatile unsigned int*)(MEM_BASE + 0x1300 + 0x04)) #define MAIN_ENTRY_ADDR (*(volatile unsigned int*)(MEM_BASE + 0x1400 + 0x00)) -#define SDUSB_MOUNTED_NONE 0 -#define SDUSB_MOUNTED_FAKE (1<<0) -#define SDUSB_MOUNTED_OS_SD (1<<1) -#define SDUSB_LIBIOSU_LOADED (1<<2) -#define SD_MOUNTED_LIBFAT (1<<3) -#define USB_MOUNTED_LIBFAT (1<<4) -#define USB_MOUNTED_LIBNTFS (1<<5) - #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 0 #endif diff --git a/loader/src/main.cpp b/loader/src/main.cpp index 8b2ed96..cfa31ac 100644 --- a/loader/src/main.cpp +++ b/loader/src/main.cpp @@ -7,6 +7,8 @@ #include #include +#include +#include #include #include @@ -65,7 +67,7 @@ extern "C" int Menu_Main(int argc, char **argv){ DEBUG_FUNCTION_LINE("Wii U Plugin System Loader %s\n",APP_VERSION); - setup_os_exceptions(); + //setup_os_exceptions(); DEBUG_FUNCTION_LINE("Mount SD partition\n"); Init_SD_USB(); @@ -129,9 +131,25 @@ void CallHook(wups_loader_hook_type_t hook_type){ void * func_ptr = hook_data->func_pointer; //TODO: Switch cases depending on arguments etc. // Adding arguments! + if(func_ptr != NULL){ - DEBUG_FUNCTION_LINE("Calling it! %08X\n",func_ptr); - ( (void (*)(void))((unsigned int*)func_ptr) )(); + if(hook_type == WUPS_LOADER_HOOK_INIT_FUNCTION){ + DEBUG_FUNCTION_LINE("Calling it! %08X\n",func_ptr); + wups_loader_init_args_t args; + args.device_mounted = gSDInitDone; + args.fs_wrapper.open_repl = (const void*)&open; + args.fs_wrapper.close_repl = (const void*)&close; + args.fs_wrapper.write_repl = (const void*)&write; + args.fs_wrapper.read_repl = (const void*)&read; + args.fs_wrapper.lseek_repl = (const void*)&lseek; + args.fs_wrapper.stat_repl = (const void*)&stat; + args.fs_wrapper.fstat_repl = (const void*)&fstat; + args.fs_wrapper.opendir_repl = (const void*)&opendir; + args.fs_wrapper.closedir_repl = (const void*)&closedir; + args.fs_wrapper.readdir_repl = (const void*)&readdir; + + ( (void (*)(wups_loader_init_args_t *))((unsigned int*)func_ptr) )(&args); + } }else{ DEBUG_FUNCTION_LINE("Was not defined\n"); } @@ -167,7 +185,7 @@ s32 isInMiiMakerHBL(){ #define PLUGIN_LOCATION_END_ADDRESS 0x01000000 bool loadSamplePlugins(){ - if((gSDInitDone & (SDUSB_MOUNTED_OS_SD | SD_MOUNTED_LIBFAT)) > 0){ + if((gSDInitDone & WUPS_SD_MOUNTED) > 0){ DEBUG_FUNCTION_LINE("Mounting successful. Loading modules\n"); std::vector modules; @@ -287,27 +305,27 @@ void Init_SD_USB() { } deleteDevTabsNames(); mount_fake(); - gSDInitDone |= SDUSB_MOUNTED_FAKE; + gSDInitDone |= WUPS_SDUSB_MOUNTED_FAKE; if(res < 0){ DEBUG_FUNCTION_LINE("IOSUHAX_open failed\n"); if((res = mount_sd_fat("sd")) >= 0){ DEBUG_FUNCTION_LINE("mount_sd_fat success\n"); - gSDInitDone |= SDUSB_MOUNTED_OS_SD; + gSDInitDone |= WUPS_SDUSB_MOUNTED_OS_SD; }else{ DEBUG_FUNCTION_LINE("mount_sd_fat failed %d\n",res); } }else{ DEBUG_FUNCTION_LINE("Using IOSUHAX for SD/USB access\n"); - gSDInitDone |= SDUSB_LIBIOSU_LOADED; + gSDInitDone |= WUPS_SDUSB_LIBIOSU_LOADED; int ntfs_mounts = mountAllNTFS(); if(ntfs_mounts > 0){ - gSDInitDone |= USB_MOUNTED_LIBNTFS; + gSDInitDone |= WUPS_USB_MOUNTED_LIBNTFS; } if(mount_libfatAll() == 0){ - gSDInitDone |= SD_MOUNTED_LIBFAT; - gSDInitDone |= USB_MOUNTED_LIBFAT; + gSDInitDone |= WUPS_SD_MOUNTED_LIBFAT; + gSDInitDone |= WUPS_USB_MOUNTED_LIBFAT; } } DEBUG_FUNCTION_LINE("%08X\n",gSDInitDone); @@ -316,43 +334,43 @@ void Init_SD_USB() { void DeInit_SD_USB(){ DEBUG_FUNCTION_LINE("Called this function.\n"); - if(gSDInitDone & SDUSB_MOUNTED_FAKE){ + if(gSDInitDone & WUPS_SDUSB_MOUNTED_FAKE){ DEBUG_FUNCTION_LINE("Unmounting fake\n"); unmount_fake(); - gSDInitDone &= ~SDUSB_MOUNTED_FAKE; + gSDInitDone &= ~WUPS_SDUSB_MOUNTED_FAKE; } - if(gSDInitDone & SDUSB_MOUNTED_OS_SD){ + if(gSDInitDone & WUPS_SDUSB_MOUNTED_OS_SD){ DEBUG_FUNCTION_LINE("Unmounting OS SD\n"); unmount_sd_fat("sd"); - gSDInitDone &= ~SDUSB_MOUNTED_OS_SD; + gSDInitDone &= ~WUPS_SDUSB_MOUNTED_OS_SD; } - if(gSDInitDone & SD_MOUNTED_LIBFAT){ + if(gSDInitDone & WUPS_SD_MOUNTED_LIBFAT){ DEBUG_FUNCTION_LINE("Unmounting LIBFAT SD\n"); unmount_libfat("sd"); - gSDInitDone &= ~SD_MOUNTED_LIBFAT; + gSDInitDone &= ~WUPS_SD_MOUNTED_LIBFAT; } - if(gSDInitDone & USB_MOUNTED_LIBFAT){ + if(gSDInitDone & WUPS_USB_MOUNTED_LIBFAT){ DEBUG_FUNCTION_LINE("Unmounting LIBFAT USB\n"); unmount_libfat("usb"); - gSDInitDone &= ~USB_MOUNTED_LIBFAT; + gSDInitDone &= ~WUPS_USB_MOUNTED_LIBFAT; } - if(gSDInitDone & USB_MOUNTED_LIBNTFS){ + if(gSDInitDone & WUPS_USB_MOUNTED_LIBNTFS){ DEBUG_FUNCTION_LINE("Unmounting LIBNTFS USB\n"); unmountAllNTFS(); - gSDInitDone &= ~USB_MOUNTED_LIBNTFS; + gSDInitDone &= ~WUPS_USB_MOUNTED_LIBNTFS; } - if(gSDInitDone & SDUSB_LIBIOSU_LOADED){ + if(gSDInitDone & WUPS_SDUSB_LIBIOSU_LOADED){ DEBUG_FUNCTION_LINE("Calling IOSUHAX_Close\n"); IOSUHAX_Close(); - gSDInitDone &= ~SDUSB_LIBIOSU_LOADED; + gSDInitDone &= ~WUPS_SDUSB_LIBIOSU_LOADED; } deleteDevTabsNames(); - if(gSDInitDone != SDUSB_MOUNTED_NONE){ + if(gSDInitDone != WUPS_SDUSB_MOUNTED_NONE){ DEBUG_FUNCTION_LINE("WARNING. Some devices are still mounted.\n"); } DEBUG_FUNCTION_LINE("Function end.\n"); diff --git a/plugins/hid_to_vpad/Makefile b/plugins/hid_to_vpad/Makefile index 7742655..f7d8f75 100644 --- a/plugins/hid_to_vpad/Makefile +++ b/plugins/hid_to_vpad/Makefile @@ -87,6 +87,7 @@ ASFLAGS := -mregnames # -Map: generate a map file LDFLAG_COMMON += -u wups_load -u wups_meta -u wups_hooks -T $(WUPSDIR)/wups.ld \ + -Wl,-wrap,open,-wrap,close,-wrap,write,-wrap,read,-wrap,lseek,-wrap,stat,-wrap,fstat,-wrap,opendir,-wrap,closedir,-wrap,readdir \ -Wl,-Map,$(notdir $@).map,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size,-wrap,_malloc_r,-wrap,_free_r,-wrap,_realloc_r,-wrap,_calloc_r,-wrap,_memalign_r,-wrap,_malloc_usable_size_r,--gc-sections LDFLAGS_MOD += $(LDFLAG_COMMON),--relocatable diff --git a/plugins/hid_to_vpad/src/main.cpp b/plugins/hid_to_vpad/src/main.cpp index 69f8819..4f810bb 100644 --- a/plugins/hid_to_vpad/src/main.cpp +++ b/plugins/hid_to_vpad/src/main.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -13,29 +14,40 @@ WUPS_MODULE_VERSION("v1.0"); WUPS_MODULE_AUTHOR("Maschell"); WUPS_MODULE_LICENSE("GPL"); +#define SD_PATH "sd:" +#define WIIU_PATH "/wiiu" +#define DEFAULT_HID_TO_VPAD_PATH SD_PATH WIIU_PATH "/apps/hidtovpad" -INITIALIZE(){ +INITIALIZE(args){ InitOSFunctionPointers(); InitSocketFunctionPointers(); InitVPadFunctionPointers(); InitProcUIFunctionPointers(); + InitPadScoreFunctionPointers(); log_init(); log_print("Init of hid_to_vpad!\n"); - - ControllerPatcher::Init(NULL); + if(args != NULL && (args->device_mounted & WUPS_SD_MOUNTED) > 0){ + DEBUG_FUNCTION_LINE("Loading with SD Access\n"); + ControllerPatcher::Init(CONTROLLER_PATCHER_PATH); + } else { + DEBUG_FUNCTION_LINE("Loading without SD Access\n"); + ControllerPatcher::Init(NULL); + } + ControllerPatcher::disableControllerMapping(); log_print("Start network server\n"); ControllerPatcher::startNetworkServer(); + //TODO: ControllerPatcher::DeInit() on restore. } DECL_FUNCTION(void, __PPCExit, void){ ControllerPatcher::resetCallbackData(); - ControllerPatcher::DeInit(); + ControllerPatcher::destroyConfigHelper(); ControllerPatcher::stopNetworkServer(); real___PPCExit(); } diff --git a/plugins/padcon/Makefile b/plugins/padcon/Makefile index 7296bb4..179c086 100644 --- a/plugins/padcon/Makefile +++ b/plugins/padcon/Makefile @@ -85,6 +85,7 @@ ASFLAGS := -mregnames # -Map: generate a map file LDFLAG_COMMON += -u wups_load -u wups_meta -u wups_hooks -T $(WUPSDIR)/wups.ld \ + -Wl,-wrap,open,-wrap,close,-wrap,write,-wrap,read,-wrap,lseek,-wrap,stat,-wrap,fstat,-wrap,opendir,-wrap,closedir,-wrap,readdir \ -Wl,-Map,$(notdir $@).map,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size,-wrap,_malloc_r,-wrap,_free_r,-wrap,_realloc_r,-wrap,_calloc_r,-wrap,_memalign_r,-wrap,_malloc_usable_size_r,--gc-sections LDFLAGS_MOD += $(LDFLAG_COMMON),--relocatable diff --git a/plugins/padcon/src/main.c b/plugins/padcon/src/main.c index 88b2534..931d797 100644 --- a/plugins/padcon/src/main.c +++ b/plugins/padcon/src/main.c @@ -11,7 +11,7 @@ WUPS_MODULE_AUTHOR("Maschell"); WUPS_MODULE_LICENSE("GPL"); -INITIALIZE(){ +INITIALIZE(args){ InitOSFunctionPointers(); InitSocketFunctionPointers(); InitVPadFunctionPointers(); diff --git a/plugins/sdcafiine/Makefile b/plugins/sdcafiine/Makefile index e86e51e..22e9221 100644 --- a/plugins/sdcafiine/Makefile +++ b/plugins/sdcafiine/Makefile @@ -88,7 +88,8 @@ ASFLAGS := -mregnames # -Map: generate a map file LDFLAG_COMMON += -u wups_load -u wups_meta -u wups_hooks -T $(WUPSDIR)/wups.ld \ - -Wl,-Map,$(notdir $@).map,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size,-wrap,_malloc_r,-wrap,_free_r,-wrap,_realloc_r,-wrap,_calloc_r,-wrap,_memalign_r,-wrap,_malloc_usable_size_r,--gc-sections + -Wl,-wrap,open,-wrap,close,-wrap,write,-wrap,read,-wrap,lseek,-wrap,stat,-wrap,fstat,-wrap,opendir,-wrap,closedir,-wrap,readdir \ + -Wl,-Map,$(notdir $@).map,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size,-wrap,_malloc_r,-wrap,_free_r,-wrap,_realloc_r,-wrap,_calloc_r,-wrap,_memalign_r,-wrap,_malloc_usable_size_r,-wrap,opendir,--gc-sections LDFLAGS_MOD += $(LDFLAG_COMMON),--relocatable LDFLAGS_ELF += --relocatable -s -T $(WUPSDIR)/wups_elf.ld @@ -160,7 +161,7 @@ export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ -L$(PORTLIBS)/lib export OUTPUT := $(CURDIR)/$(TARGET) -.PHONY: $(BUILD) clean install +.PHONY: all $(BUILD) clean install #--------------------------------------------------------------------------------- $(BUILD): diff --git a/plugins/sdcafiine/src/common/retain_vars.h b/plugins/sdcafiine/src/common/retain_vars.h index afda58f..51b70e9 100644 --- a/plugins/sdcafiine/src/common/retain_vars.h +++ b/plugins/sdcafiine/src/common/retain_vars.h @@ -11,5 +11,4 @@ extern volatile u8 gSDInitDone; extern char gModFolder[FS_MAX_ENTNAME_SIZE]; - #endif // RETAINS_VARS_H_ diff --git a/plugins/sdcafiine/src/main.cpp b/plugins/sdcafiine/src/main.cpp index a73cd7a..51b76aa 100644 --- a/plugins/sdcafiine/src/main.cpp +++ b/plugins/sdcafiine/src/main.cpp @@ -1,7 +1,5 @@ #include #include -#include -#include #include #include #include @@ -21,9 +19,10 @@ WUPS_MODULE_VERSION("v1.0"); WUPS_MODULE_AUTHOR("Maschell"); WUPS_MODULE_LICENSE("GPL"); -INITIALIZE(){ +INITIALIZE(args){ InitOSFunctionPointers(); InitSocketFunctionPointers(); //For logging + InitVPadFunctionPointers(); //For logging log_init(); @@ -31,6 +30,21 @@ INITIALIZE(){ DEBUG_FUNCTION_LINE("SUCCESS\n"); } + if(args != NULL){ + gSDInitDone = args->device_mounted; + /*if((args->device_mounted & WUPS_SD_MOUNTED) > 0){ + DEBUG_FUNCTION_LINE("Yay, SD was mounted!\n"); + gSDInitDone = WUPS_SD_MOUNTED; + + DEBUG_FUNCTION_LINE("opendir result %08X!\n",opendir("sd:/")); + + } else { + DEBUG_FUNCTION_LINE("SD wasn't mounted...!\n"); + }*/ + }else { + DEBUG_FUNCTION_LINE("args were NULL!\n"); + } + HandleMultiModPacks(OSGetTitleID()); log_print("Init of SDCafiine!\n"); @@ -40,4 +54,3 @@ void deInitApplication(){ //FileReplacerUtils::getInstance()->StopAsyncThread(); FileReplacerUtils::destroyInstance(); } - diff --git a/plugins/swipswapme/Makefile b/plugins/swipswapme/Makefile index d4f778c..f68cc76 100644 --- a/plugins/swipswapme/Makefile +++ b/plugins/swipswapme/Makefile @@ -87,6 +87,7 @@ ASFLAGS := -mregnames # -Map: generate a map file LDFLAG_COMMON += -u wups_load -u wups_meta -u wups_hooks -T $(WUPSDIR)/wups.ld \ + -Wl,-wrap,open,-wrap,close,-wrap,write,-wrap,read,-wrap,lseek,-wrap,stat,-wrap,fstat,-wrap,opendir,-wrap,closedir,-wrap,readdir \ -Wl,-Map,$(notdir $@).map,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size,-wrap,_malloc_r,-wrap,_free_r,-wrap,_realloc_r,-wrap,_calloc_r,-wrap,_memalign_r,-wrap,_malloc_usable_size_r,--gc-sections LDFLAGS_MOD += $(LDFLAG_COMMON),--relocatable diff --git a/plugins/swipswapme/src/main.c b/plugins/swipswapme/src/main.c index 7321d55..a8e5208 100644 --- a/plugins/swipswapme/src/main.c +++ b/plugins/swipswapme/src/main.c @@ -44,7 +44,7 @@ u8 isFirstBoot __attribute__((section(".data"))) = 1; u32 SplashScreen(s32 time,s32 combotime); /* Entry point */ -INITIALIZE(){ +INITIALIZE(args){ if(gAppStatus == 2){ log_printf("No, we don't want to patch stuff again."); return; diff --git a/wups_include/wups.h b/wups_include/wups.h index 72600ef..0d66843 100644 --- a/wups_include/wups.h +++ b/wups_include/wups.h @@ -28,6 +28,11 @@ #include #include +#include +#include +#include +#include +#include #ifdef __cplusplus extern "C" { @@ -119,6 +124,8 @@ typedef struct wups_loader_hook_t { const void *target; /*Address of our own, new function (my_XXX)*/ } wups_loader_hook_t; + + #define WUPS_HOOK_INIT(original_func) \ extern const wups_loader_hook_t wups_hooks_init_ ## original_func \ WUPS_SECTION("hooks"); \ @@ -126,12 +133,128 @@ typedef struct wups_loader_hook_t { .type = WUPS_LOADER_HOOK_INIT_FUNCTION, \ .target = (const void*)&(original_func) \ } - -#define INITIALIZE() \ - void init();\ - WUPS_HOOK_INIT(init); \ - void init() +#define WUPS_SDUSB_MOUNTED_NONE 0 +#define WUPS_SDUSB_MOUNTED_FAKE (1<<0) +#define WUPS_SDUSB_MOUNTED_OS_SD (1<<1) +#define WUPS_SDUSB_LIBIOSU_LOADED (1<<2) +#define WUPS_SD_MOUNTED_LIBFAT (1<<3) +#define WUPS_USB_MOUNTED_LIBFAT (1<<4) +#define WUPS_USB_MOUNTED_LIBNTFS (1<<5) + +#define WUPS_SD_MOUNTED (WUPS_SDUSB_MOUNTED_OS_SD | WUPS_SD_MOUNTED_LIBFAT) +#define WUPS_USB_MOUNTED (WUPS_USB_MOUNTED_LIBFAT) + +typedef struct wups_loader_init_args_t { + int device_mounted; + struct { + const void * open_repl; + const void * close_repl; + const void * write_repl; + const void * read_repl; + const void * lseek_repl; + const void * stat_repl; + const void * fstat_repl; + const void * opendir_repl; + const void * closedir_repl; + const void * readdir_repl; + } fs_wrapper; +} wups_loader_init_args_t; + +#ifdef __cplusplus + #define EXTERN_C_START extern "C" { + #define EXTERN_C_END } +#else + #define EXTERN_C_START + #define EXTERN_C_END +#endif + +#define INITIALIZE(my_args) \ + void init(wups_loader_init_args_t*);\ + void myInit(wups_loader_init_args_t*);\ + WUPS_HOOK_INIT(init); \ + static void * new_open_ptr __attribute__((section(".data"))) = NULL; \ + static void * new_close_ptr __attribute__((section(".data"))) = NULL; \ + static void * new_write_ptr __attribute__((section(".data"))) = NULL; \ + static void * new_read_ptr __attribute__((section(".data"))) = NULL; \ + static void * new_lseek_ptr __attribute__((section(".data"))) = NULL; \ + static void * new_stat_ptr __attribute__((section(".data"))) = NULL; \ + static void * new_fstat_ptr __attribute__((section(".data"))) = NULL; \ + static void * new_opendir_ptr __attribute__((section(".data"))) = NULL; \ + static void * new_closedir_ptr __attribute__((section(".data"))) = NULL; \ + static void * new_readdir_ptr __attribute__((section(".data"))) = NULL; \ + void init(wups_loader_init_args_t* args){ \ + if(args != NULL){\ + new_open_ptr = (void*) args->fs_wrapper.open_repl; \ + new_close_ptr = (void*) args->fs_wrapper.close_repl; \ + new_write_ptr = (void*) args->fs_wrapper.write_repl; \ + new_read_ptr = (void*) args->fs_wrapper.read_repl; \ + new_lseek_ptr = (void*) args->fs_wrapper.lseek_repl; \ + new_stat_ptr = (void*) args->fs_wrapper.stat_repl; \ + new_fstat_ptr = (void*) args->fs_wrapper.fstat_repl; \ + new_opendir_ptr = (void*) args->fs_wrapper.opendir_repl; \ + new_closedir_ptr = (void*) args->fs_wrapper.closedir_repl; \ + new_readdir_ptr = (void*) args->fs_wrapper.readdir_repl; \ + }\ + myInit(args);\ + } \ + \ + EXTERN_C_START \ + \ + int __real_open(const char *pathname, int flags);\ + int __wrap_open(const char *pathname, int flags){\ + if(new_open_ptr == NULL) return __real_open(pathname,flags); \ + return ( (int (*)(const char *,int))((unsigned int*)new_open_ptr) )(pathname,flags);\ + }\ + int __real_close(int fd);\ + int __wrap_close(int fd){\ + if(new_close_ptr == NULL) return __real_close(fd); \ + return ( (int (*)(int))((unsigned int*)new_close_ptr) )(fd);\ + }\ + ssize_t __real_write(int fd, const void *buf, size_t count);\ + ssize_t __wrap_write(int fd, const void *buf, size_t count){\ + if(new_write_ptr == NULL) return __real_write(fd,buf,count); \ + return ( (ssize_t (*)(int, const void *, size_t))((unsigned int*)new_write_ptr) )(fd,buf,count);\ + }\ + ssize_t __real_read(int fd, const void *buf, size_t count);\ + ssize_t __wrap_read(int fd, const void *buf, size_t count){\ + if(new_read_ptr == NULL) return __real_read(fd,buf,count); \ + return ( (ssize_t (*)(int, const void *, size_t))((unsigned int*)new_read_ptr) )(fd,buf,count);\ + }\ + off_t __real_lseek(int fd, off_t offset, int whence);\ + off_t __wrap_lseek(int fd, off_t offset, int whence){\ + if(new_lseek_ptr == NULL) return __real_lseek(fd, offset, whence); \ + return ( (off_t (*)(int, off_t, int))((unsigned int*)new_lseek_ptr) )(fd, offset, whence);\ + }\ + int __real_stat(const char *pathname, struct stat *statbuf);\ + int __wrap_stat(const char *pathname, struct stat *statbuf){\ + if(new_stat_ptr == NULL) return __real_stat(pathname,statbuf); \ + return ( (int (*)(const char *, struct stat *))((unsigned int*)new_stat_ptr) )(pathname,statbuf);\ + }\ + int __real_fstat(int fd, struct stat *statbuf);\ + int __wrap_fstat(int fd, struct stat *statbuf){\ + if(new_fstat_ptr == NULL) return __real_fstat(fd,statbuf); \ + return ( (int (*)(int, struct stat *))((unsigned int*)new_fstat_ptr) )(fd,statbuf);\ + }\ + DIR* __real_opendir(const char * arg);\ + DIR* __wrap_opendir(const char * arg){\ + if(new_opendir_ptr == NULL) return __real_opendir(arg); \ + return ( (DIR* (*)(const char *))((unsigned int*)new_opendir_ptr) )(arg);\ + }\ + int __real_closedir(DIR *dirp);\ + int __wrap_closedir(DIR *dirp){\ + if(new_closedir_ptr == NULL) return __real_closedir(dirp); \ + return ( (int (*)(DIR *))((unsigned int*)new_closedir_ptr) )(dirp);\ + }\ + struct dirent * __real_readdir(DIR *dirp);\ + struct dirent * __wrap_readdir(DIR *dirp){\ + if(new_readdir_ptr == NULL) return __real_readdir(dirp); \ + return ( (struct dirent * (*)(DIR *))((unsigned int*)new_readdir_ptr) )(dirp);\ + }\ + \ + EXTERN_C_END\ + void myInit(wups_loader_init_args_t* my_args) + typedef enum wups_loader_entry_type_t { WUPS_LOADER_ENTRY_FUNCTION, WUPS_LOADER_ENTRY_FUNCTION_MANDATORY,