Replace the "void *" of the fs and overlay access with proper function pointers

This commit is contained in:
Maschell 2018-06-30 16:49:49 +02:00
parent 2f074ac71f
commit 3f1d27f7b2
5 changed files with 86 additions and 73 deletions

View File

@ -34,27 +34,25 @@ void CallHookEx(wups_loader_hook_type_t hook_type, int32_t plugin_index_needed)
void * func_ptr = hook_data->func_pointer;
//TODO: Switch cases depending on arguments etc.
// Adding arguments!
if(func_ptr != NULL) {
if(hook_type == WUPS_LOADER_HOOK_INIT_FS) {
wups_loader_init_fs_args_t args;
args.open_repl = (const void*)&open;
args.close_repl = (const void*)&close;
args.write_repl = (const void*)&write;
args.read_repl = (const void*)&read;
args.lseek_repl = (const void*)&lseek;
args.stat_repl = (const void*)&stat;
args.fstat_repl = (const void*)&fstat;
args.opendir_repl = (const void*)&opendir;
args.closedir_repl = (const void*)&closedir;
args.readdir_repl = (const void*)&readdir;
args.mkdir_repl = (const void*)&mkdir;
// open is defined as "extern int open (const char *, int, ...);", we are ignoring the varargs part
args.open_repl = (OpenFunction) &open;
args.close_repl = &close;
args.write_repl = &write;
args.read_repl = &read;
args.lseek_repl = &lseek;
args.stat_repl = &stat;
args.fstat_repl = &fstat;
args.opendir_repl = &opendir;
args.closedir_repl = &closedir;
args.readdir_repl = &readdir;
args.mkdir_repl = &mkdir;
((void (*)(wups_loader_init_fs_args_t))((uint32_t*)func_ptr) )(args);
} else if(hook_type == WUPS_LOADER_HOOK_INIT_OVERLAY) {
wups_loader_init_overlay_args_t args;
args.overlayfunction_ptr = (const void*)&overlay_helper;
args.overlayfunction_ptr = &overlay_helper;
((void (*)(wups_loader_init_overlay_args_t))((uint32_t*)func_ptr) )(args);
} else if(hook_type == WUPS_LOADER_HOOK_INIT_PLUGIN) {
((void (*)(void))((uint32_t*)func_ptr) )();

View File

@ -7,89 +7,89 @@
#include <dirent.h>
#include <wups.h>
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;
static void * new_mkdir_ptr __attribute__((section(".data"))) = NULL;
static OpenFunction new_open_ptr __attribute__((section(".data"))) = NULL;
static CloseFunction new_close_ptr __attribute__((section(".data"))) = NULL;
static WriteFunction new_write_ptr __attribute__((section(".data"))) = NULL;
static ReadFunction new_read_ptr __attribute__((section(".data"))) = NULL;
static LSeekFunction new_lseek_ptr __attribute__((section(".data"))) = NULL;
static StatFunction new_stat_ptr __attribute__((section(".data"))) = NULL;
static FStatFunction new_fstat_ptr __attribute__((section(".data"))) = NULL;
static OpenDirFunction new_opendir_ptr __attribute__((section(".data"))) = NULL;
static CloseDirFunction new_closedir_ptr __attribute__((section(".data"))) = NULL;
static ReadDirFunction new_readdir_ptr __attribute__((section(".data"))) = NULL;
static MKDirFunction new_mkdir_ptr __attribute__((section(".data"))) = NULL;
#ifdef __cplusplus
extern "C" {
#endif
void WUPS_InitFS(wups_loader_init_fs_args_t args) {
new_open_ptr = (void*) args.open_repl;
new_close_ptr = (void*) args.close_repl;
new_write_ptr = (void*) args.write_repl;
new_read_ptr = (void*) args.read_repl;
new_lseek_ptr = (void*) args.lseek_repl;
new_stat_ptr = (void*) args.stat_repl;
new_fstat_ptr = (void*) args.fstat_repl;
new_opendir_ptr = (void*) args.opendir_repl;
new_closedir_ptr = (void*) args.closedir_repl;
new_readdir_ptr = (void*) args.readdir_repl;
new_mkdir_ptr = (void*) args.mkdir_repl;
new_open_ptr = args.open_repl;
new_close_ptr = args.close_repl;
new_write_ptr = args.write_repl;
new_read_ptr = args.read_repl;
new_lseek_ptr = args.lseek_repl;
new_stat_ptr = args.stat_repl;
new_fstat_ptr = args.fstat_repl;
new_opendir_ptr = args.opendir_repl;
new_closedir_ptr = args.closedir_repl;
new_readdir_ptr = args.readdir_repl;
new_mkdir_ptr = args.mkdir_repl;
}
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);
return 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);
return 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);
return 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) {
ssize_t __real_read(int fd, void *buf, size_t count);
ssize_t __wrap_read(int fd, 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);
return 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);
return 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);
return 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);
return 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);
return 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);
return 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);
return new_readdir_ptr(dirp);
}
int __real_mkdir(const char *path, mode_t mode);
int __wrap_mkdir(const char *path, mode_t mode) {
if(new_mkdir_ptr == NULL) return __real_mkdir(path, mode);
return ( (int (*)(const char *, mode_t))((unsigned int*) new_mkdir_ptr) )(path, mode);
return new_mkdir_ptr(path, mode);
}
#ifdef __cplusplus

View File

@ -21,13 +21,13 @@ void OSScreenPutFontEx(uint32_t bufferNum, uint32_t posX, uint32_t posY, const c
void OSScreenEnableEx(uint32_t bufferNum, int32_t enable);
void OSScreenPutPixelEx(uint32_t bufferNum, uint32_t posX, uint32_t posY, uint32_t color);
static void * overlayfunction_ptr __attribute__((section(".data"))) = NULL;
static OverlayOpenFunction overlayfunction_ptr __attribute__((section(".data"))) = NULL;
#ifdef __cplusplus
extern "C" {
#endif
void WUPS_InitOverlay(wups_loader_init_overlay_args_t args) {
overlayfunction_ptr = (void*) args.overlayfunction_ptr;
overlayfunction_ptr = args.overlayfunction_ptr;
}
void WUPS_Overlay_PrintTextOnScreen(wups_overlay_options_type_t screen, int x,int y, const char * msg, ...) {
@ -80,7 +80,7 @@ void WUPS_Overlay_FlipBuffers(wups_overlay_options_type_t screen) {
void WUPS_OpenOverlay(wups_overlay_options_type_t screen, overlay_callback callback) {
if(overlayfunction_ptr != NULL) {
( (void (*)(wups_overlay_options_type_t, overlay_callback))((unsigned int*)overlayfunction_ptr) )(screen,callback);
overlayfunction_ptr(screen,callback);
}
}

View File

@ -19,6 +19,7 @@
#define WUPS_HOOKS_DEF_H_
#include "common.h"
#include "utils.h"
#ifdef __cplusplus
extern "C" {
@ -57,31 +58,11 @@ typedef enum wups_loader_app_status_t {
WUPS_APP_STATUS_UNKNOWN, /* Unknown status _should_ never happen.*/
} wups_loader_app_status_t;
typedef struct wups_loader_init_overlay_args_t {
const void * overlayfunction_ptr;
} wups_loader_init_overlay_args_t;
typedef struct wups_loader_init_fs_args_t {
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;
const void * mkdir_repl;
} wups_loader_init_fs_args_t;
typedef struct wups_loader_app_started_args_t {
bool sd_mounted;
bool usb_mounted;
} wups_loader_app_started_args_t;
#define WUPS_FS_ACCESS() \
void init_fs(wups_loader_init_fs_args_t);\
WUPS_HOOK_EX(WUPS_LOADER_HOOK_INIT_FS,init_fs); \

View File

@ -35,6 +35,40 @@ wups_overlay_options_type_t;
typedef void (*overlay_callback)(wups_overlay_options_type_t);
typedef void (*OverlayOpenFunction)(wups_overlay_options_type_t screen, overlay_callback callback);
typedef struct wups_loader_init_overlay_args_t {
OverlayOpenFunction overlayfunction_ptr;
} wups_loader_init_overlay_args_t;
typedef int (*OpenFunction) (const char *pathname, int flags);
typedef ssize_t (*WriteFunction) (int fd, const void *buf, size_t count);
typedef int (*CloseFunction) (int fd);
typedef ssize_t (*ReadFunction) (int fd, void *buf, size_t count);
typedef off_t (*LSeekFunction) (int fd, off_t offset, int whence);
typedef int (*StatFunction) (const char *pathname, struct stat *statbuf);
typedef int (*FStatFunction) (int fd, struct stat *statbuf);
typedef DIR* (*OpenDirFunction) (const char * arg);
typedef int (*CloseDirFunction) (DIR *dirp);
typedef struct dirent * (*ReadDirFunction) (DIR *dirp);
typedef int (*MKDirFunction) (const char *path, mode_t mode);
typedef struct wups_loader_init_fs_args_t {
OpenFunction open_repl;
CloseFunction close_repl;
WriteFunction write_repl;
ReadFunction read_repl;
LSeekFunction lseek_repl;
StatFunction stat_repl;
FStatFunction fstat_repl;
OpenDirFunction opendir_repl;
CloseDirFunction closedir_repl;
ReadDirFunction readdir_repl;
MKDirFunction mkdir_repl;
} wups_loader_init_fs_args_t;
/*
Gets called by the framework
*/