Index: trunk/src/VBox/Main/Makefile.kmk
===================================================================
--- trunk/src/VBox/Main/Makefile.kmk	(revision 37663)
+++ trunk/src/VBox/Main/Makefile.kmk	(revision 37666)
@@ -301,4 +301,5 @@
 	src-server/HostNetworkInterfaceImpl.cpp \
 	src-server/HostPower.cpp \
+	src-server/Logging.cpp \
 	src-server/MachineImpl.cpp \
 	src-server/MachineImplCloneVM.cpp \
@@ -353,4 +354,9 @@
 VBoxSVC_SOURCES.freebsd = \
 	src-server/freebsd/HostHardwareFreeBSD.cpp
+
+src-server/Logging.cpp_DEFS = \
+	VBOX_BUILD_TARGET=\"$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)\" \
+	$(if $(VBOX_BLEEDING_EDGE),VBOX_BLEEDING_EDGE=\"$(VBOX_BLEEDING_EDGE)\",)
+
 
 ifdef VBOX_WITH_USB
Index: trunk/src/VBox/Main/include/Logging.h
===================================================================
--- trunk/src/VBox/Main/include/Logging.h	(revision 37663)
+++ trunk/src/VBox/Main/include/Logging.h	(revision 37666)
@@ -7,5 +7,5 @@
 
 /*
- * Copyright (C) 2006-2010 Oracle Corporation
+ * Copyright (C) 2006-2011 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -50,43 +50,7 @@
 
 #include <VBox/log.h>
-#include <iprt/assert.h>
 
-/** @def MyLogIt
- * Copy of LogIt that works even when logging is completely disabled (e.g. in
- * release builds) and doesn't interfere with the default release logger
- * instance (which is already in use by the VM process).
- *
- * @warning Logging using MyLog* is intended only as a temporary mean to debug
- *          release builds (e.g. in case if the error is not reproducible with
- *          the debug builds)! Any MyLog* usage must be removed from the sources
- *          after the error has been fixed.
- */
-#if defined(RT_ARCH_AMD64) || defined(LOG_USE_C99)
-# define _MyLogRemoveParentheseis(...)               __VA_ARGS__
-# define _MyLogIt(pvInst, fFlags, iGroup, ...)       RTLogLoggerEx((PRTLOGGER)pvInst, fFlags, iGroup, __VA_ARGS__)
-# define MyLogIt(pvInst, fFlags, iGroup, fmtargs)    _MyLogIt(pvInst, fFlags, iGroup, _MyLogRemoveParentheseis fmtargs)
-#else
-# define MyLogIt(pvInst, fFlags, iGroup, fmtargs) \
-    do \
-    { \
-        register PRTLOGGER LogIt_pLogger = (PRTLOGGER)(pvInst) ? (PRTLOGGER)(pvInst) : RTLogDefaultInstance(); \
-        if (LogIt_pLogger) \
-        { \
-            register unsigned LogIt_fFlags = LogIt_pLogger->afGroups[(unsigned)(iGroup) < LogIt_pLogger->cGroups ? (unsigned)(iGroup) : 0]; \
-            if ((LogIt_fFlags & ((fFlags) | RTLOGGRPFLAGS_ENABLED)) == ((fFlags) | RTLOGGRPFLAGS_ENABLED)) \
-                LogIt_pLogger->pfnLogger fmtargs; \
-        } \
-    } while (0)
-#endif
-
-/** @def MyLog
- * Equivalent to LogFlow but uses MyLogIt instead of LogIt.
- *
- * @warning Logging using MyLog* is intended only as a temporary mean to debug
- *          release builds (e.g. in case if the error is not reproducible with
- *          the debug builds)! Any MyLog* usage must be removed from the sources
- *          after the error has been fixed.
- */
-#define MyLog(a)            MyLogIt(LOG_INSTANCE, RTLOGGRPFLAGS_FLOW, LOG_GROUP, a)
+int VBoxSVCLogRelCreate(const char *pszLogFile, uint32_t cHistory,
+                        uint32_t uHistoryFileTime, uint64_t uHistoryFileSize);
 
 #endif // ____H_LOGGING
Index: trunk/src/VBox/Main/src-server/Logging.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/Logging.cpp	(revision 37666)
+++ trunk/src/VBox/Main/src-server/Logging.cpp	(revision 37666)
@@ -0,0 +1,133 @@
+/* $Id$ */
+
+/** @file
+ *
+ * Logging in VBoxSVC.
+ */
+
+/*
+ * Copyright (C) 2011 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * 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.
+ */
+
+#include "Logging.h"
+
+#include <package-generated.h>
+
+#include <iprt/buildconfig.h>
+#include <iprt/err.h>
+#include <iprt/message.h>
+#include <iprt/path.h>
+#include <iprt/system.h>
+#include <iprt/process.h>
+#include <VBox/version.h>
+#include <VBox/log.h>
+
+
+static void vboxsvcHeaderFooter(PRTLOGGER pLoggerRelease, RTLOGPHASE enmPhase, PFNRTLOGPHASEMSG pfnLog)
+{
+    /* some introductory information */
+    static RTTIMESPEC s_TimeSpec;
+    char szTmp[256];
+    if (enmPhase == RTLOGPHASE_BEGIN)
+        RTTimeNow(&s_TimeSpec);
+    RTTimeSpecToString(&s_TimeSpec, szTmp, sizeof(szTmp));
+
+    switch (enmPhase)
+    {
+        case RTLOGPHASE_BEGIN:
+        {
+            pfnLog(pLoggerRelease,
+                   "VirtualBox (XP)COM Server %s r%u %s (%s %s) release log\n"
+#ifdef VBOX_BLEEDING_EDGE
+                   "EXPERIMENTAL build " VBOX_BLEEDING_EDGE "\n"
+#endif
+                   "Log opened %s\n",
+                   VBOX_VERSION_STRING, RTBldCfgRevision(), VBOX_BUILD_TARGET,
+                   __DATE__, __TIME__, szTmp);
+
+            int vrc = RTSystemQueryOSInfo(RTSYSOSINFO_PRODUCT, szTmp, sizeof(szTmp));
+            if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW)
+                pfnLog(pLoggerRelease, "OS Product: %s\n", szTmp);
+            vrc = RTSystemQueryOSInfo(RTSYSOSINFO_RELEASE, szTmp, sizeof(szTmp));
+            if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW)
+                pfnLog(pLoggerRelease, "OS Release: %s\n", szTmp);
+            vrc = RTSystemQueryOSInfo(RTSYSOSINFO_VERSION, szTmp, sizeof(szTmp));
+            if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW)
+                pfnLog(pLoggerRelease, "OS Version: %s\n", szTmp);
+            if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW)
+                pfnLog(pLoggerRelease, "OS Service Pack: %s\n", szTmp);
+
+            /* the package type is interesting for Linux distributions */
+            char szExecName[RTPATH_MAX];
+            char *pszExecName = RTProcGetExecutablePath(szExecName, sizeof(szExecName));
+            pfnLog(pLoggerRelease,
+                   "Executable: %s\n"
+                   "Process ID: %u\n"
+                   "Package type: %s"
+#ifdef VBOX_OSE
+                   " (OSE)"
+#endif
+                   "\n",
+                   pszExecName ? pszExecName : "unknown",
+                   RTProcSelf(),
+                   VBOX_PACKAGE_STRING);
+            break;
+        }
+
+        case RTLOGPHASE_PREROTATE:
+            pfnLog(pLoggerRelease, "Log rotated - Log started %s\n", szTmp);
+            break;
+
+        case RTLOGPHASE_POSTROTATE:
+            pfnLog(pLoggerRelease, "Log continuation - Log started %s\n", szTmp);
+            break;
+
+        case RTLOGPHASE_END:
+            pfnLog(pLoggerRelease, "End of log file - Log started %s\n", szTmp);
+            break;
+
+        default:
+            /* nothing */;
+    }
+}
+
+int VBoxSVCLogRelCreate(const char *pszLogFile, uint32_t cHistory,
+                        uint32_t uHistoryFileTime, uint64_t uHistoryFileSize)
+{
+    /* create release logger */
+    PRTLOGGER pLoggerReleaseFile;
+    static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES;
+    RTUINT fFlags = RTLOGFLAGS_PREFIX_THREAD | RTLOGFLAGS_PREFIX_TIME_PROG;
+#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
+    fFlags |= RTLOGFLAGS_USECRLF;
+#endif
+    char szError[RTPATH_MAX + 128] = "";
+    int vrc = RTLogCreateEx(&pLoggerReleaseFile, fFlags, "all",
+                            "VBOXSVC_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups, 0 /* fDestFlags */,
+                            vboxsvcHeaderFooter, cHistory, uHistoryFileSize, uHistoryFileTime,
+                            szError, sizeof(szError), pszLogFile);
+    if (RT_SUCCESS(vrc))
+    {
+        /* register this logger as the release logger */
+        RTLogRelSetDefaultInstance(pLoggerReleaseFile);
+
+        /* Explicitly flush the log in case of VBOXWEBSRV_RELEASE_LOG=buffered. */
+        RTLogFlush(pLoggerReleaseFile);
+    }
+    else
+    {
+        /* print a message, but do not fail */
+        RTMsgError("failed to open release log (%s, %Rrc)", szError, vrc);
+    }
+    return vrc;
+}
+
+/* vi: set tabstop=4 shiftwidth=4 expandtab: */
Index: trunk/src/VBox/Main/src-server/win/svcmain.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/win/svcmain.cpp	(revision 37663)
+++ trunk/src/VBox/Main/src-server/win/svcmain.cpp	(revision 37666)
@@ -185,4 +185,142 @@
     RTR3Init();
 
+    /* Note that all options are given lowercase/camel case/uppercase to
+     * approximate case insensitive matching, which RTGetOpt doesn't offer. */
+    static const RTGETOPTDEF s_aOptions[] =
+    {
+        { "--embedding",    'e',    RTGETOPT_REQ_NOTHING | RTGETOPT_FLAG_ICASE },
+        { "-embedding",     'e',    RTGETOPT_REQ_NOTHING | RTGETOPT_FLAG_ICASE },
+        { "/embedding",     'e',    RTGETOPT_REQ_NOTHING | RTGETOPT_FLAG_ICASE },
+        { "--unregserver",  'u',    RTGETOPT_REQ_NOTHING | RTGETOPT_FLAG_ICASE },
+        { "-unregserver",   'u',    RTGETOPT_REQ_NOTHING | RTGETOPT_FLAG_ICASE },
+        { "/unregserver",   'u',    RTGETOPT_REQ_NOTHING | RTGETOPT_FLAG_ICASE },
+        { "--regserver",    'r',    RTGETOPT_REQ_NOTHING | RTGETOPT_FLAG_ICASE },
+        { "-regserver",     'r',    RTGETOPT_REQ_NOTHING | RTGETOPT_FLAG_ICASE },
+        { "/regserver",     'r',    RTGETOPT_REQ_NOTHING | RTGETOPT_FLAG_ICASE },
+        { "--reregserver",  'f',    RTGETOPT_REQ_NOTHING | RTGETOPT_FLAG_ICASE },
+        { "-reregserver",   'f',    RTGETOPT_REQ_NOTHING | RTGETOPT_FLAG_ICASE },
+        { "/reregserver",   'f',    RTGETOPT_REQ_NOTHING | RTGETOPT_FLAG_ICASE },
+        { "--helper",       'H',    RTGETOPT_REQ_STRING | RTGETOPT_FLAG_ICASE },
+        { "-helper",        'H',    RTGETOPT_REQ_STRING | RTGETOPT_FLAG_ICASE },
+        { "/helper",        'H',    RTGETOPT_REQ_STRING | RTGETOPT_FLAG_ICASE },
+        { "--logfile",      'F',    RTGETOPT_REQ_STRING | RTGETOPT_FLAG_ICASE },
+        { "-logfile",       'F',    RTGETOPT_REQ_STRING | RTGETOPT_FLAG_ICASE },
+        { "/logfile",       'F',    RTGETOPT_REQ_STRING | RTGETOPT_FLAG_ICASE },
+        { "--logrotate",    'R',    RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_ICASE },
+        { "-logrotate",     'R',    RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_ICASE },
+        { "/logrotate",     'R',    RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_ICASE },
+        { "--logsize",      'S',    RTGETOPT_REQ_UINT64 | RTGETOPT_FLAG_ICASE },
+        { "-logsize",       'S',    RTGETOPT_REQ_UINT64 | RTGETOPT_FLAG_ICASE },
+        { "/logsize",       'S',    RTGETOPT_REQ_UINT64 | RTGETOPT_FLAG_ICASE },
+        { "--loginterval",  'I',    RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_ICASE },
+        { "-loginterval",   'I',    RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_ICASE },
+        { "/loginterval",   'I',    RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_ICASE },
+    };
+
+    bool            fRun = true;
+    bool            fRegister = false;
+    bool            fUnregister = false;
+    const char      *pszPipeName = NULL;
+    const char      *pszLogFile = NULL;
+    uint32_t        cHistory = 10;                  // enable log rotation, 10 files
+    uint32_t        uHistoryFileTime = RT_SEC_1DAY; // max 1 day per file
+    uint64_t        uHistoryFileSize = 100 * _1M;   // max 100MB per file
+
+    RTGETOPTSTATE   GetOptState;
+    int vrc = RTGetOptInit(&GetOptState, argc, argv, &s_aOptions[0], RT_ELEMENTS(s_aOptions), 1, 0 /*fFlags*/);
+    AssertRC(vrc);
+
+    RTGETOPTUNION   ValueUnion;
+    while ((vrc = RTGetOpt(&GetOptState, &ValueUnion)))
+    {
+        switch (vrc)
+        {
+            case 'e':
+                /* already handled above */
+                break;
+
+            case 'u':
+                fUnregister = true;
+                fRun = false;
+                break;
+
+            case 'r':
+                fRegister = true;
+                break;
+
+            case 'f':
+                fUnregister = true;
+                fRegister = true;
+                fRun = false;
+                break;
+
+            case 'H':
+                pszPipeName = ValueUnion.psz;
+                if (!pszPipeName)
+                    pszPipeName = "";
+                fRun = false;
+                break;
+
+            case 'F':
+                pszLogFile = ValueUnion.psz;
+                break;
+
+            case 'R':
+                cHistory = ValueUnion.u32;
+                break;
+
+            case 'S':
+                uHistoryFileSize = ValueUnion.u64;
+                break;
+
+            case 'I':
+                uHistoryFileTime = ValueUnion.u32;
+                break;
+
+            case 'h':
+                TCHAR txt[]= L"Options:\n\n"
+                             L"/RegServer:\tregister COM out-of-proc server\n"
+                             L"/UnregServer:\tunregister COM out-of-proc server\n"
+                             L"/ReregServer:\tunregister and register COM server\n"
+                             L"no options:\trun the server";
+                TCHAR title[]=_T("Usage");
+                fRun = false;
+                MessageBox(NULL, txt, title, MB_OK);
+                break;
+
+            case 'V':
+                char *psz = NULL;
+                RTStrAPrintf(&psz, "%sr%s\n", RTBldCfgVersion(), RTBldCfgRevisionStr());
+                TCHAR *txt;
+                RTStrToUni(psz, &txt);
+                TCHAR title[]=_T("Version");
+                fRun = false;
+                MessageBox(NULL, txt, title, MB_OK);
+                RTStrFree(psz);
+                RTUniFree(txt);
+                break;
+
+            default:
+                /** @todo this assumes that stderr is visible, which is not
+                 * true for standard Windows applications. */
+                return RTGetOptPrintError(vrc, &ValueUnion);
+        }
+    }
+
+    if (!pszLogFile)
+    {
+        char szLogFile[RTPATH_MAX];
+        vrc = com::GetVBoxUserHomeDirectory(szLogFile, sizeof(szLogFile));
+        if (RT_SUCCESS(vrc))
+            vrc = RTPathAppend(szLogFile, sizeof(szLogFile), "VBoxSVC.log");
+        if (RT_SUCCESS(vrc))
+            pszLogFile = RTStrDup(szLogFile);
+    }
+    /* Only create the log file when running VBoxSVC normally, but not when
+     * registering/unregistering or calling the helper functionality. */
+    if (fRun)
+        VBoxSVCLogRelCreate(pszLogFile, cHistory, uHistoryFileTime, uHistoryFileSize);
+
+    int nRet = 0;
     HRESULT hRes = com::Initialize();
 
@@ -191,68 +329,21 @@
     _Module.dwThreadID = GetCurrentThreadId();
 
-    int nRet = 0;
-    BOOL bRun = TRUE;
-    lpszToken = FindOneOf(lpCmdLine, szTokens);
-    while (lpszToken != NULL)
-    {
-        if (WordCmpI(lpszToken, _T("UnregServer")) == 0)
+    if (!fRun)
+    {
+        if (fUnregister)
         {
             _Module.UpdateRegistryFromResource(IDR_VIRTUALBOX, FALSE);
             nRet = _Module.UnregisterServer(TRUE);
-            bRun = FALSE;
-            break;
-        }
-        else if (WordCmpI(lpszToken, _T("RegServer")) == 0)
+        }
+        if (fRegister)
         {
             _Module.UpdateRegistryFromResource(IDR_VIRTUALBOX, TRUE);
             nRet = _Module.RegisterServer(TRUE);
-            bRun = FALSE;
-            break;
-        }
-        else if (WordCmpI(lpszToken, _T("ReregServer")) == 0)
-        {
-            _Module.UpdateRegistryFromResource(IDR_VIRTUALBOX, FALSE);
-            nRet = _Module.UnregisterServer(TRUE);
-            _Module.UpdateRegistryFromResource(IDR_VIRTUALBOX, TRUE);
-            nRet = _Module.RegisterServer(TRUE);
-            bRun = FALSE;
-            break;
-        }
-        else if (   (WordCmpI(lpszToken, _T("h")) == 0)
-                 || (WordCmpI(lpszToken, _T("?")) == 0))
-        {
-            TCHAR txt[]= L"Options:\n\n"
-                         L"/RegServer:\tregister COM out-of-proc server\n"
-                         L"/UnregServer:\tunregister COM out-of-proc server\n"
-                         L"/ReregServer:\tunregister and register COM server\n"
-                         L"no options:\trun the server";
-            TCHAR title[]=_T("Usage");
-            nRet = -1;
-            bRun = FALSE;
-            MessageBox(NULL, txt, title, MB_OK);
-            break;
-        }
-        else if (WordCmpI (lpszToken, _T("Helper")) == 0)
-        {
-            Log (("SVCMAIN: Processing Helper request (cmdline=\"%ls\")...\n",
-                  lpszToken + 6));
-
-            TCHAR szTokens[] = _T (" \t");
-
-            int vrc = VINF_SUCCESS;
-            Utf8Str pipeName;
-
-            lpszToken = FindOneOf (lpszToken, szTokens);
-            if (lpszToken)
-            {
-                while (*lpszToken != NULL &&
-                       (*lpszToken == ' ' || *lpszToken == '\t'))
-                    ++ lpszToken;
-
-                if (*lpszToken != NULL)
-                    pipeName = Utf8Str(lpszToken);
-            }
-
-            if (pipeName.isEmpty())
+        }
+        if (!pszPipeName)
+        {
+            Log(("SVCMAIN: Processing Helper request (cmdline=\"%s\")...\n", pszPipeName));
+
+            if (!*pipeName)
                 vrc = VERR_INVALID_PARAMETER;
 
@@ -267,18 +358,10 @@
             if (RT_FAILURE(vrc))
             {
-                Utf8Str err = Utf8StrFmt (
-                    "Failed to process Helper request (%Rrc).", vrc);
-                Log (("SVCMAIN: %s\n", err.c_str()));
+                Log(("SVCMAIN: Failed to process Helper request (%Rrc).", vrc));
+                nRet = 1;
             }
-
-            /* don't run the COM server */
-            bRun = FALSE;
-            break;
-        }
-
-        lpszToken = FindOneOf(lpszToken, szTokens);
-    }
-
-    if (bRun)
+        }
+    }
+    else
     {
         _Module.StartMonitor();
Index: trunk/src/VBox/Main/src-server/xpcom/server.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/xpcom/server.cpp	(revision 37663)
+++ trunk/src/VBox/Main/src-server/xpcom/server.cpp	(revision 37666)
@@ -43,4 +43,5 @@
 #include <iprt/getopt.h>
 #include <iprt/message.h>
+#include <iprt/string.h>
 #include <iprt/stream.h>
 #include <iprt/path.h>
@@ -792,10 +793,18 @@
     static const RTGETOPTDEF s_aOptions[] =
     {
-        { "--automate",       'a', RTGETOPT_REQ_NOTHING },
-        { "--auto-shutdown",  'A', RTGETOPT_REQ_NOTHING },
-        { "--daemonize",      'd', RTGETOPT_REQ_NOTHING },
-        { "--pidfile",        'p', RTGETOPT_REQ_STRING  },
+        { "--automate",         'a', RTGETOPT_REQ_NOTHING },
+        { "--auto-shutdown",    'A', RTGETOPT_REQ_NOTHING },
+        { "--daemonize",        'd', RTGETOPT_REQ_NOTHING },
+        { "--pidfile",          'p', RTGETOPT_REQ_STRING  },
+        { "--logfile",          'F', RTGETOPT_REQ_STRING },
+        { "--logrotate",        'R', RTGETOPT_REQ_UINT32 },
+        { "--logsize",          'S', RTGETOPT_REQ_UINT64 },
+        { "--loginterval",      'I', RTGETOPT_REQ_UINT32 }
     };
 
+    const char      *pszLogFile = NULL;
+    uint32_t        cHistory = 10;                  // enable log rotation, 10 files
+    uint32_t        uHistoryFileTime = RT_SEC_1DAY; // max 1 day per file
+    uint64_t        uHistoryFileSize = 100 * _1M;   // max 100MB per file
     bool            fDaemonize = false;
     PRFileDesc      *daemon_pipe_wr = nsnull;
@@ -839,4 +848,20 @@
             }
 
+            case 'F':
+                pszLogFile = ValueUnion.psz;
+                break;
+
+            case 'R':
+                cHistory = ValueUnion.u32;
+                break;
+
+            case 'S':
+                uHistoryFileSize = ValueUnion.u64;
+                break;
+
+            case 'I':
+                uHistoryFileTime = ValueUnion.u32;
+                break;
+
             case 'h':
             {
@@ -862,5 +887,16 @@
     }
 
-    nsresult    rc;
+    nsresult rc;
+
+    if (!pszLogFile)
+    {
+        char szLogFile[RTPATH_MAX];
+        vrc = com::GetVBoxUserHomeDirectory(szLogFile, sizeof(szLogFile));
+        if (RT_SUCCESS(vrc))
+            vrc = RTPathAppend(szLogFile, sizeof(szLogFile), "VBoxSVC.log");
+        if (RT_SUCCESS(vrc))
+            pszLogFile = RTStrDup(szLogFile);
+    }
+    VBoxSVCLogRelCreate(pszLogFile, cHistory, uHistoryFileTime, uHistoryFileSize);
 
     daemon_pipe_wr = PR_GetInheritedFD(VBOXSVC_STARTUP_PIPE_NAME);
Index: trunk/src/VBox/Main/src-server/xpcom/server_module.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/xpcom/server_module.cpp	(revision 37663)
+++ trunk/src/VBox/Main/src-server/xpcom/server_module.cpp	(revision 37666)
@@ -49,4 +49,5 @@
 #include <VBox/err.h>
 
+#include <iprt/assert.h>
 #include <iprt/param.h>
 #include <iprt/path.h>
