mirror of
https://github.com/wiiu-env/WiiUPluginSystem.git
synced 2024-12-24 17:11:58 +01:00
Added SD/USB support for plugins!
Now the plugins inherit the SD/USB access from the loader. Check (args != NULL && (args->device_mounted & WUPS_SD_MOUNTED) > 0) in your INITIALZE method if you have SD access, and (args != NULL && (args->device_mounted & WUPS_USB_MOUNTED) > 0) for usb access. You can simply use open, read etc. then with "sd:/" and "usb:". No (un)mounting required. NTFS support is NOT implemented yet. So: HID to VPAD plugin can now read configurations SDCafiine now has support for libfat (other games than SSBU + FAT32 USB)
This commit is contained in:
parent
f8e8f7f52e
commit
46358ce67a
@ -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
|
||||
|
@ -11,7 +11,7 @@ WUPS_MODULE_VERSION("v1.0");
|
||||
WUPS_MODULE_AUTHOR("Maschell");
|
||||
WUPS_MODULE_LICENSE("BSD");
|
||||
|
||||
INITIALIZE(){
|
||||
INITIALIZE(args){
|
||||
InitOSFunctionPointers();
|
||||
InitSocketFunctionPointers();
|
||||
|
||||
|
@ -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
|
||||
|
@ -7,6 +7,8 @@
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <dynamic_libs/os_functions.h>
|
||||
#include <dynamic_libs/socket_functions.h>
|
||||
@ -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<ModuleData *> 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");
|
||||
|
@ -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
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include <string.h>
|
||||
#include <dynamic_libs/os_functions.h>
|
||||
#include <dynamic_libs/vpad_functions.h>
|
||||
#include <dynamic_libs/padscore_functions.h>
|
||||
#include <dynamic_libs/socket_functions.h>
|
||||
#include <dynamic_libs/proc_ui_functions.h>
|
||||
#include <controller_patcher/ControllerPatcher.hpp>
|
||||
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -11,7 +11,7 @@ WUPS_MODULE_AUTHOR("Maschell");
|
||||
WUPS_MODULE_LICENSE("GPL");
|
||||
|
||||
|
||||
INITIALIZE(){
|
||||
INITIALIZE(args){
|
||||
InitOSFunctionPointers();
|
||||
InitSocketFunctionPointers();
|
||||
InitVPadFunctionPointers();
|
||||
|
@ -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):
|
||||
|
@ -11,5 +11,4 @@ extern volatile u8 gSDInitDone;
|
||||
|
||||
extern char gModFolder[FS_MAX_ENTNAME_SIZE];
|
||||
|
||||
|
||||
#endif // RETAINS_VARS_H_
|
||||
|
@ -1,7 +1,5 @@
|
||||
#include <wups.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
#include <dynamic_libs/os_functions.h>
|
||||
#include <dynamic_libs/vpad_functions.h>
|
||||
#include <dynamic_libs/sys_functions.h>
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -28,6 +28,11 @@
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <dirent.h>
|
||||
|
||||
#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,
|
||||
|
Loading…
Reference in New Issue
Block a user