botw/lib/NintendoSDK/include/nn/ro.h

115 lines
2.5 KiB
C++

/**
* @file ro.h
* @brief Dynamic module API.
*/
#pragma once
#include <nn/types.h>
namespace nn {
namespace ro {
namespace rtld {
struct ModuleObject; // TODO find this object and implement it. Original `#include` name:
// ModuleObject.hpp, full path name: nn::ro::rtld::ModuleObject
}
class Module {
public:
rtld::ModuleObject* ModuleObject;
u32 State;
void* NroPtr;
void* BssPtr;
void* _x20;
void* SourceBuffer;
char Name[256]; /* Created by retype action */
u8 _x130;
u8 _x131;
bool isLoaded; // bool
};
struct ModuleId {
u8 build_id[0x20];
};
struct NroHeader {
u32 entrypoint_insn;
u32 mod_offset;
u8 _x8[0x8];
u32 magic;
u8 _x14[0x4];
u32 size;
u8 reserved_1C[0x4];
u32 text_offset;
u32 text_size;
u32 ro_offset;
u32 ro_size;
u32 rw_offset;
u32 rw_size;
u32 bss_size;
u8 _x3C[0x4];
ModuleId module_id;
u8 _x60[0x20];
};
static_assert(sizeof(NroHeader) == 0x80, "NroHeader definition!");
struct ProgramId {
u64 value;
inline explicit operator u64() const { return this->value; }
};
struct NrrHeader {
u32 magic;
u8 _x4[0xC];
u64 program_id_mask;
u64 program_id_pattern;
u8 _x20[0x10];
u8 modulus[0x100];
u8 fixed_key_signature[0x100];
u8 nrr_signature[0x100];
ProgramId program_id;
u32 size;
u8 type; /* 7.0.0+ */
u8 _x33D[3];
u32 hashes_offset;
u32 num_hashes;
u8 _x348[8];
};
static_assert(sizeof(NrrHeader) == 0x350, "NrrHeader definition!");
struct RegistrationInfo {
enum State {
State_Unregistered,
State_Registered,
};
State state;
NrrHeader* nrrPtr;
u64 _x10;
u64 _x18;
};
enum BindFlag {
BindFlag_Now = BIT(0),
BindFlag_Lazy = BIT(1),
};
Result Initialize();
Result LookupSymbol(uintptr_t* pOutAddress, const char* name);
Result LookupModuleSymbol(uintptr_t* pOutAddress, const Module* pModule, const char* name);
Result LoadModule(Module* pOutModule, const void* pImage, void* buffer, size_t bufferSize,
int flag);
// Result LoadModule(Module *pOutModule, const void *pImage, void *buffer, size_t bufferSize,int
// flag, bool isNotReferenced);
Result UnloadModule(Module*);
Result GetBufferSize(size_t*, const void*);
Result RegisterModuleInfo(RegistrationInfo*, void const*);
Result RegisterModuleInfo(RegistrationInfo*, void const*, u32);
Result UnregisterModuleInfo(RegistrationInfo*, void const*);
}; // namespace ro
}; // namespace nn