Index: /trunk/include/iprt/mangling.h
===================================================================
--- /trunk/include/iprt/mangling.h	(revision 37950)
+++ /trunk/include/iprt/mangling.h	(revision 37951)
@@ -829,4 +829,5 @@
 # define RTMsgInfoV                                     RT_MANGLER(RTMsgInfoV)
 # define RTMsgInitFailure                               RT_MANGLER(RTMsgInitFailure)
+# define RTMsgSetProgName                               RT_MANGLER(RTMsgSetProgName)
 # define RTMsgWarning                                   RT_MANGLER(RTMsgWarning)
 # define RTMsgWarningV                                  RT_MANGLER(RTMsgWarningV)
Index: /trunk/include/iprt/message.h
===================================================================
--- /trunk/include/iprt/message.h	(revision 37950)
+++ /trunk/include/iprt/message.h	(revision 37951)
@@ -37,4 +37,13 @@
  * @{
  */
+
+/**
+ * Sets the program name to use.
+ *
+ * @returns IPRT status code.
+ * @param   pszFormat       The program name format string.
+ * @param   ...             Format arguments.
+ */
+RTDECL(int)  RTMsgSetProgName(const char *pszFormat, ...);
 
 /**
Index: /trunk/src/VBox/Runtime/common/misc/message.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/misc/message.cpp	(revision 37950)
+++ /trunk/src/VBox/Runtime/common/misc/message.cpp	(revision 37951)
@@ -37,4 +37,29 @@
 
 
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+/** The program name we're using. */
+static const char * volatile g_pszProgName = NULL;
+/** Custom program name set via RTMsgSetProgName. */
+static char g_szProgName[128];
+
+
+RTDECL(int)  RTMsgSetProgName(const char *pszFormat, ...)
+{
+    g_pszProgName = &g_szrtProcExePath[g_offrtProcName];
+
+    va_list va;
+    va_start(va, pszFormat);
+    RTStrPrintfV(g_szProgName, sizeof(g_szProgName) - 1, pszFormat, va);
+    va_end(va);
+
+    g_pszProgName = g_szProgName;
+
+    return VINF_SUCCESS;
+}
+RT_EXPORT_SYMBOL(RTMsgSetProgName);
+
+
 static int rtMsgWorker(PRTSTREAM pDst, const char *pszPrefix, const char *pszFormat, va_list va)
 {
@@ -44,4 +69,8 @@
     else
     {
+        const char *pszProgName = g_pszProgName;
+        if (!pszProgName)
+            g_pszProgName = pszProgName = &g_szrtProcExePath[g_offrtProcName];
+
         char *pszMsg;
         ssize_t cch = RTStrAPrintfV(&pszMsg, pszFormat, va);
@@ -55,5 +84,5 @@
                 if (!pszEnd)
                 {
-                    RTStrmPrintf(pDst, "%s: %s%s\n", &g_szrtProcExePath[g_offrtProcName], pszPrefix, psz);
+                    RTStrmPrintf(pDst, "%s: %s%s\n", pszProgName, pszPrefix, psz);
                     break;
                 }
@@ -63,5 +92,5 @@
                 {
                     *pszEnd = '\0';
-                    RTStrmPrintf(pDst, "%s: %s%s\n", &g_szrtProcExePath[g_offrtProcName], pszPrefix, psz);
+                    RTStrmPrintf(pDst, "%s: %s%s\n", pszProgName, pszPrefix, psz);
                 }
                 psz = pszEnd + 1;
@@ -72,5 +101,5 @@
         {
             /* Simple fallback for handling out-of-memory conditions. */
-            RTStrmPrintf(pDst, "%s: %s", &g_szrtProcExePath[g_offrtProcName], pszPrefix);
+            RTStrmPrintf(pDst, "%s: %s", pszProgName, pszPrefix);
             RTStrmPrintfV(pDst, pszFormat, va);
             if (!strchr(pszFormat, '\n'))
