diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-05-05 21:10:18 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-05-05 21:10:18 +0200 |
| commit | f95d8bf159d10b5a9521dcaa0bc37aa0e9dfc02b (patch) | |
| tree | bf8186f1a0521a64983bb0bca4f7b54883542195 /Private/KernelKit/PEFSharedObject.hxx | |
| parent | 5a903c1d8f80ca8d7bc5fbea0aea710ce0133f9d (diff) | |
MHR-23: Add run_format.sh, kernel patches.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Private/KernelKit/PEFSharedObject.hxx')
| -rw-r--r-- | Private/KernelKit/PEFSharedObject.hxx | 158 |
1 files changed, 89 insertions, 69 deletions
diff --git a/Private/KernelKit/PEFSharedObject.hxx b/Private/KernelKit/PEFSharedObject.hxx index 185310ee..6176c31d 100644 --- a/Private/KernelKit/PEFSharedObject.hxx +++ b/Private/KernelKit/PEFSharedObject.hxx @@ -15,78 +15,98 @@ #include <KernelKit/PEFCodeManager.hxx> #include <NewKit/Defines.hpp> -namespace NewOS { -/// @brief Pure implementation, missing method/function handler. -extern "C" void __mh_purecall(void); +namespace NewOS +{ + /// @brief Pure implementation, missing method/function handler. + extern "C" void __mh_purecall(void); -/** + /** * @brief Shared Library class * Load library from this class */ -class SharedObject final { - public: - struct SharedObjectTrait final { - VoidPtr fImageObject; - VoidPtr fImageEntrypointOffset; - }; - - public: - explicit SharedObject() = default; - ~SharedObject() = default; - - public: - NEWOS_COPY_DEFAULT(SharedObject); - - private: - SharedObjectTrait *fMounted{nullptr}; - - public: - SharedObjectTrait **GetAddressOf() { return &fMounted; } - - SharedObjectTrait *Get() { return fMounted; } - - public: - void Mount(SharedObjectTrait *to_mount) { - if (!to_mount || !to_mount->fImageObject) return; - - fMounted = to_mount; - - if (fLoader && to_mount) { - delete fLoader; - fLoader = nullptr; - } - - if (!fLoader) { - fLoader = new PEFLoader(fMounted->fImageObject); - } - } - - void Unmount() { - if (fMounted) fMounted = nullptr; - }; - - template <typename SymbolType> - SymbolType Load(const char *symbol_name, SizeT len, Int32 kind) { - if (symbol_name == nullptr || *symbol_name == 0) return nullptr; - if (len > kPathLen || len < 1) return nullptr; - - auto ret = - reinterpret_cast<SymbolType>(fLoader->FindSymbol(symbol_name, kind)); - - if (!ret) { - if (kind == kPefCode) return (VoidPtr)__mh_purecall; - - return nullptr; - } - - return ret; - } - - private: - PEFLoader *fLoader{nullptr}; -}; - -typedef SharedObject *SharedObjectPtr; -} // namespace NewOS + class SharedObject final + { + public: + struct SharedObjectTrait final + { + VoidPtr fImageObject; + VoidPtr fImageEntrypointOffset; + }; + + public: + explicit SharedObject() = default; + ~SharedObject() = default; + + public: + NEWOS_COPY_DEFAULT(SharedObject); + + private: + SharedObjectTrait* fMounted{nullptr}; + + public: + SharedObjectTrait** GetAddressOf() + { + return &fMounted; + } + + SharedObjectTrait* Get() + { + return fMounted; + } + + public: + void Mount(SharedObjectTrait* to_mount) + { + if (!to_mount || !to_mount->fImageObject) + return; + + fMounted = to_mount; + + if (fLoader && to_mount) + { + delete fLoader; + fLoader = nullptr; + } + + if (!fLoader) + { + fLoader = new PEFLoader(fMounted->fImageObject); + } + } + + void Unmount() + { + if (fMounted) + fMounted = nullptr; + }; + + template <typename SymbolType> + SymbolType Load(const char* symbol_name, SizeT len, Int32 kind) + { + if (symbol_name == nullptr || *symbol_name == 0) + return nullptr; + if (len > kPathLen || len < 1) + return nullptr; + + auto ret = + reinterpret_cast<SymbolType>(fLoader->FindSymbol(symbol_name, kind)); + + if (!ret) + { + if (kind == kPefCode) + return (VoidPtr)__mh_purecall; + + return nullptr; + } + + return ret; + } + + private: + PEFLoader* fLoader{nullptr}; + }; + + typedef SharedObject* SharedObjectPtr; +} // namespace NewOS #endif /* ifndef __KERNELKIT_SHARED_OBJECT_HXX__ */ |
