SUPLibInternal.h revision b7c385a242e67480d5c3a33425daf1ca451f16d0
/* $Id$ */
/** @file
* VirtualBox Support Library - Internal header.
*/
/*
* Copyright (C) 2006-2007 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* The contents of this file may alternatively be used under the terms
* of the Common Development and Distribution License Version 1.0
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
* VirtualBox OSE distribution, in which case the provisions of the
* CDDL are applicable instead of those of the GPL.
*
* You may elect to license modified versions of this file under the
* terms and conditions of either the GPL or the CDDL or both.
*/
#ifndef ___SUPLibInternal_h___
#define ___SUPLibInternal_h___
/*******************************************************************************
* Defined Constants And Macros *
*******************************************************************************/
/** @def SUPLIB_DLL_SUFF
#if defined(RT_OS_DARWIN)
# define SUPLIB_DLL_SUFF ".dylib"
# define SUPLIB_DLL_SUFF ".s.so"
# define SUPLIB_DLL_SUFF ".dll"
#else
# define SUPLIB_DLL_SUFF ".so"
#endif
#ifdef RT_OS_SOLARIS
/** Number of dummy files to open (2:ip4, 1:ip6, 1:extra) see
* @bugref{4650}. */
# define SUPLIB_FLT_DUMMYFILES 4
#endif
/** @def SUPLIB_EXE_SUFF
* The (typical) executable suffix. */
#if defined(RT_OS_OS2) || defined(RT_OS_WINDOWS)
# define SUPLIB_EXE_SUFF ".exe"
#else
# define SUPLIB_EXE_SUFF ""
#endif
/** @def SUP_HARDENED_SUID
* Whether we're employing set-user-ID-on-execute in the hardening.
*/
# define SUP_HARDENED_SUID
#else
#endif
#ifdef IN_SUP_HARDENED_R3
/** @name Make the symbols in SUPR3HardenedStatic different from the VBoxRT ones.
* We cannot rely on DECLHIDDEN to make this separation for us since it doesn't
* work with all GCC versions. So, we resort to old fashion precompiler hacking.
* @{
*/
/** @} */
#endif /* IN_SUP_HARDENED_R3 */
/*******************************************************************************
* Structures and Typedefs *
*******************************************************************************/
/**
* The type of an installed file.
*/
typedef enum SUPINSTFILETYPE
{
kSupIFT_Invalid = 0,
/**
* Installation directory specifier.
*/
typedef enum SUPINSTDIR
{
kSupID_Invalid = 0,
} SUPINSTDIR;
/**
* Installed file.
*/
typedef struct SUPINSTFILE
{
/** File type. */
/** Install directory. */
/** Optional (true) or mandatory (false. */
bool fOptional;
/** File name. */
const char *pszFile;
} SUPINSTFILE;
typedef SUPINSTFILE *PSUPINSTFILE;
typedef SUPINSTFILE const *PCSUPINSTFILE;
/**
* Status data for a verified file.
*/
typedef struct SUPVERIFIEDFILE
{
/** The file handle or descriptor. -1 if not open. */
/** Whether the file has been validated. */
bool fValidated;
typedef SUPVERIFIEDFILE *PSUPVERIFIEDFILE;
typedef SUPVERIFIEDFILE const *PCSUPVERIFIEDFILE;
/**
* Status data for a verified directory.
*/
typedef struct SUPVERIFIEDDIR
{
/** The directory handle or descriptor. -1 if not open. */
/** Whether the directory has been validated. */
bool fValidated;
typedef SUPVERIFIEDDIR *PSUPVERIFIEDDIR;
typedef SUPVERIFIEDDIR const *PCSUPVERIFIEDDIR;
/**
* SUPLib instance data.
*
* This is data that is passed from the static to the dynamic SUPLib
* in a hardened setup.
*/
typedef struct SUPLIBDATA
{
/** The device handle. */
#if defined(RT_OS_DARWIN)
/** The connection to the VBoxSupDrv service. */
#elif defined(RT_OS_LINUX)
/** Indicates whether madvise(,,MADV_DONTFORK) works. */
bool fSysMadviseWorks;
#elif defined(RT_OS_SOLARIS)
/** Extra dummy file descriptors to prevent growing file-descriptor table on
* clean up (see @bugref{4650}). */
int ahDummy[SUPLIB_FLT_DUMMYFILES];
#elif defined(RT_OS_WINDOWS)
#endif
} SUPLIBDATA;
/** Pointer to the pre-init data. */
typedef SUPLIBDATA *PSUPLIBDATA;
/** Pointer to const pre-init data. */
typedef SUPLIBDATA const *PCSUPLIBDATA;
/**
* Pre-init data that is handed over from the hardened executable stub.
*/
typedef struct SUPPREINITDATA
{
/** Magic value (SUPPREINITDATA_MAGIC). */
/** The SUPLib instance data. */
/** The number of entries in paInstallFiles and paVerifiedFiles. */
/** g_aSupInstallFiles. */
/** g_aSupVerifiedFiles. */
/** The number of entries in paVerifiedDirs. */
/** g_aSupVerifiedDirs. */
/** Magic value (SUPPREINITDATA_MAGIC). */
typedef SUPPREINITDATA *PSUPPREINITDATA;
typedef SUPPREINITDATA const *PCSUPPREINITDATA;
/** Magic value for SUPPREINITDATA::u32Magic and SUPPREINITDATA::u32EndMagic. */
/** @copydoc supR3PreInit */
/** Pointer to supR3PreInit. */
typedef FNSUPR3PREINIT *PFNSUPR3PREINIT;
/*******************************************************************************
* Global Variables *
*******************************************************************************/
/*******************************************************************************
* OS Specific Function *
*******************************************************************************/
int suplibOsInstall(void);
int suplibOsUninstall(void);
int suplibOsQueryVTxSupported(void);
/**
* Performs the pre-initialization of the support library.
*
* This is dynamically resolved and invoked by the static library before it
* calls RTR3Init and thereby SUPR3Init.
*
* @returns IPRT status code.
* @param pPreInitData The pre init data.
* @param fFlags The SUPR3HardenedMain flags.
*/
/** @copydoc RTPathAppPrivateNoArch */
/** @copydoc RTPathAppPrivateArch */
/** @copydoc RTPathSharedLibs */
/** @copydoc RTPathAppDocs */
/** @copydoc RTPathExecDir */
/** @copydoc RTPathFilename */
/**
* Display a fatal error and try call TrustedError or quit.
*/
DECLHIDDEN(void) supR3HardenedFatalMsgV(const char *pszWhere, SUPINITOP enmWhat, int rc, const char *pszMsgFmt, va_list va);
/**
* Display a fatal error and try call TrustedError or quit.
*/
DECLHIDDEN(void) supR3HardenedFatalMsg(const char *pszWhere, SUPINITOP enmWhat, int rc, const char *pszMsgFmt, ...);
/**
* Display a fatal error and quit.
*/
/**
* Display a fatal error and quit.
*/
/**
* Display an error which may or may not be fatal.
*/
/**
* Display an error which may or may not be fatal.
*/
DECLHIDDEN(int) supR3HardenedVerifyDir(const char *pszDirPath, bool fRecursive, bool fCheckFiles, char *pszErr, size_t cbErr);
DECLHIDDEN(int) supR3HardenedVerifyFile(const char *pszFilename, RTHCUINTPTR hNativeFile, char *pszErr, size_t cbErr);
#endif