Index: trunk/src/VBox/Frontends/VirtualBox/include/COMDefs.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/include/COMDefs.h	(revision 2670)
+++ trunk/src/VBox/Frontends/VirtualBox/include/COMDefs.h	(revision 2671)
@@ -32,4 +32,6 @@
 #include <quuid.h>
 
+#include <iprt/memory> // for auto_copy_ptr
+
 /*
  * common COM / XPCOM includes and defines
@@ -171,4 +173,6 @@
     QString text() const { return mText; }
 
+    const COMErrorInfo *next() const { return mNext.get(); }
+
     QString interfaceName() const { return mInterfaceName; }
     QUuid calleeIID() const { return mCalleeIID; }
@@ -190,4 +194,6 @@
     QString mComponent;
     QString mText;
+
+    cppx::auto_copy_ptr <COMErrorInfo> mNext;
 
     QString mInterfaceName;
Index: trunk/src/VBox/Frontends/VirtualBox/include/VBoxProblemReporter.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/include/VBoxProblemReporter.h	(revision 2670)
+++ trunk/src/VBox/Frontends/VirtualBox/include/VBoxProblemReporter.h	(revision 2671)
@@ -216,16 +216,22 @@
                            const QString &errorMsg);
 
-    static QString formatErrorInfo (const COMErrorInfo &info,
-                                    HRESULT wrapperRC = S_OK);
-    static QString formatErrorInfo (const CVirtualBoxErrorInfo &info) {
-        return formatErrorInfo (COMErrorInfo (info));
-    }
-    static QString formatErrorInfo (const COMBase &wrapper) {
-        Assert (FAILED (wrapper.lastRC()));
-        return formatErrorInfo (wrapper.errorInfo(), wrapper.lastRC());
-    }
-    static QString formatErrorInfo (const COMResult &rc) {
-        Assert (FAILED (rc.rc()));
-        return formatErrorInfo (rc.errorInfo(), rc.rc());
+    static QString formatErrorInfo (const COMErrorInfo &aInfo,
+                                    HRESULT aWrapperRC = S_OK);
+
+    static QString formatErrorInfo (const CVirtualBoxErrorInfo &aInfo)
+    {
+        return formatErrorInfo (COMErrorInfo (aInfo));
+    }
+
+    static QString formatErrorInfo (const COMBase &aWrapper)
+    {
+        Assert (FAILED (aWrapper.lastRC()));
+        return formatErrorInfo (aWrapper.errorInfo(), aWrapper.lastRC());
+    }
+
+    static QString formatErrorInfo (const COMResult &aRC)
+    {
+        Assert (FAILED (aRC.rc()));
+        return formatErrorInfo (aRC.errorInfo(), aRC.rc());
     }
 
@@ -239,4 +245,7 @@
 
     friend VBoxProblemReporter &vboxProblem();
+
+    static QString doFormatErrorInfo (const COMErrorInfo &aInfo,
+                                      HRESULT aWrapperRC = S_OK);
 };
 
Index: trunk/src/VBox/Frontends/VirtualBox/src/COMDefs.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/COMDefs.cpp	(revision 2670)
+++ trunk/src/VBox/Frontends/VirtualBox/src/COMDefs.cpp	(revision 2671)
@@ -320,4 +320,15 @@
     gotAll &= info.isOk();
 
+    CVirtualBoxErrorInfo next = info.GetNext();
+    if (info.isOk() && !next.isNull())
+    {
+        mNext.reset (new COMErrorInfo (next));
+        Assert (mNext.get());
+    }
+    else
+        mNext.reset();
+    gotSomething |= info.isOk();
+    gotAll &= info.isOk();
+
     mIsBasicAvailable = gotSomething;
     mIsFullAvailable = gotAll;
Index: trunk/src/VBox/Frontends/VirtualBox/src/VBoxProblemReporter.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/VBoxProblemReporter.cpp	(revision 2670)
+++ trunk/src/VBox/Frontends/VirtualBox/src/VBoxProblemReporter.cpp	(revision 2671)
@@ -1503,15 +1503,23 @@
 
 /* static */
-QString VBoxProblemReporter::formatErrorInfo (const COMErrorInfo &info,
-                                              HRESULT wrapperRC)
-{
-    QString formatted = "<qt>";
-
-    if (info.text())
+QString VBoxProblemReporter::formatErrorInfo (const COMErrorInfo &aInfo,
+                                              HRESULT aWrapperRC /* = S_OK */)
+{
+    QString formatted = doFormatErrorInfo (aInfo, aWrapperRC);
+    return QString ("<qt>%1</qt>").arg (formatted);
+}
+
+/* static */
+QString VBoxProblemReporter::doFormatErrorInfo (const COMErrorInfo &aInfo,
+                                                HRESULT aWrapperRC /* = S_OK */)
+{
+    QString formatted;
+
+    if (aInfo.text())
         formatted += QString ("<table bgcolor=#FFFFFF border=0 cellspacing=0 "
                               "cellpadding=0 width=100%>"
                               "<tr><td><p>%1.</p></td></tr>"
                               "</table><p></p>")
-                              .arg (VBoxGlobal::highlight (info.text()));
+                              .arg (VBoxGlobal::highlight (aInfo.text()));
 
     formatted += "<table bgcolor=#EEEEEE border=0 cellspacing=0 "
@@ -1520,14 +1528,14 @@
     bool haveResultCode = false;
 
-    if (info.isBasicAvailable())
+    if (aInfo.isBasicAvailable())
     {
 #if defined (Q_WS_WIN)
-        haveResultCode = info.isFullAvailable();
+        haveResultCode = aInfo.isFullAvailable();
         bool haveComponent = true;
         bool haveInterfaceID = true;
 #else // !Q_WS_WIN
         haveResultCode = true;
-        bool haveComponent = info.isFullAvailable();
-        bool haveInterfaceID = info.isFullAvailable();
+        bool haveComponent = aInfo.isFullAvailable();
+        bool haveInterfaceID = aInfo.isFullAvailable();
 #endif
 
@@ -1537,16 +1545,16 @@
             /* format the error code, masking off the top 16 bits */
             PCRTWINERRMSG msg;
-            msg = RTErrWinGet(info.resultCode());
+            msg = RTErrWinGet(aInfo.resultCode());
             /* try again with masked off top 16bit if not found */
             if (!msg->iCode)
-                msg = RTErrWinGet(info.resultCode() & 0xFFFF);
+                msg = RTErrWinGet(aInfo.resultCode() & 0xFFFF);
             formatted += QString ("<tr><td>%1</td><td><tt>%2 (0x%3)</tt></td></tr>")
                 .arg (tr ("Result&nbsp;Code: ", "error info"))
                 .arg (msg->pszDefine)
-                .arg (uint (info.resultCode()), 8, 16);
+                .arg (uint (aInfo.resultCode()), 8, 16);
 #else
             formatted += QString ("<tr><td>%1</td><td><tt>0x%2</tt></td></tr>")
                 .arg (tr ("Result&nbsp;Code: ", "error info"))
-                .arg (uint (info.resultCode()), 8, 16);
+                .arg (uint (aInfo.resultCode()), 8, 16);
 #endif
         }
@@ -1554,20 +1562,20 @@
         if (haveComponent)
             formatted += QString ("<tr><td>%1</td><td>%2</td></tr>")
-                .arg (tr ("Component: ", "error info"), info.component());
+                .arg (tr ("Component: ", "error info"), aInfo.component());
 
         if (haveInterfaceID)
         {
-            QString s = info.interfaceID();
-            if (info.interfaceName())
-                s = info.interfaceName() + ' ' + s;
+            QString s = aInfo.interfaceID();
+            if (aInfo.interfaceName())
+                s = aInfo.interfaceName() + ' ' + s;
             formatted += QString ("<tr><td>%1</td><td>%2</td></tr>")
                 .arg (tr ("Interface: ", "error info"), s);
         }
 
-        if (!info.calleeIID().isNull() && info.calleeIID() != info.interfaceID())
+        if (!aInfo.calleeIID().isNull() && aInfo.calleeIID() != aInfo.interfaceID())
         {
-            QString s = info.calleeIID();
-            if (info.calleeName())
-                s = info.calleeName() + ' ' + s;
+            QString s = aInfo.calleeIID();
+            if (aInfo.calleeName())
+                s = aInfo.calleeName() + ' ' + s;
             formatted += QString ("<tr><td>%1</td><td>%2</td></tr>")
                 .arg (tr ("Callee: ", "error info"), s);
@@ -1575,25 +1583,29 @@
     }
 
-    if (FAILED (wrapperRC) &&
-        (!haveResultCode || wrapperRC != info.resultCode()))
+    if (FAILED (aWrapperRC) &&
+        (!haveResultCode || aWrapperRC != aInfo.resultCode()))
     {
 #if defined (Q_WS_WIN)
         /* format the error code */
         PCRTWINERRMSG msg;
-        msg = RTErrWinGet(wrapperRC);
+        msg = RTErrWinGet(aWrapperRC);
         /* try again with masked off top 16bit if not found */
         if (!msg->iCode)
-            msg = RTErrWinGet(wrapperRC & 0xFFFF);
+            msg = RTErrWinGet(aWrapperRC & 0xFFFF);
         formatted += QString ("<tr><td>%1</td><td><tt>%2 (0x%3)</tt></td></tr>")
             .arg (tr ("Callee&nbsp;RC: ", "error info"))
             .arg (msg->pszDefine)
-            .arg (uint (wrapperRC), 8, 16);
+            .arg (uint (aWrapperRC), 8, 16);
 #else
         formatted += QString ("<tr><td>%1</td><td><tt>0x%2</tt></td></tr>")
             .arg (tr ("Callee&nbsp;RC: ", "error info"))
-            .arg (uint (wrapperRC), 8, 16);
+            .arg (uint (aWrapperRC), 8, 16);
 #endif
     }
-    formatted += "</table></qt>";
+    formatted += "</table>";
+
+    if (aInfo.next())
+        formatted = doFormatErrorInfo (*aInfo.next()) +  "<p></p>" +
+                    formatted;
 
     return formatted;
