VirtualBox

source: vbox/trunk/include/iprt/ldr.h@ 4878

Last change on this file since 4878 was 4071, checked in by vboxsync, 17 years ago

Biggest check-in ever. New source code headers for all (C) innotek files.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.0 KB
Line 
1/** @file
2 * innotek Portable Runtime - Loader.
3 */
4
5/*
6 * Copyright (C) 2006-2007 innotek GmbH
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License as published by the Free Software Foundation,
12 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
13 * distribution. VirtualBox OSE is distributed in the hope that it will
14 * be useful, but WITHOUT ANY WARRANTY of any kind.
15 */
16
17#ifndef ___iprt_ldr_h
18#define ___iprt_ldr_h
19
20#include <iprt/cdefs.h>
21#include <iprt/types.h>
22
23
24/** @defgroup grp_ldr RTLdr - Loader
25 * @ingroup grp_rt
26 * @{
27 */
28
29__BEGIN_DECLS
30
31
32/**
33 * Loads a dynamic load library (/shared object) image file using native
34 * OS facilities.
35 *
36 * The filename will be appended the default DLL/SO extension of
37 * the platform if it have been omitted. This means that it's not
38 * possible to load DLLs/SOs with no extension using this interface,
39 * but that's not a bad tradeoff.
40 *
41 * If no path is specified in the filename, the OS will usually search it's library
42 * path to find the image file.
43 *
44 * @returns iprt status code.
45 * @param pszFilename Image filename.
46 * @param phLdrMod Where to store the handle to the loader module.
47 */
48RTDECL(int) RTLdrLoad(const char *pszFilename, PRTLDRMOD phLdrMod);
49
50/**
51 * Open a binary image file.
52 *
53 * @returns iprt status code.
54 * @param pszFilename Image filename.
55 * @param phLdrMod Where to store the handle to the loader module.
56 */
57RTDECL(int) RTLdrOpen(const char *pszFilename, PRTLDRMOD phLdrMod);
58
59/**
60 * Opens a binary image file using kLdr.
61 *
62 * @returns iprt status code.
63 * @param pszFilename Image filename.
64 * @param phLdrMod Where to store the handle to the loaded module.
65 * @remark Primarily for testing the loader.
66 */
67RTDECL(int) RTLdrOpenkLdr(const char *pszFilename, PRTLDRMOD phLdrMod);
68
69/**
70 * What to expect and do with the bits passed to RTLdrOpenBits().
71 */
72typedef enum RTLDROPENBITS
73{
74 /** The usual invalid 0 entry. */
75 RTLDROPENBITS_INVALID = 0,
76 /** The bits are readonly and will never be changed. */
77 RTLDROPENBITS_READONLY,
78 /** The bits are going to be changed and the loader will have to duplicate them
79 * when opening the image. */
80 RTLDROPENBITS_WRITABLE,
81 /** The bits are both the source and destination for the loader operation.
82 * This means that the loader may have to duplicate them prior to changing them. */
83 RTLDROPENBITS_SRC_AND_DST,
84 /** The end of the valid enums. This entry marks the
85 * first invalid entry.. */
86 RTLDROPENBITS_END,
87 RTLDROPENBITS_32BIT_HACK = 0x7fffffff
88} RTLDROPENBITS;
89
90/**
91 * Open a binary image from in-memory bits.
92 *
93 * @returns iprt status code.
94 * @param pvBits The start of the raw-image.
95 * @param cbBits The size of the raw-image.
96 * @param enmBits What to expect from the pvBits.
97 * @param pszLogName What to call the raw-image when logging.
98 * For RTLdrLoad and RTLdrOpen the filename is used for this.
99 * @param phLdrMod Where to store the handle to the loader module.
100 */
101RTDECL(int) RTLdrOpenBits(const void *pvBits, size_t cbBits, RTLDROPENBITS enmBits, const char *pszLogName, PRTLDRMOD phLdrMod);
102
103/**
104 * Closes a loader module handle.
105 *
106 * The handle can be obtained using any of the RTLdrLoad(), RTLdrOpen()
107 * and RTLdrOpenBits() functions.
108 *
109 * @returns iprt status code.
110 * @param hLdrMod The loader module handle.
111 */
112RTDECL(int) RTLdrClose(RTLDRMOD hLdrMod);
113
114/**
115 * Gets the address of a named exported symbol.
116 *
117 * @returns iprt status code.
118 * @param hLdrMod The loader module handle.
119 * @param pszSymbol Symbol name.
120 * @param ppvValue Where to store the symbol value. Note that this is restricted to the
121 * pointer size used on the host!
122 */
123RTDECL(int) RTLdrGetSymbol(RTLDRMOD hLdrMod, const char *pszSymbol, void **ppvValue);
124
125/**
126 * Gets the address of a named exported symbol.
127 *
128 * This function differs from the plain one in that it can deal with
129 * both GC and HC address sizes, and that it can calculate the symbol
130 * value relative to any given base address.
131 *
132 * @returns iprt status code.
133 * @param hLdrMod The loader module handle.
134 * @param pvBits Optional pointer to the loaded image.
135 * Set this to NULL if no RTLdrGetBits() processed image bits are available.
136 * Not supported for RTLdrLoad() images.
137 * @param BaseAddress Image load address.
138 * Not supported for RTLdrLoad() images.
139 * @param pszSymbol Symbol name.
140 * @param pValue Where to store the symbol value.
141 */
142RTDECL(int) RTLdrGetSymbolEx(RTLDRMOD hLdrMod, const void *pvBits, RTUINTPTR BaseAddress, const char *pszSymbol, RTUINTPTR *pValue);
143
144/**
145 * Gets the size of the loaded image.
146 * This is only supported for modules which has been opened using RTLdrOpen() and RTLdrOpenBits().
147 *
148 * @returns image size (in bytes).
149 * @returns ~(size_t)0 on if not opened by RTLdrOpen().
150 * @param hLdrMod Handle to the loader module.
151 * @remark Not supported for RTLdrLoad() images.
152 */
153RTDECL(size_t) RTLdrSize(RTLDRMOD hLdrMod);
154
155/**
156 * Resolve an external symbol during RTLdrGetBits().
157 *
158 * @returns iprt status code.
159 * @param hLdrMod The loader module handle.
160 * @param pszModule Module name.
161 * @param pszSymbol Symbol name, NULL if uSymbol should be used.
162 * @param uSymbol Symbol ordinal, ~0 if pszSymbol should be used.
163 * @param pValue Where to store the symbol value (address).
164 * @param pvUser User argument.
165 */
166typedef DECLCALLBACK(int) RTLDRIMPORT(RTLDRMOD hLdrMod, const char *pszModule, const char *pszSymbol, unsigned uSymbol, RTUINTPTR *pValue, void *pvUser);
167/** Pointer to a FNRTLDRIMPORT() callback function. */
168typedef RTLDRIMPORT *PFNRTLDRIMPORT;
169
170/**
171 * Loads the image into a buffer provided by the user and applies fixups
172 * for the given base address.
173 *
174 * @returns iprt status code.
175 * @param hLdrMod The load module handle.
176 * @param pvBits Where to put the bits.
177 * Must be as large as RTLdrSize() suggests.
178 * @param BaseAddress The base address.
179 * @param pfnGetImport Callback function for resolving imports one by one.
180 * @param pvUser User argument for the callback.
181 * @remark Not supported for RTLdrLoad() images.
182 */
183RTDECL(int) RTLdrGetBits(RTLDRMOD hLdrMod, void *pvBits, RTUINTPTR BaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser);
184
185/**
186 * Relocates bits after getting them.
187 * Useful for code which moves around a bit.
188 *
189 * @returns iprt status code.
190 * @param hLdrMod The loader module handle.
191 * @param pvBits Where the image bits are.
192 * Must've been passed to RTLdrGetBits().
193 * @param NewBaseAddress The new base address.
194 * @param OldBaseAddress The old base address.
195 * @param pfnGetImport Callback function for resolving imports one by one.
196 * @param pvUser User argument for the callback.
197 * @remark Not supported for RTLdrLoad() images.
198 */
199RTDECL(int) RTLdrRelocate(RTLDRMOD hLdrMod, void *pvBits, RTUINTPTR NewBaseAddress, RTUINTPTR OldBaseAddress,
200 PFNRTLDRIMPORT pfnGetImport, void *pvUser);
201
202/**
203 * Enumeration callback function used by RTLdrEnumSymbols().
204 *
205 * @returns iprt status code. Failure will stop the enumeration.
206 * @param hLdrMod The loader module handle.
207 * @param pszSymbol Symbol name. NULL if ordinal only.
208 * @param uSymbol Symbol ordinal, ~0 if not used.
209 * @param Value Symbol value.
210 * @param pvUser The user argument specified to RTLdrEnumSymbols().
211 */
212typedef DECLCALLBACK(int) RTLDRENUMSYMS(RTLDRMOD hLdrMod, const char *pszSymbol, unsigned uSymbol, RTUINTPTR Value, void *pvUser);
213/** Pointer to a RTLDRENUMSYMS() callback function. */
214typedef RTLDRENUMSYMS *PFNRTLDRENUMSYMS;
215
216/**
217 * Enumerates all symbols in a module.
218 *
219 * @returns iprt status code.
220 * @param hLdrMod The loader module handle.
221 * @param fFlags Flags indicating what to return and such.
222 * @param pvBits Optional pointer to the loaded image. (RTLDR_ENUM_SYMBOL_FLAGS_*)
223 * Set this to NULL if no RTLdrGetBits() processed image bits are available.
224 * @param BaseAddress Image load address.
225 * @param pfnCallback Callback function.
226 * @param pvUser User argument for the callback.
227 * @remark Not supported for RTLdrLoad() images.
228 */
229RTDECL(int) RTLdrEnumSymbols(RTLDRMOD hLdrMod, unsigned fFlags, const void *pvBits, RTUINTPTR BaseAddress, PFNRTLDRENUMSYMS pfnCallback, void *pvUser);
230
231/** @name RTLdrEnumSymbols flags.
232 * @{ */
233/** Returns ALL kinds of symbols. The default is to only return public/exported symbols. */
234#define RTLDR_ENUM_SYMBOL_FLAGS_ALL BIT(1)
235/** @} */
236
237__END_DECLS
238
239/** @} */
240
241#endif
242
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette