xbmc
DllLoader.h
1 /*
2  * Copyright (C) 2005-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "coffldr.h"
12 #include "LibraryLoader.h"
13 
14 // clang-format off
15 #if defined(__linux__) && \
16  !defined(__aarch64__) && \
17  !defined(__alpha__) && \
18  !defined(__arc__) && \
19  !defined(__arm__) && \
20  !defined(__loongarch__) && \
21  !defined(__mips__) && \
22  !defined(__powerpc__) && \
23  !defined(__or1k__) && \
24  !defined(__riscv) && \
25  !defined(__SH4__) && \
26  !defined(__s390x__) && \
27  !defined(__sparc__) && \
28  !defined(__xtensa__)
29 #define USE_LDT_KEEPER
30 #include "ldt_keeper.h"
31 #endif
32 // clang-format on
33 
34 #ifndef NULL
35 #define NULL 0
36 #endif
37 
38 class DllLoader;
39 
40 
41 typedef struct Export
42 {
43  const char* name;
44  unsigned long ordinal;
45  void* function;
46  void* track_function;
47 } Export;
48 
49 typedef struct ExportEntry
50 {
51  Export exp;
52  ExportEntry* next;
53 } ExportEntry;
54 
55 typedef struct _LoadedList
56 {
57  DllLoader* pDll;
58  _LoadedList* pNext;
59 } LoadedList;
60 
61 class DllLoader : public CoffLoader, public LibraryLoader
62 {
63 public:
64  DllLoader(const char *dll, bool track = false, bool bSystemDll = false, bool bLoadSymbols = false, Export* exports = NULL);
65  ~DllLoader() override;
66 
67  bool Load() override;
68  void Unload() override;
69 
70  int ResolveExport(const char*, void** ptr, bool logging = true) override;
71  int ResolveOrdinal(unsigned long ordinal, void** ptr) override;
72  bool HasSymbols() override { return m_bLoadSymbols && !m_bUnloadSymbols; }
73  bool IsSystemDll() override { return m_bSystemDll; }
74  HMODULE GetHModule() override { return (HMODULE)hModule; }
75 
76  Export* GetExportByFunctionName(const char* sFunctionName);
77  Export* GetExportByOrdinal(unsigned long ordinal);
78 protected:
79  int Parse();
80  int ResolveImports();
81 
82  void AddExport(unsigned long ordinal, void* function, void* track_function = NULL);
83  void AddExport(char* sFunctionName, unsigned long ordinal, void* function, void* track_function = NULL);
84  void AddExport(char* sFunctionName, void* function, void* track_function = NULL);
85  void SetExports(Export* exports) { m_pStaticExports = exports; }
86 
87 protected:
88  // Just pointers; don't delete...
89  ImportDirTable_t *ImportDirTable;
90  ExportDirTable_t *ExportDirTable;
91  bool m_bTrack;
92  bool m_bSystemDll; // true if this dll should not be removed
93  bool m_bLoadSymbols; // when true this dll should not be removed
94  bool m_bUnloadSymbols;
95  ExportEntry* m_pExportHead;
96  Export* m_pStaticExports;
97  LoadedList* m_pDlls;
98 
99 #ifdef USE_LDT_KEEPER
100  ldt_fs_t* m_ldt_fs;
101 #endif
102 
103  void PrintImportLookupTable(unsigned long ImportLookupTable_RVA);
104  void PrintImportTable(ImportDirTable_t *ImportDirTable);
105  void PrintExportTable(ExportDirTable_t *ExportDirTable);
106 
107  int ResolveOrdinal(const char*, unsigned long, void**);
108  int ResolveName(const char*, char*, void **);
109  const char* ResolveReferencedDll(const char* dll);
110  int LoadExports();
111  void LoadSymbols();
112  static void UnloadSymbols();
113 };
Definition: LibraryLoader.h:17
Definition: DllLoader.h:55
Definition: DllLoader.h:41
Definition: coff.h:431
Definition: DllLoader.h:61
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! This file MUST be in main library because LDT must...
Definition: ldt_keeper.h:26
Definition: coff.h:458
Definition: coffldr.h:16
Definition: visualization.h:21
Definition: DllLoader.h:49