summaryrefslogtreecommitdiffhomepage
path: root/Private/KernelKit/SharedObjectCore.hxx
blob: 07b261d009deb3ad0a9987146c962f196477d781 (plain)
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
/*
 *      ========================================================
 *
 *      hCore
 *      Copyright 2024 Mahrouss Logic, all rights reserved.
 *
 *      ========================================================
 */

#ifndef __KERNELKIT_SHARED_OBJECT_CORE_HXX__
#define __KERNELKIT_SHARED_OBJECT_CORE_HXX__

#include "CodeManager.hpp"
#include "PEF.hpp"
#include <KernelKit/Loader.hpp>
#include <NewKit/Defines.hpp>

namespace hCore
{
class SharedObject final
{
  public:
    struct SharedObjectTraits final
    {
        VoidPtr fImageObject;
        VoidPtr fImageEntrypointOffset;
    };

  public:
    explicit SharedObject() = default;
    ~SharedObject() = default;

  public:
    HCORE_COPY_DEFAULT(SharedObject);

  private:
    SharedObjectTraits *fMounted{nullptr};

  public:
    SharedObjectTraits **GetAddressOf()
    {
        return &fMounted;
    }
    SharedObjectTraits *Get()
    {
        return fMounted;
    }

  public:
    void Mount(SharedObjectTraits *to_mount)
    {
        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)
    {
        auto ret = reinterpret_cast<SymbolType>(fLoader->FindSymbol(symbol_name, kPefCode));

        if (!ret)
            ret = reinterpret_cast<SymbolType>(fLoader->FindSymbol(symbol_name, kPefData));

        if (!ret)
            ret = reinterpret_cast<SymbolType>(fLoader->FindSymbol(symbol_name, kPefZero));

        return ret;
    }

  private:
    PEFLoader *fLoader{nullptr};
};

inline void hcore_pure_call(void)
{
    // virtual placeholder.
    return;
}
} // namespace hCore

#endif /* ifndef __KERNELKIT_SHARED_OBJECT_CORE_HXX__ */