VirtualBox

source: vbox/trunk/src/VBox/HostDrivers/Support/SUPLibInternal.h@ 25258

Last change on this file since 25258 was 25258, checked in by vboxsync, 15 years ago

SUPDrv: Sketched out support for native module loading. (OS parts are all stubs and the IOC interface changes disabled.)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.2 KB
Line 
1/* $Id: SUPLibInternal.h 25258 2009-12-09 01:52:52Z vboxsync $ */
2/** @file
3 * VirtualBox Support Library - Internal header.
4 */
5
6/*
7 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 *
26 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
27 * Clara, CA 95054 USA or visit http://www.sun.com if you need
28 * additional information or have any questions.
29 */
30
31#ifndef ___SUPLibInternal_h___
32#define ___SUPLibInternal_h___
33
34/*#define SUPDRV_USE_NATIVE_LOADER*/
35
36#include <VBox/cdefs.h>
37#include <VBox/types.h>
38#include <iprt/stdarg.h>
39
40
41/*******************************************************************************
42* Defined Constants And Macros *
43*******************************************************************************/
44/** @def SUPLIB_DLL_SUFF
45 * The (typical) DLL/DYLIB/SO suffix. */
46#if defined(RT_OS_DARWIN)
47# define SUPLIB_DLL_SUFF ".dylib"
48#elif defined(RT_OS_L4)
49# define SUPLIB_DLL_SUFF ".s.so"
50#elif defined(RT_OS_OS2) || defined(RT_OS_WINDOWS)
51# define SUPLIB_DLL_SUFF ".dll"
52#else
53# define SUPLIB_DLL_SUFF ".so"
54#endif
55
56/** @def SUPLIB_EXE_SUFF
57 * The (typical) executable suffix. */
58#if defined(RT_OS_OS2) || defined(RT_OS_WINDOWS)
59# define SUPLIB_EXE_SUFF ".exe"
60#else
61# define SUPLIB_EXE_SUFF ""
62#endif
63
64/** @def SUP_HARDENED_SUID
65 * Whether we're employing set-user-ID-on-execute in the hardening.
66 */
67#if !defined(RT_OS_OS2) && !defined(RT_OS_WINDOWS) && !defined(RT_OS_L4)
68# define SUP_HARDENED_SUID
69#else
70# undef SUP_HARDENED_SUID
71#endif
72
73#ifdef IN_SUP_HARDENED_R3
74/** @name Make the symbols in SUPR3HardenedStatic different from the VBoxRT ones.
75 * We cannot rely on DECLHIDDEN to make this separation for us since it doesn't
76 * work with all GCC versions. So, we resort to old fashion precompiler hacking.
77 * @{
78 */
79# define supR3HardenedPathAppPrivateNoArch supR3HardenedStaticPathAppPrivateNoArch
80# define supR3HardenedPathAppPrivateArch supR3HardenedStaticPathAppPrivateArch
81# define supR3HardenedPathSharedLibs supR3HardenedStaticPathSharedLibs
82# define supR3HardenedPathAppDocs supR3HardenedStaticPathAppDocs
83# define supR3HardenedPathExecDir supR3HardenedStaticPathExecDir
84# define supR3HardenedPathFilename supR3HardenedStaticPathFilename
85# define supR3HardenedFatalV supR3HardenedStaticFatalV
86# define supR3HardenedFatal supR3HardenedStaticFatal
87# define supR3HardenedFatalMsgV supR3HardenedStaticFatalMsgV
88# define supR3HardenedFatalMsg supR3HardenedStaticFatalMsg
89# define supR3HardenedErrorV supR3HardenedStaticErrorV
90# define supR3HardenedError supR3HardenedStaticError
91# define supR3HardenedVerifyAll supR3HardenedStaticVerifyAll
92# define supR3HardenedVerifyDir supR3HardenedStaticVerifyDir
93# define supR3HardenedVerifyFile supR3HardenedStaticVerifyFile
94# define supR3HardenedGetPreInitData supR3HardenedStaticGetPreInitData
95# define supR3HardenedRecvPreInitData supR3HardenedStaticRecvPreInitData
96/** @} */
97#endif /* IN_SUP_HARDENED_R3 */
98
99
100/*******************************************************************************
101* Structures and Typedefs *
102*******************************************************************************/
103/**
104 * The type of an installed file.
105 */
106typedef enum SUPINSTFILETYPE
107{
108 kSupIFT_Invalid = 0,
109 kSupIFT_Exe,
110 kSupIFT_Dll,
111 kSupIFT_Sys,
112 kSupIFT_Script,
113 kSupIFT_Data,
114 kSupIFT_End
115} SUPINSTFILETYPE;
116
117/**
118 * Installation directory specifier.
119 */
120typedef enum SUPINSTDIR
121{
122 kSupID_Invalid = 0,
123 kSupID_Bin,
124 kSupID_AppBin,
125 kSupID_SharedLib,
126 kSupID_AppPrivArch,
127 kSupID_AppPrivArchComp,
128 kSupID_AppPrivNoArch,
129 kSupID_End
130} SUPINSTDIR;
131
132/**
133 * Installed file.
134 */
135typedef struct SUPINSTFILE
136{
137 /** File type. */
138 SUPINSTFILETYPE enmType;
139 /** Install directory. */
140 SUPINSTDIR enmDir;
141 /** Optional (true) or mandatory (false. */
142 bool fOptional;
143 /** File name. */
144 const char *pszFile;
145} SUPINSTFILE;
146typedef SUPINSTFILE *PSUPINSTFILE;
147typedef SUPINSTFILE const *PCSUPINSTFILE;
148
149/**
150 * Status data for a verified file.
151 */
152typedef struct SUPVERIFIEDFILE
153{
154 /** The file handle or descriptor. -1 if not open. */
155 intptr_t hFile;
156 /** Whether the file has been validated. */
157 bool fValidated;
158} SUPVERIFIEDFILE;
159typedef SUPVERIFIEDFILE *PSUPVERIFIEDFILE;
160typedef SUPVERIFIEDFILE const *PCSUPVERIFIEDFILE;
161
162/**
163 * Status data for a verified directory.
164 */
165typedef struct SUPVERIFIEDDIR
166{
167 /** The directory handle or descriptor. -1 if not open. */
168 intptr_t hDir;
169 /** Whether the directory has been validated. */
170 bool fValidated;
171} SUPVERIFIEDDIR;
172typedef SUPVERIFIEDDIR *PSUPVERIFIEDDIR;
173typedef SUPVERIFIEDDIR const *PCSUPVERIFIEDDIR;
174
175
176/**
177 * SUPLib instance data.
178 *
179 * This is data that is passed from the static to the dynamic SUPLib
180 * in a hardened setup.
181 */
182typedef struct SUPLIBDATA
183{
184 /** The device handle. */
185 RTFILE hDevice;
186#if defined(RT_OS_DARWIN)
187 /** The connection to the VBoxSupDrv service. */
188 uintptr_t uConnection;
189#elif defined(RT_OS_LINUX)
190 /** Indicates whether madvise(,,MADV_DONTFORK) works. */
191 bool fSysMadviseWorks;
192#elif defined(RT_OS_WINDOWS)
193#endif
194} SUPLIBDATA;
195/** Pointer to the pre-init data. */
196typedef SUPLIBDATA *PSUPLIBDATA;
197/** Pointer to const pre-init data. */
198typedef SUPLIBDATA const *PCSUPLIBDATA;
199
200
201/**
202 * Pre-init data that is handed over from the hardened executable stub.
203 */
204typedef struct SUPPREINITDATA
205{
206 /** Magic value (SUPPREINITDATA_MAGIC). */
207 uint32_t u32Magic;
208 /** The SUPLib instance data. */
209 SUPLIBDATA Data;
210 /** The number of entries in paInstallFiles and paVerifiedFiles. */
211 size_t cInstallFiles;
212 /** g_aSupInstallFiles. */
213 PCSUPINSTFILE paInstallFiles;
214 /** g_aSupVerifiedFiles. */
215 PCSUPVERIFIEDFILE paVerifiedFiles;
216 /** The number of entries in paVerifiedDirs. */
217 size_t cVerifiedDirs;
218 /** g_aSupVerifiedDirs. */
219 PCSUPVERIFIEDDIR paVerifiedDirs;
220 /** Magic value (SUPPREINITDATA_MAGIC). */
221 uint32_t u32EndMagic;
222} SUPPREINITDATA;
223typedef SUPPREINITDATA *PSUPPREINITDATA;
224typedef SUPPREINITDATA const *PCSUPPREINITDATA;
225
226/** Magic value for SUPPREINITDATA::u32Magic and SUPPREINITDATA::u32EndMagic. */
227#define SUPPREINITDATA_MAGIC UINT32_C(0xbeef0001)
228
229/** @copydoc supR3PreInit */
230typedef DECLCALLBACK(int) FNSUPR3PREINIT(PSUPPREINITDATA pPreInitData, uint32_t fFlags);
231/** Pointer to supR3PreInit. */
232typedef FNSUPR3PREINIT *PFNSUPR3PREINIT;
233
234
235/*******************************************************************************
236* Global Variables *
237*******************************************************************************/
238extern DECLHIDDEN(uint32_t) g_u32Cookie;
239extern DECLHIDDEN(uint32_t) g_u32SessionCookie;
240extern DECLHIDDEN(SUPLIBDATA) g_supLibData;
241
242
243/*******************************************************************************
244* OS Specific Function *
245*******************************************************************************/
246RT_C_DECLS_BEGIN
247int suplibOsInstall(void);
248int suplibOsUninstall(void);
249int suplibOsInit(PSUPLIBDATA pThis, bool fPreInited);
250int suplibOsTerm(PSUPLIBDATA pThis);
251int suplibOsIOCtl(PSUPLIBDATA pThis, uintptr_t uFunction, void *pvReq, size_t cbReq);
252int suplibOsIOCtlFast(PSUPLIBDATA pThis, uintptr_t uFunction, uintptr_t idCpu);
253int suplibOsPageAlloc(PSUPLIBDATA pThis, size_t cPages, void **ppvPages);
254int suplibOsPageFree(PSUPLIBDATA pThis, void *pvPages, size_t cPages);
255int suplibOsQueryVTxSupported(void);
256
257
258/**
259 * Performs the pre-initialization of the support library.
260 *
261 * This is dynamically resolved and invoked by the static library before it
262 * calls RTR3Init and thereby SUPR3Init.
263 *
264 * @returns IPRT status code.
265 * @param pPreInitData The pre init data.
266 * @param fFlags The SUPR3HardenedMain flags.
267 */
268DECLEXPORT(int) supR3PreInit(PSUPPREINITDATA pPreInitData, uint32_t fFlags);
269
270
271/** @copydoc RTPathAppPrivateNoArch */
272DECLHIDDEN(int) supR3HardenedPathAppPrivateNoArch(char *pszPath, size_t cchPath);
273/** @copydoc RTPathAppPrivateArch */
274DECLHIDDEN(int) supR3HardenedPathAppPrivateArch(char *pszPath, size_t cchPath);
275/** @copydoc RTPathSharedLibs */
276DECLHIDDEN(int) supR3HardenedPathSharedLibs(char *pszPath, size_t cchPath);
277/** @copydoc RTPathAppDocs */
278DECLHIDDEN(int) supR3HardenedPathAppDocs(char *pszPath, size_t cchPath);
279/** @copydoc RTPathExecDir */
280DECLHIDDEN(int) supR3HardenedPathExecDir(char *pszPath, size_t cchPath);
281/** @copydoc RTPathFilename */
282DECLHIDDEN(char *) supR3HardenedPathFilename(const char *pszPath);
283
284/**
285 * Display a fatal error and try call TrustedError or quit.
286 */
287DECLHIDDEN(void) supR3HardenedFatalMsgV(const char *pszWhere, SUPINITOP enmWhat, int rc, const char *pszMsgFmt, va_list va);
288
289/**
290 * Display a fatal error and try call TrustedError or quit.
291 */
292DECLHIDDEN(void) supR3HardenedFatalMsg(const char *pszWhere, SUPINITOP enmWhat, int rc, const char *pszMsgFmt, ...);
293
294/**
295 * Display a fatal error and quit.
296 */
297DECLHIDDEN(void) supR3HardenedFatalV(const char *pszFormat, va_list va);
298
299/**
300 * Display a fatal error and quit.
301 */
302DECLHIDDEN(void) supR3HardenedFatal(const char *pszFormat, ...);
303
304/**
305 * Display an error which may or may not be fatal.
306 */
307DECLHIDDEN(int) supR3HardenedErrorV(int rc, bool fFatal, const char *pszFormat, va_list va);
308
309/**
310 * Display an error which may or may not be fatal.
311 */
312DECLHIDDEN(int) supR3HardenedError(int rc, bool fFatal, const char *pszFormat, ...);
313DECLHIDDEN(int) supR3HardenedVerifyAll(bool fFatal, bool fLeaveFilesOpen, const char *pszProgName);
314DECLHIDDEN(int) supR3HardenedVerifyDir(SUPINSTDIR enmDir, bool fFatal);
315DECLHIDDEN(int) supR3HardenedVerifyFile(const char *pszFilename, bool fFatal);
316DECLHIDDEN(void) supR3HardenedGetPreInitData(PSUPPREINITDATA pPreInitData);
317DECLHIDDEN(int) supR3HardenedRecvPreInitData(PCSUPPREINITDATA pPreInitData);
318
319
320SUPR3DECL(int) supR3PageLock(void *pvStart, size_t cPages, PSUPPAGE paPages);
321SUPR3DECL(int) supR3PageUnlock(void *pvStart);
322
323RT_C_DECLS_END
324
325
326#endif
327
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