1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#[allow(unused_imports)]
use self::super::root;
#[repr(C)]
pub struct Module {
    pub ModuleObject: *mut root::rtld::ModuleObject,
    pub State: u32,
    pub NroPtr: *mut u8,
    pub BssPtr: *mut u8,
    pub _x20: *mut u8,
    pub SourceBuffer: *mut u8,
    pub Name: [u8; 256usize],
    pub _x130: u8,
    pub _x131: u8,
    pub isLoaded: bool,
}

#[repr(C)]
pub struct ModuleId {
    pub build_id: [u8; 32usize],
}

#[repr(C)]
pub struct NroHeader {
    pub entrypoint_insn: u32,
    pub mod_offset: u32,
    pub _x8: [u8; 8usize],
    pub magic: u32,
    pub _x14: [u8; 4usize],
    pub size: u32,
    pub reserved_1C: [u8; 4usize],
    pub text_offset: u32,
    pub text_size: u32,
    pub ro_offset: u32,
    pub ro_size: u32,
    pub rw_offset: u32,
    pub rw_size: u32,
    pub bss_size: u32,
    pub _x3C: [u8; 4usize],
    pub module_id: root::nn::ro::ModuleId,
    pub _x60: [u8; 32usize],
}

#[repr(C)]
pub struct ProgramId {
    pub value: u64,
}

#[repr(C)]
pub struct NrrHeader {
    pub magic: u32,
    pub _x4: [u8; 12usize],
    pub program_id_mask: u64,
    pub program_id_pattern: u64,
    pub _x20: [u8; 16usize],
    pub modulus: [u8; 256usize],
    pub fixed_key_signature: [u8; 256usize],
    pub nrr_signature: [u8; 256usize],
    pub program_id: root::nn::ro::ProgramId,
    pub size: u32,
    pub type_: u8,
    pub _x33D: [u8; 3usize],
    pub hashes_offset: u32,
    pub num_hashes: u32,
    pub _x348: [u8; 8usize],
}

#[repr(C)]
pub struct RegistrationInfo {
    pub state: root::nn::ro::RegistrationInfo_State,
    pub nrrPtr: *mut root::nn::ro::NrrHeader,
    pub _x10: u64,
    pub _x18: u64,
}
pub const RegistrationInfo_State_State_Unregistered:
    root::nn::ro::RegistrationInfo_State = 0;
pub const RegistrationInfo_State_State_Registered:
    root::nn::ro::RegistrationInfo_State = 1;
pub type RegistrationInfo_State = u32;

pub const BindFlag_BindFlag_Now: root::nn::ro::BindFlag = 1;
pub const BindFlag_BindFlag_Lazy: root::nn::ro::BindFlag = 2;
pub type BindFlag = u32;
extern "C" {
    #[link_name = "\u{1}_ZN2nn2ro10InitializeEv"]
    pub fn Initialize() -> root::Result;
}
extern "C" {
    #[link_name = "\u{1}_ZN2nn2ro12LookupSymbolEPmPKc"]
    pub fn LookupSymbol(
        pOutAddress: *mut usize,
        name: *const u8,
    ) -> root::Result;
}
extern "C" {
    #[link_name = "\u{1}_ZN2nn2ro18LookupModuleSymbolEPmPKNS0_6ModuleEPKc"]
    pub fn LookupModuleSymbol(
        pOutAddress: *mut usize,
        pModule: *const root::nn::ro::Module,
        name: *const u8,
    ) -> root::Result;
}
extern "C" {
    #[link_name = "\u{1}_ZN2nn2ro10LoadModuleEPNS0_6ModuleEPKvPvmi"]
    pub fn LoadModule(
        pOutModule: *mut root::nn::ro::Module,
        pImage: *const u8,
        buffer: *mut u8,
        bufferSize: root::size_t,
        flag: i32,
    ) -> root::Result;
}
extern "C" {
    #[link_name = "\u{1}_ZN2nn2ro12UnloadModuleEPNS0_6ModuleE"]
    pub fn UnloadModule(arg1: *mut root::nn::ro::Module) -> root::Result;
}
extern "C" {
    #[link_name = "\u{1}_ZN2nn2ro13GetBufferSizeEPmPKv"]
    pub fn GetBufferSize(
        arg1: *mut root::size_t,
        arg2: *const u8,
    ) -> root::Result;
}
extern "C" {
    #[link_name = "\u{1}_ZN2nn2ro18RegisterModuleInfoEPNS0_16RegistrationInfoEPKv"]
    pub fn RegisterModuleInfo(
        arg1: *mut root::nn::ro::RegistrationInfo,
        arg2: *const u8,
    ) -> root::Result;
}
extern "C" {
    #[link_name = "\u{1}_ZN2nn2ro18RegisterModuleInfoEPNS0_16RegistrationInfoEPKvj"]
    pub fn RegisterModuleInfo1(
        arg1: *mut root::nn::ro::RegistrationInfo,
        arg2: *const u8,
        arg3: root::uint,
    ) -> root::Result;
}
extern "C" {
    #[link_name = "\u{1}_ZN2nn2ro20UnregisterModuleInfoEPNS0_16RegistrationInfoE"]
    pub fn UnregisterModuleInfo(
        arg1: *mut root::nn::ro::RegistrationInfo,
    ) -> root::Result;
}