ReXGlue SDK
Loading...
Searching...
No Matches
module.h
Go to the documentation of this file.
1
15
16#pragma once
17
18#include <span>
19#include <string>
20#include <string_view>
21#include <vector>
22#include <atomic>
23#include <optional>
24
25#include <rex/platform.h>
26#include <rex/types.h>
27#include <rex/kernel/heap.h>
29#include <memory>
30
32#include <rex/memory/endian.h>
35#include <rex/result.h>
37#include <rex/module.h>
38#include <rex/utility.h>
39
40namespace rex::filesystem {
41class IXEXImage;
42struct PEInfo;
43struct XEXImportLibrary;
44} // namespace rex::filesystem
45
46namespace rex::kernel {
47
49
51 public:
57 explicit GuestModule(FunctionDispatcher* function_dispatcher);
58 virtual ~GuestModule();
59
60 kernel::GuestAddressSpace* GetAddressSpace() const { return memory_; }
61 FunctionDispatcher* GetFunctionDispatcher() const { return function_dispatcher_; }
62
63 virtual const std::string& GetName() const = 0;
64 virtual bool IsExecutable() const = 0;
65
69 virtual u32 GetBaseAddress() const { return 0; }
73 virtual u32 GetImageSize() const { return 0; }
77 virtual u32 GetEntryPoint() const { return 0; }
81 virtual u32 GetExportTableAddress() const { return 0; }
82
84 virtual u32 GetExceptionDirectoryRVA() const { return 0; }
86 virtual u32 GetExceptionDirectorySize() const { return 0; }
88 virtual u32 GetExceptionDirectoryAddress() const { return 0; }
89
90 bool IsExecutableAddress(u32 address) const;
91
95 virtual std::span<const BinarySection> GetBinarySections() const;
99 virtual const BinarySection* FindSectionByAddress(u32 address) const;
100
104 virtual std::span<const BinarySymbol> GetBinarySymbols() const;
105
106 protected:
107 FunctionDispatcher* function_dispatcher_ = nullptr;
108 kernel::GuestAddressSpace* memory_ = nullptr;
109
111 std::vector<BinarySection> binary_sections_;
112 std::vector<BinarySymbol> binary_symbols_;
113};
114
115} // namespace rex::kernel
116
117namespace rex::kernel {
118
121 public:
127 explicit ELFModule(FunctionDispatcher* function_dispatcher);
128 virtual ~ELFModule();
129
130 bool IsLoaded() const { return loaded_; }
131 const std::string& GetName() const override { return name_; }
133 bool IsExecutable() const override;
134 const std::string& GetPath() const { return path_; }
135
137 u32 GetBaseAddress() const override { return base_address_; }
138 u32 GetImageSize() const override { return image_size_; }
139 u32 GetEntryPoint() const override { return entry_point_; }
140
147 bool Load(const std::string_view name, const std::string_view path, const void* elf_addr,
148 size_t elf_length);
149 bool Unload();
150
151 private:
152 std::string name_;
153 std::string path_;
154
155 bool loaded_ = false;
156 std::vector<u8> elf_header_mem_;
157 u32 entry_point_ = 0;
158 u32 base_address_ = 0;
159 u32 image_size_ = 0;
160};
161
162} // namespace rex::kernel
163
164namespace rex {
165namespace kernel {
166class TitleRuntime;
167} // namespace kernel
168} // namespace rex
169
170namespace rex::kernel {
171
172constexpr memory::FourCCT kXEX1Signature = memory::make_fourcc("XEX1");
173constexpr memory::FourCCT kXEX2Signature = memory::make_fourcc("XEX2");
174constexpr memory::FourCCT kELFSignature = memory::make_fourcc(0x7F, 'E', 'L', 'F');
175
178 public:
180 public:
181 u32 ordinal = 0;
184 };
186 public:
187 std::string name;
188 std::string file_name;
189 u32 id;
192 std::vector<LibraryImport> imports;
193 };
194
200 XEXModule(FunctionDispatcher* function_dispatcher, TitleRuntime& runtime);
201 ~XEXModule() override;
202
203 bool IsLoaded() const { return loaded_; }
204 const filesystem::IXEXImage& GetImage() const { return *image_; }
205 const filesystem::PEInfo& GetPE() const { return *pe_; }
206
210 u32 GetImageSize() const override;
211
215 u32 GetBaseAddress() const override { return base_address_; }
216
220 u32 GetEntryPoint() const override;
221
225 u32 GetExportTableAddress() const override;
226
227 u32 GetExceptionDirectoryRVA() const override;
228 u32 GetExceptionDirectorySize() const override;
229 u32 GetExceptionDirectoryAddress() const override;
230
231 std::span<const BinarySection> GetBinarySections() const override;
235 std::span<const BinarySymbol> GetBinarySymbols() const override;
236
242 u32 GetExportAddress(u16 ordinal) const;
243
244 const std::vector<ImportLibrary>& GetImportLibraries() const { return import_libs_; }
250 u32 GetExportAddress(const std::string_view name) const;
251
257 int ApplyPatch(XEXModule* module);
263 bool Load(const std::string_view name, const std::string_view path, const void* xex_addr,
264 size_t xex_length);
269 std::span<const u8> GetPendingImage() const { return pending_image_; }
275 bool Unload();
276
277 const std::string& GetName() const override { return name_; }
279 bool IsExecutable() const override;
280
281 private:
282 bool SetupLibraryImports(std::string_view name, const filesystem::XEXImportLibrary& library);
283 void PopulateBinaryData();
284
285 TitleRuntime* runtime_ = nullptr;
286 std::string name_;
287 std::string path_;
288 std::unique_ptr<filesystem::IXEXImage> image_;
289 std::unique_ptr<filesystem::PEInfo> pe_;
290 std::vector<u8> pending_image_;
291 std::vector<ImportLibrary> import_libs_;
292
293 bool loaded_ = false;
294 bool finished_load_ = false;
295
296 u32 base_address_ = 0;
297};
298
299} // namespace rex::kernel
300
301namespace rex::kernel {
302
308 constexpr ModuleImport(const char* library_name, u16 export_ordinal)
309 : library(library_name), ordinal(export_ordinal) {}
310
311 const char* library;
312 u16 ordinal;
313 std::atomic<PPCFunc*> function{nullptr};
314 std::atomic<u64> generation{0};
315};
316
322
323} // namespace rex::kernel
324
325namespace rex::kernel {
326
331 virtual ~IModuleRegistry() = default;
332
340 [[nodiscard]] virtual std::optional<X_HANDLE> GetModule(std::string_view name,
341 bool user_only = false) = 0;
342
346 [[nodiscard]] virtual std::optional<X_HANDLE> GetExecutable() const = 0;
347
352 [[nodiscard]] virtual std::optional<X_HANDLE> FindKernelModule(std::string_view name) = 0;
353
358 [[nodiscard]] virtual std::optional<X_HANDLE> FindUserModule(std::string_view name) = 0;
359
364 [[nodiscard]] virtual bool IsKernelModule(std::string_view name) = 0;
365
367 [[nodiscard]] virtual std::vector<X_HANDLE> GetKernelModules() = 0;
368
370 [[nodiscard]] virtual std::vector<X_HANDLE> GetUserModules() = 0;
371
381 [[nodiscard]] virtual Result<X_HANDLE> LoadUserModule(std::string_view name,
382 bool call_entry = true) = 0;
383
389 virtual void UnloadUserModule(X_HANDLE module, bool call_entry = true) = 0;
390
395 virtual void AddImportCandidate(std::string_view path) = 0;
396
403 [[nodiscard]] virtual Result<X_HANDLE> RegisterKernelModule(X_HANDLE created) = 0;
404
411 virtual void RegisterRecompiledModule(const char* pe_name, const char* guest_path,
412 const char* shared_lib_name) = 0;
413
415 [[nodiscard]] virtual rex::platform::RankedMutex& GetLoadCountMutex() = 0;
416};
417
418} // namespace rex::kernel
Definition xex.h:115
bool Load(const std::string_view name, const std::string_view path, const void *elf_addr, size_t elf_length)
u32 GetImageSize() const override
Definition module.h:138
u32 GetBaseAddress() const override
Definition module.h:137
bool IsExecutable() const override
u32 GetEntryPoint() const override
Definition module.h:139
ELFModule(FunctionDispatcher *function_dispatcher)
Definition function_dispatcher.h:48
Definition heap.h:594
std::vector< BinarySection > binary_sections_
Definition module.h:111
virtual u32 GetBaseAddress() const
Definition module.h:69
virtual u32 GetExceptionDirectoryRVA() const
Definition module.h:84
virtual std::span< const BinarySymbol > GetBinarySymbols() const
GuestModule(FunctionDispatcher *function_dispatcher)
virtual u32 GetExceptionDirectoryAddress() const
Definition module.h:88
virtual u32 GetImageSize() const
Definition module.h:73
virtual std::span< const BinarySection > GetBinarySections() const
virtual u32 GetEntryPoint() const
Definition module.h:77
virtual const BinarySection * FindSectionByAddress(u32 address) const
virtual u32 GetExceptionDirectorySize() const
Definition module.h:86
virtual u32 GetExportTableAddress() const
Definition module.h:81
Definition module.h:330
Definition title_runtime.h:85
bool Load(const std::string_view name, const std::string_view path, const void *xex_addr, size_t xex_length)
u32 GetExceptionDirectoryRVA() const override
std::span< const BinarySection > GetBinarySections() const override
XEXModule(FunctionDispatcher *function_dispatcher, TitleRuntime &runtime)
u32 GetExportAddress(const std::string_view name) const
bool IsExecutable() const override
std::span< const u8 > GetPendingImage() const
Definition module.h:269
u32 GetImageSize() const override
u32 GetExportTableAddress() const override
int ApplyPatch(XEXModule *module)
u32 GetExceptionDirectorySize() const override
u32 GetExceptionDirectoryAddress() const override
u32 GetBaseAddress() const override
Definition module.h:215
u32 GetEntryPoint() const override
u32 GetExportAddress(u16 ordinal) const
std::span< const BinarySymbol > GetBinarySymbols() const override
Interfaces, factory and module declaration.
#define REX_DECLARE_INTERFACE(Name, version)
Definition module.h:114
Definition export.h:24
PPCFunc * ResolveModuleImport(ModuleImport &target)
u32 FourCCT
Definition endian.h:264
constexpr FourCCT make_fourcc(char a, char b, char c, char d)
Definition endian.h:273
Definition platform.h:345
Definition app.h:36
std::expected< T, Error > Result
Definition result.h:98
Platform flags, packing macros and export markers.
#define REX_KERNEL_API
Definition platform.h:297
Definition xex.h:65
Definition symbol_map.h:35
Definition module.h:304
std::atomic< u64 > generation
Definition module.h:314
constexpr ModuleImport(const char *library_name, u16 export_ordinal)
Definition module.h:308
const char * library
Definition module.h:311
std::string file_name
Definition module.h:188
std::vector< LibraryImport > imports
Definition module.h:192
std::string name
Definition module.h:187
XEXVersion version
Definition module.h:190
XEXVersion min_version
Definition module.h:191
u32 thunk_address
Definition module.h:183
u32 value_address
Definition module.h:182
Integer types, byte order wrappers and size literals.
Definition xex.h:391
Move only function, const propagating pointer and scope guard.