#include <switch.h>

#define nn_ro_LoadModule _ZN2nn2ro10LoadModuleEPNS0_6ModuleEPKvPvmi
extern uint64_t _ZN2nn2ro10LoadModuleEPNS0_6ModuleEPKvPvmi(void* module, void const* unk_1, void* unk_2, unsigned long unk_3, int unk_4) LINKABLE;

typedef unsigned char   undefined;
typedef unsigned char    byte;
typedef unsigned char    dwfenc;
typedef unsigned int    dword;
typedef long long    longlong;
typedef unsigned long long    qword;
typedef unsigned char    uchar;
typedef unsigned int    uint;
typedef unsigned long    ulong;
typedef unsigned long long    ulonglong;
typedef unsigned char    undefined1;
typedef unsigned short    undefined2;
typedef unsigned int    undefined3;
typedef unsigned int    undefined4;
typedef unsigned long long    undefined5;
typedef unsigned long long    undefined6;
typedef unsigned long long    undefined7;
typedef unsigned long long    undefined8;
typedef unsigned short    ushort;
typedef unsigned short    word;

enum module_state {module_unloaded, module_loaded};

typedef struct RoModule_t {
    struct RoModule_t *next;
    struct RoModule_t *prev;
    union {
        void *rel;
        void *rela;
        void *raw;
    } rela_or_rel_plt;
    union {
        void *rel;
        void *rela;
    } rela_or_rel;
    uint64_t module_base;
    void *dyanmic;
    bool is_rela;
    uint64_t rela_or_rel_plt_size;
    void (*dt_init)(void);
    void (*dt_fini)(void);
    uint32_t *hash_bucket;
    uint32_t *hash_chain;
    char *dynstr;
    void *dynsym;
    uint64_t dynstr_size;
    void **got;
    uint64_t rela_dyn_size;
    uint64_t rel_dyn_size;
    uint64_t rel_count;
    uint64_t rela_count;
    uint64_t hash_nchain_value;
    uint64_t hash_nbucket_value;
    uint64_t got_stub_ptr;
} RoModule;

typedef struct Module_t {
    RoModule *module;
    enum module_state state;
    uintptr_t module_address;
    uintptr_t bss_address;
} Module;

typedef struct SmashModule { /* PlaceHolder Structure */
    Module module;
    void * field_0x20;
    void * src_buffer;
    char name[256]; /* Created by retype action */
    undefined field_0x130;
    undefined field_0x131;
    undefined4 is_loaded; // bool
} SmashModule;