/** * Hardened main failed, report the error without any unnecessary fuzz. * * @remarks Do not call IPRT here unless really required, it might not be * initialized. */ extern "C" DECLEXPORT(void) TrustedError (const char *pszWhere, SUPINITOP enmWhat, int rc, const char *pszMsgFmt, va_list va) { # if defined(RT_OS_DARWIN) ShutUpAppKit(); # endif /* * Init the Qt application object. This is a bit hackish as we * don't have the argument vector handy. */ int argc = 0; char *argv[2] = { NULL, NULL }; QApplication a (argc, &argv[0]); /* * Compose and show the error message. */ QString msgTitle = QApplication::tr ("VirtualBox - Error In %1").arg (pszWhere); char msgBuf[1024]; vsprintf (msgBuf, pszMsgFmt, va); QString msgText = QApplication::tr ( "<html><b>%1 (rc=%2)</b><br/><br/>").arg (msgBuf).arg (rc); switch (enmWhat) { case kSupInitOp_Driver: # ifdef RT_OS_LINUX msgText += g_QStrHintLinuxNoDriver; # else msgText += g_QStrHintOtherNoDriver; # endif break; # ifdef RT_OS_LINUX case kSupInitOp_IPRT: if (rc == VERR_NO_MEMORY) msgText += g_QStrHintLinuxNoMemory; else # endif if (rc == VERR_VM_DRIVER_VERSION_MISMATCH) # ifdef RT_OS_LINUX msgText += g_QStrHintLinuxWrongDriverVersion; # else msgText += g_QStrHintOtherWrongDriverVersion; # endif else msgText += g_QStrHintReinstall; break; case kSupInitOp_Integrity: case kSupInitOp_RootCheck: msgText += g_QStrHintReinstall; break; default: /* no hints here */ break; }
extern "C" DECLEXPORT(void) TrustedError(const char *pszWhere, SUPINITOP enmWhat, int rc, const char *pszMsgFmt, va_list va) { # ifdef RT_OS_DARWIN ShutUpAppKit(); # endif /* RT_OS_DARWIN */ /* We have to create QApplication anyway just to show the only one error-message. * This is a bit hackish as we don't have the argument vector handy. */ int argc = 0; char *argv[2] = { NULL, NULL }; QApplication a(argc, &argv[0]); /* Prepare the error-message: */ QString strTitle = QApplication::tr("VirtualBox - Error In %1").arg(pszWhere); char szMsgBuf[1024]; RTStrPrintfV(szMsgBuf, sizeof(szMsgBuf), pszMsgFmt, va); QString strText = QApplication::tr("<html><b>%1 (rc=%2)</b><br/><br/>").arg(szMsgBuf).arg(rc); strText.replace(QString("\n"), QString("<br>")); switch (enmWhat) { case kSupInitOp_Driver: # ifdef RT_OS_LINUX strText += g_QStrHintLinuxNoDriver; # else /* RT_OS_LINUX */ strText += g_QStrHintOtherNoDriver; # endif /* !RT_OS_LINUX */ break; # ifdef RT_OS_LINUX case kSupInitOp_IPRT: case kSupInitOp_Misc: if (rc == VERR_NO_MEMORY) strText += g_QStrHintLinuxNoMemory; else # endif /* RT_OS_LINUX */ if (rc == VERR_VM_DRIVER_VERSION_MISMATCH) # ifdef RT_OS_LINUX strText += g_QStrHintLinuxWrongDriverVersion; # else /* RT_OS_LINUX */ strText += g_QStrHintOtherWrongDriverVersion; # endif /* !RT_OS_LINUX */ else strText += g_QStrHintReinstall; break; case kSupInitOp_Integrity: case kSupInitOp_RootCheck: strText += g_QStrHintReinstall; break; default: /* no hints here */ break; }
extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char ** /*envp*/) { /* Start logging: */ LogFlowFuncEnter(); /* Failed result initially: */ int iResultCode = 1; #ifdef Q_WS_X11 if (!VBoxXInitThreads()) return 1; #endif /* Simulate try-catch block: */ do { #ifdef RT_OS_DARWIN ShutUpAppKit(); #endif /* RT_OS_DARWIN */ /* Console help preprocessing: */ bool fHelpShown = false; for (int i = 0; i < argc; ++i) { if ( !strcmp(argv[i], "-h") || !strcmp(argv[i], "-?") || !strcmp(argv[i], "-help") || !strcmp(argv[i], "--help")) { showHelp(); fHelpShown = true; break; } } if (fHelpShown) { iResultCode = 0; break; } #if defined(DEBUG) && defined(Q_WS_X11) && defined(RT_OS_LINUX) /* Install our signal handler to backtrace the call stack: */ struct sigaction sa; sa.sa_sigaction = bt_sighandler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART | SA_SIGINFO; sigaction(SIGSEGV, &sa, NULL); sigaction(SIGBUS, &sa, NULL); sigaction(SIGUSR1, &sa, NULL); #endif #ifdef Q_WS_MAC /* Mavericks font fix: */ if (VBoxGlobal::osRelease() == MacOSXRelease_Mavericks) QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande"); # ifdef QT_MAC_USE_COCOA /* Instantiate our NSApplication derivative before QApplication * forces NSApplication to be instantiated. */ UICocoaApplication::instance(); # endif /* QT_MAC_USE_COCOA */ #endif /* Q_WS_MAC */ /* Install Qt console message handler: */ qInstallMsgHandler(QtMessageOutput); #ifdef Q_WS_X11 /* Qt has a complex algorithm for selecting the right visual which * doesn't always seem to work. So we naively choose a visual - the * default one - ourselves and pass that to Qt. This means that we * also have to open the display ourselves. * We check the Qt parameter list and handle Qt's -display argument * ourselves, since we open the display connection. We also check the * to see if the user has passed Qt's -visual parameter, and if so we * assume that the user wants Qt to handle visual selection after all, * and don't supply a visual. */ char *pszDisplay = NULL; bool useDefaultVisual = true; for (int i = 0; i < argc; ++i) { if (!::strcmp(argv[i], "-display") && (i + 1 < argc)) /* What if it isn't? Rely on QApplication to complain? */ { pszDisplay = argv[i + 1]; ++i; } else if (!::strcmp(argv[i], "-visual")) useDefaultVisual = false; } Display *pDisplay = XOpenDisplay(pszDisplay); if (!pDisplay) { RTPrintf(pszDisplay ? "Failed to open the X11 display \"%s\"!\n" : "Failed to open the X11 display!\n", pszDisplay); break; } Visual *pVisual = useDefaultVisual ? DefaultVisual(pDisplay, DefaultScreen(pDisplay)) : NULL; /* Now create the application object: */ QApplication a(pDisplay, argc, argv, (Qt::HANDLE)pVisual); #else /* Q_WS_X11 */ QApplication a(argc, argv); #endif /* Q_WS_X11 */ #ifdef Q_OS_SOLARIS /* Use plastique look&feel for Solaris instead of the default motif (Qt 4.7.x): */ QApplication::setStyle(new QPlastiqueStyle); #endif /* Q_OS_SOLARIS */ #ifdef Q_WS_X11 /* This patch is not used for now on Solaris & OpenSolaris because * there is no anti-aliasing enabled by default, Qt4 to be rebuilt. */ # ifndef Q_OS_SOLARIS /* Cause Qt4 has the conflict with fontconfig application as a result * sometimes substituting some fonts with non scaleable-anti-aliased * bitmap font we are reseting substitutes for the current application * font family if it is non scaleable-anti-aliased. */ QFontDatabase fontDataBase; QString currentFamily(QApplication::font().family()); bool isCurrentScaleable = fontDataBase.isScalable(currentFamily); QString subFamily(QFont::substitute(currentFamily)); bool isSubScaleable = fontDataBase.isScalable(subFamily); if (isCurrentScaleable && !isSubScaleable) QFont::removeSubstitution(currentFamily); # endif /* Q_OS_SOLARIS */ #endif /* Q_WS_X11 */ #ifdef Q_WS_WIN /* Drag in the sound drivers and DLLs early to get rid of the delay taking * place when the main menu bar (or any action from that menu bar) is * activated for the first time. This delay is especially annoying if it * happens when the VM is executing in real mode (which gives 100% CPU * load and slows down the load process that happens on the main GUI * thread to several seconds). */ PlaySound(NULL, NULL, 0); #endif /* Q_WS_WIN */ #ifdef Q_WS_MAC /* Disable menu icons on MacOS X host: */ ::darwinDisableIconsInMenus(); #endif /* Q_WS_MAC */ #ifdef Q_WS_X11 /* Qt version check (major.minor are sensitive, fix number is ignored): */ if (VBoxGlobal::qtRTVersion() < (VBoxGlobal::qtCTVersion() & 0xFFFF00)) { QString strMsg = QApplication::tr("Executable <b>%1</b> requires Qt %2.x, found Qt %3.") .arg(qAppName()) .arg(VBoxGlobal::qtCTVersionString().section('.', 0, 1)) .arg(VBoxGlobal::qtRTVersionString()); QMessageBox::critical(0, QApplication::tr("Incompatible Qt Library Error"), strMsg, QMessageBox::Abort, 0); qFatal("%s", strMsg.toAscii().constData()); break; } #endif /* Q_WS_X11 */ /* Create modal-window manager: */ UIModalWindowManager::create(); /* Create global UI instance: */ VBoxGlobal::create(); /* Simulate try-catch block: */ do { /* Exit if VBoxGlobal is not valid: */ if (!vboxGlobal().isValid()) break; /* Exit if VBoxGlobal was able to pre-process arguments: */ if (vboxGlobal().processArgs()) break; #ifdef RT_OS_LINUX /* Make sure no wrong USB mounted: */ VBoxGlobal::checkForWrongUSBMounted(); #endif /* RT_OS_LINUX */ /* Load application settings: */ VBoxGlobalSettings settings = vboxGlobal().settings(); /* VM console process: */ if (vboxGlobal().isVMConsoleProcess()) { /* Make sure VM is started: */ if (!vboxGlobal().startMachine(vboxGlobal().managedVMUuid())) break; /* Start application: */ iResultCode = a.exec(); } /* VM selector process: */ else { /* Make sure VM selector is permitted: */ if (settings.isFeatureActive("noSelector")) { msgCenter().cannotStartSelector(); break; } #ifdef VBOX_BLEEDING_EDGE msgCenter().showBEBWarning(); #else /* VBOX_BLEEDING_EDGE */ # ifndef DEBUG /* Check for BETA version: */ QString vboxVersion(vboxGlobal().virtualBox().GetVersion()); if (vboxVersion.contains("BETA")) { /* Allow to prevent this message: */ QString str = vboxGlobal().virtualBox().GetExtraData(GUI_PreventBetaWarning); if (str != vboxVersion) msgCenter().showBETAWarning(); } # endif /* !DEBUG */ #endif /* !VBOX_BLEEDING_EDGE*/ /* Create/show selector window: */ vboxGlobal().selectorWnd().show(); /* Start application: */ iResultCode = a.exec(); } } while (0); /* Destroy global UI instance: */ VBoxGlobal::destroy(); /* Destroy modal-window manager: */ UIModalWindowManager::destroy(); } while (0); /* Finish logging: */ LogFlowFunc(("rc=%d\n", iResultCode)); LogFlowFuncLeave(); /* Return result: */ return iResultCode; }
extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char ** /*envp*/) { /* Start logging: */ LogFlowFuncEnter(); /* Failed result initially: */ int iResultCode = 1; #ifdef Q_WS_X11 if (!VBoxXInitThreads()) return 1; #endif /* Q_WS_X11 */ /* Simulate try-catch block: */ do { #ifdef RT_OS_DARWIN ShutUpAppKit(); #endif /* RT_OS_DARWIN */ /* Console help preprocessing: */ bool fHelpShown = false; for (int i = 0; i < argc; ++i) { if ( !strcmp(argv[i], "-h") || !strcmp(argv[i], "-?") || !strcmp(argv[i], "-help") || !strcmp(argv[i], "--help")) { showHelp(); fHelpShown = true; break; } } if (fHelpShown) { iResultCode = 0; break; } #if defined(DEBUG) && defined(Q_WS_X11) && defined(RT_OS_LINUX) /* Install our signal handler to backtrace the call stack: */ struct sigaction sa; sa.sa_sigaction = bt_sighandler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART | SA_SIGINFO; sigaction(SIGSEGV, &sa, NULL); sigaction(SIGBUS, &sa, NULL); sigaction(SIGUSR1, &sa, NULL); #endif #ifdef VBOX_WITH_HARDENING /* Make sure the image verification code works (VBoxDbg.dll and other plugins). */ SUPR3HardenedVerifyInit(); #endif #ifdef Q_WS_MAC /* Font fixes: */ switch (VBoxGlobal::osRelease()) { case MacOSXRelease_Mavericks: QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande"); break; case MacOSXRelease_Yosemite: QFont::insertSubstitution(".Helvetica Neue DeskInterface", "Helvetica Neue"); break; default: break; } # ifdef QT_MAC_USE_COCOA /* Instantiate our NSApplication derivative before QApplication * forces NSApplication to be instantiated. */ UICocoaApplication::instance(); # endif /* QT_MAC_USE_COCOA */ #endif /* Q_WS_MAC */ /* Install Qt console message handler: */ qInstallMsgHandler(QtMessageOutput); /* Create application: */ QApplication a(argc, argv); #ifdef Q_WS_X11 /* To avoid various Qt crashes * when testing widget attributes or acquiring winIds * we decided to make our widgets native under x11 hosts. * Yes, we aware of note that alien widgets faster to draw * but the only widget we need to be fast - viewport of VM * was always native since we are using his id for 3d service needs. */ a.setAttribute(Qt::AA_NativeWindows); #endif /* Q_WS_X11 */ #ifdef Q_WS_MAC # ifdef VBOX_GUI_WITH_HIDPI /* Enable HiDPI icons. For this we require a patched version of Qt 4.x with * the changes from https://codereview.qt-project.org/#change,54636 applied. */ qApp->setAttribute(Qt::AA_UseHighDpiPixmaps); # endif /* VBOX_GUI_WITH_HIDPI */ #endif /* Q_WS_MAC */ #ifdef Q_OS_SOLARIS /* Use plastique look&feel for Solaris instead of the default motif (Qt 4.7.x): */ QApplication::setStyle(new QPlastiqueStyle); #endif /* Q_OS_SOLARIS */ #ifdef Q_WS_X11 /* This patch is not used for now on Solaris & OpenSolaris because * there is no anti-aliasing enabled by default, Qt4 to be rebuilt. */ # ifndef Q_OS_SOLARIS /* Cause Qt4 has the conflict with fontconfig application as a result * sometimes substituting some fonts with non scaleable-anti-aliased * bitmap font we are reseting substitutes for the current application * font family if it is non scaleable-anti-aliased. */ QFontDatabase fontDataBase; QString currentFamily(QApplication::font().family()); bool isCurrentScaleable = fontDataBase.isScalable(currentFamily); QString subFamily(QFont::substitute(currentFamily)); bool isSubScaleable = fontDataBase.isScalable(subFamily); if (isCurrentScaleable && !isSubScaleable) QFont::removeSubstitution(currentFamily); # endif /* Q_OS_SOLARIS */ #endif /* Q_WS_X11 */ #ifdef Q_WS_WIN /* Drag in the sound drivers and DLLs early to get rid of the delay taking * place when the main menu bar (or any action from that menu bar) is * activated for the first time. This delay is especially annoying if it * happens when the VM is executing in real mode (which gives 100% CPU * load and slows down the load process that happens on the main GUI * thread to several seconds). */ PlaySound(NULL, NULL, 0); #endif /* Q_WS_WIN */ #ifdef Q_WS_MAC /* Disable menu icons on MacOS X host: */ ::darwinDisableIconsInMenus(); #endif /* Q_WS_MAC */ #ifdef Q_WS_X11 /* Qt version check (major.minor are sensitive, fix number is ignored): */ if (VBoxGlobal::qtRTVersion() < (VBoxGlobal::qtCTVersion() & 0xFFFF00)) { QString strMsg = QApplication::tr("Executable <b>%1</b> requires Qt %2.x, found Qt %3.") .arg(qAppName()) .arg(VBoxGlobal::qtCTVersionString().section('.', 0, 1)) .arg(VBoxGlobal::qtRTVersionString()); QMessageBox::critical(0, QApplication::tr("Incompatible Qt Library Error"), strMsg, QMessageBox::Abort, 0); qFatal("%s", strMsg.toUtf8().constData()); break; } #endif /* Q_WS_X11 */ /* Create modal-window manager: */ UIModalWindowManager::create(); /* Create global UI instance: */ VBoxGlobal::create(); /* Simulate try-catch block: */ do { /* Exit if VBoxGlobal is not valid: */ if (!vboxGlobal().isValid()) break; /* Exit if VBoxGlobal was able to pre-process arguments: */ if (vboxGlobal().processArgs()) break; #ifdef RT_OS_LINUX /* Make sure no wrong USB mounted: */ VBoxGlobal::checkForWrongUSBMounted(); #endif /* RT_OS_LINUX */ /* Load application settings: */ VBoxGlobalSettings settings = vboxGlobal().settings(); /* VM console process: */ if (vboxGlobal().isVMConsoleProcess()) { /* Make sure VM is started: */ if (!UIMachine::startMachine(vboxGlobal().managedVMUuid())) break; /* Start application: */ iResultCode = a.exec(); } /* VM selector process: */ else { /* Make sure VM selector is permitted: */ if (settings.isFeatureActive("noSelector")) { msgCenter().cannotStartSelector(); break; } #ifdef VBOX_BLEEDING_EDGE msgCenter().showExperimentalBuildWarning(); #else /* VBOX_BLEEDING_EDGE */ # ifndef DEBUG /* Check for BETA version: */ const QString vboxVersion(vboxGlobal().virtualBox().GetVersion()); if ( vboxVersion.contains("BETA") && gEDataManager->preventBetaBuildWarningForVersion() != vboxVersion) msgCenter().showBetaBuildWarning(); # endif /* !DEBUG */ #endif /* !VBOX_BLEEDING_EDGE*/ /* Create/show selector window: */ vboxGlobal().selectorWnd().show(); /* Start application: */ iResultCode = a.exec(); } } while (0); /* Destroy global UI instance: */ VBoxGlobal::destroy(); /* Destroy modal-window manager: */ UIModalWindowManager::destroy(); } while (0); /* Finish logging: */ LogFlowFunc(("rc=%d\n", iResultCode)); LogFlowFuncLeave(); /* Return result: */ return iResultCode; }
extern "C" DECLEXPORT(int) TrustedMain (int argc, char **argv, char ** /*envp*/) { LogFlowFuncEnter(); # if defined(RT_OS_DARWIN) ShutUpAppKit(); # endif for (int i=0; i<argc; i++) if ( !strcmp(argv[i], "-h") || !strcmp(argv[i], "-?") || !strcmp(argv[i], "-help") || !strcmp(argv[i], "--help")) { showHelp(); return 0; } #if defined(DEBUG) && defined(Q_WS_X11) && defined(RT_OS_LINUX) /* install our signal handler to backtrace the call stack */ struct sigaction sa; sa.sa_sigaction = bt_sighandler; sigemptyset (&sa.sa_mask); sa.sa_flags = SA_RESTART | SA_SIGINFO; sigaction (SIGSEGV, &sa, NULL); sigaction (SIGBUS, &sa, NULL); sigaction (SIGUSR1, &sa, NULL); #endif #ifdef QT_MAC_USE_COCOA /* Instantiate our NSApplication derivative before QApplication * forces NSApplication to be instantiated. */ UICocoaApplication::instance(); #endif qInstallMsgHandler (QtMessageOutput); int rc = 1; /* failure */ /* scope the QApplication variable */ { #ifdef Q_WS_X11 /* Qt has a complex algorithm for selecting the right visual which * doesn't always seem to work. So we naively choose a visual - the * default one - ourselves and pass that to Qt. This means that we * also have to open the display ourselves. * We check the Qt parameter list and handle Qt's -display argument * ourselves, since we open the display connection. We also check the * to see if the user has passed Qt's -visual parameter, and if so we * assume that the user wants Qt to handle visual selection after all, * and don't supply a visual. */ char *pszDisplay = NULL; bool useDefaultVisual = true; for (int i = 0; i < argc; ++i) { if (!::strcmp(argv[i], "-display") && (i + 1 < argc)) /* What if it isn't? Rely on QApplication to complain? */ { pszDisplay = argv[i + 1]; ++i; } else if (!::strcmp(argv[i], "-visual")) useDefaultVisual = false; } Display *pDisplay = XOpenDisplay(pszDisplay); if (!pDisplay) { RTPrintf(pszDisplay ? "Failed to open the X11 display \"%s\"!\n" : "Failed to open the X11 display!\n", pszDisplay); return 0; } Visual *pVisual = useDefaultVisual ? DefaultVisual(pDisplay, DefaultScreen(pDisplay)) : NULL; /* Now create the application object */ QApplication a (pDisplay, argc, argv, (Qt::HANDLE) pVisual); #else /* Q_WS_X11 */ QApplication a (argc, argv); #endif /* Q_WS_X11 */ /* Qt4.3 version has the QProcess bug which freezing the application * for 30 seconds. This bug is internally used at initialization of * Cleanlooks style. So we have to change this style to another one. * See http://trolltech.com/developer/task-tracker/index_html?id=179200&method=entry * for details. */ if (VBoxGlobal::qtRTVersionString().startsWith ("4.3") && qobject_cast <QCleanlooksStyle*> (QApplication::style())) QApplication::setStyle (new QPlastiqueStyle); #ifdef Q_OS_SOLARIS /* Use plastique look 'n feel for Solaris instead of the default motif (Qt 4.7.x) */ QApplication::setStyle (new QPlastiqueStyle); #endif #ifdef Q_WS_X11 /* This patch is not used for now on Solaris & OpenSolaris because * there is no anti-aliasing enabled by default, Qt4 to be rebuilt. */ #ifndef Q_OS_SOLARIS /* Cause Qt4 has the conflict with fontconfig application as a result * sometimes substituting some fonts with non scaleable-anti-aliased * bitmap font we are reseting substitutes for the current application * font family if it is non scaleable-anti-aliased. */ QFontDatabase fontDataBase; QString currentFamily (QApplication::font().family()); bool isCurrentScaleable = fontDataBase.isScalable (currentFamily); /* LogFlowFunc (("Font: Current family is '%s'. It is %s.\n", currentFamily.toLatin1().constData(), isCurrentScaleable ? "scalable" : "not scalable")); QStringList subFamilies (QFont::substitutes (currentFamily)); foreach (QString sub, subFamilies) { bool isSubScalable = fontDataBase.isScalable (sub); LogFlowFunc (("Font: Substitute family is '%s'. It is %s.\n", sub.toLatin1().constData(), isSubScalable ? "scalable" : "not scalable")); } */ QString subFamily (QFont::substitute (currentFamily)); bool isSubScaleable = fontDataBase.isScalable (subFamily); if (isCurrentScaleable && !isSubScaleable) QFont::removeSubstitution (currentFamily); #endif /* Q_OS_SOLARIS */ #endif #ifdef Q_WS_WIN /* Drag in the sound drivers and DLLs early to get rid of the delay taking * place when the main menu bar (or any action from that menu bar) is * activated for the first time. This delay is especially annoying if it * happens when the VM is executing in real mode (which gives 100% CPU * load and slows down the load process that happens on the main GUI * thread to several seconds). */ PlaySound (NULL, NULL, 0); #endif #ifdef Q_WS_MAC ::darwinDisableIconsInMenus(); #endif /* Q_WS_MAC */ #ifdef Q_WS_X11 /* version check (major.minor are sensitive, fix number is ignored) */ if (VBoxGlobal::qtRTVersion() < (VBoxGlobal::qtCTVersion() & 0xFFFF00)) { QString msg = QApplication::tr ("Executable <b>%1</b> requires Qt %2.x, found Qt %3.") .arg (qAppName()) .arg (VBoxGlobal::qtCTVersionString().section ('.', 0, 1)) .arg (VBoxGlobal::qtRTVersionString()); QMessageBox::critical ( 0, QApplication::tr ("Incompatible Qt Library Error"), msg, QMessageBox::Abort, 0); qFatal ("%s", msg.toAscii().constData()); } #endif /* load a translation based on the current locale */ VBoxGlobal::loadLanguage(); do { if (!vboxGlobal().isValid()) break; if (vboxGlobal().processArgs()) return 0; msgCenter().checkForMountedWrongUSB(); VBoxGlobalSettings settings = vboxGlobal().settings(); /* Process known keys */ bool noSelector = settings.isFeatureActive ("noSelector"); if (vboxGlobal().isVMConsoleProcess()) { #ifdef VBOX_GUI_WITH_SYSTRAY if (vboxGlobal().trayIconInstall()) { /* Nothing to do here yet. */ } #endif if (vboxGlobal().startMachine (vboxGlobal().managedVMUuid())) { vboxGlobal().setMainWindow (vboxGlobal().vmWindow()); rc = a.exec(); } } else if (noSelector) { msgCenter().cannotRunInSelectorMode(); } else { #ifdef VBOX_BLEEDING_EDGE msgCenter().showBEBWarning(); #else # ifndef DEBUG /* Check for BETA version */ QString vboxVersion (vboxGlobal().virtualBox().GetVersion()); if (vboxVersion.contains ("BETA")) { /* Allow to prevent this message */ QString str = vboxGlobal().virtualBox(). GetExtraData(GUI_PreventBetaWarning); if (str != vboxVersion) msgCenter().showBETAWarning(); } # endif #endif vboxGlobal().setMainWindow (&vboxGlobal().selectorWnd()); #ifdef VBOX_GUI_WITH_SYSTRAY if (vboxGlobal().trayIconInstall()) { /* Nothing to do here yet. */ } if (false == vboxGlobal().isTrayMenu()) { #endif vboxGlobal().selectorWnd().show(); #ifdef VBOX_WITH_REGISTRATION_REQUEST vboxGlobal().showRegistrationDialog (false /* aForce */); #endif #ifdef VBOX_GUI_WITH_SYSTRAY } do { #endif rc = a.exec(); #ifdef VBOX_GUI_WITH_SYSTRAY } while (vboxGlobal().isTrayMenu()); #endif } } while (0); } LogFlowFunc (("rc=%d\n", rc)); LogFlowFuncLeave(); return rc; }
/** * Special entrypoint used by the hardening code when something goes south. * * Display an error dialog to the user. * * @param pszWhere Indicates where the error occured. * @param enmWhat Indicates what init operation was going on at the time. * @param rc The VBox status code corresponding to the error. * @param pszMsgFmt The message format string. * @param va Format arguments. */ extern "C" DECLEXPORT(void) TrustedError(const char *pszWhere, SUPINITOP enmWhat, int rc, const char *pszMsgFmt, va_list va) { # ifdef RT_OS_DARWIN ShutUpAppKit(); # endif /* RT_OS_DARWIN */ char szMsgBuf[_16K]; /* * We have to create QApplication anyway just to show the only one error-message. * This is a bit hackish as we don't have the argument vector handy. */ int argc = 0; char *argv[2] = { NULL, NULL }; QApplication a(argc, &argv[0]); /* * The details starts off a properly formatted rc and where/what, we use * the szMsgBuf for this, thus this have to come before the actual message * formatting. */ RTStrPrintf(szMsgBuf, sizeof(szMsgBuf), "<!--EOM-->" "where: %s\n" "what: %d\n" "%Rra\n", pszWhere, enmWhat, rc); QString strDetails = szMsgBuf; /* * Format the error message. Take whatever comes after a double new line as * something better off in the details section. */ RTStrPrintfV(szMsgBuf, sizeof(szMsgBuf), pszMsgFmt, va); char *pszDetails = strstr(szMsgBuf, "\n\n"); if (pszDetails) { while (RT_C_IS_SPACE(*pszDetails)) *pszDetails++ = '\0'; if (*pszDetails) { strDetails += "\n"; strDetails += pszDetails; } RTStrStripR(szMsgBuf); } QString strText = QApplication::tr("<html><b>%1 (rc=%2)</b><br/><br/>").arg(szMsgBuf).arg(rc); strText.replace(QString("\n"), QString("<br>")); /* * Append possibly helpful hints to the error message. */ switch (enmWhat) { case kSupInitOp_Driver: # ifdef RT_OS_LINUX strText += g_QStrHintLinuxNoDriver; # else /* RT_OS_LINUX */ strText += g_QStrHintOtherNoDriver; # endif /* !RT_OS_LINUX */ break; # ifdef RT_OS_LINUX case kSupInitOp_IPRT: case kSupInitOp_Misc: if (rc == VERR_NO_MEMORY) strText += g_QStrHintLinuxNoMemory; else # endif /* RT_OS_LINUX */ if (rc == VERR_VM_DRIVER_VERSION_MISMATCH) # ifdef RT_OS_LINUX strText += g_QStrHintLinuxWrongDriverVersion; # else /* RT_OS_LINUX */ strText += g_QStrHintOtherWrongDriverVersion; # endif /* !RT_OS_LINUX */ else strText += g_QStrHintReinstall; break; case kSupInitOp_Integrity: case kSupInitOp_RootCheck: strText += g_QStrHintReinstall; break; default: /* no hints here */ break; }