Index: /trunk/src/VBox/Runtime/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Runtime/Makefile.kmk	(revision 26625)
+++ /trunk/src/VBox/Runtime/Makefile.kmk	(revision 26626)
@@ -680,5 +680,4 @@
 	generic/RTFileMove-generic.cpp \
 	generic/RTLogWriteDebugger-generic.cpp \
-	generic/RTSystemQueryDmiString-generic.cpp \
 	generic/RTTimeLocalNow-generic.cpp \
 	generic/RTTimerCreate-generic.cpp \
@@ -714,5 +713,6 @@
 	r3/solaris/alloc-solaris.cpp \
 	r3/solaris/mp-solaris.cpp \
-	r3/solaris/rtProcInitExePath-solaris.cpp \
+	r3/solaris/RTSystemQueryDmiString-solaris.cpp \
+	r3/solaris/rtProcInitExePath-solaris.cpp
 
 ## PORTME: Porters add their selection of platform specific files for Ring-3 here.
@@ -992,5 +992,5 @@
 	rt
 VBoxRT_LIBS.solaris            = \
-	kstat
+	kstat smbios
 VBoxRT_LDFLAGS.darwin          = -framework IOKit -install_name $(VBOX_DYLD_EXECUTABLE_PATH)/VBoxRT.dylib
 ifdef VBOX_USE_VCC80
Index: /trunk/src/VBox/Runtime/r3/solaris/RTSystemQueryDmiString-solaris.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r3/solaris/RTSystemQueryDmiString-solaris.cpp	(revision 26626)
+++ /trunk/src/VBox/Runtime/r3/solaris/RTSystemQueryDmiString-solaris.cpp	(revision 26626)
@@ -0,0 +1,106 @@
+/* $Id$ */
+/** @file
+ * IPRT - RTSystemQueryDmiString, solaris ring-3.
+ */
+
+/*
+ * Copyright (C) 2010 Sun Microsystems, Inc.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
+ * Clara, CA 95054 USA or visit http://www.sun.com if you need
+ * additional information or have any questions.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <iprt/system.h>
+#include "internal/iprt.h"
+
+#include <iprt/err.h>
+#include <iprt/assert.h>
+#include <iprt/string.h>
+
+#include <smbios.h>
+
+RTDECL(int) RTSystemQueryDmiString(RTSYSDMISTR enmString, char *pszBuf, size_t cbBuf)
+{
+    AssertPtrReturn(pszBuf, VERR_INVALID_POINTER);
+    AssertReturn(cbBuf > 0, VERR_INVALID_PARAMETER);
+    *pszBuf = '\0';
+    AssertReturn(enmString > RTSYSDMISTR_INVALID && enmString < RTSYSDMISTR_END, VERR_INVALID_PARAMETER);
+
+    int rc = VINF_SUCCESS;
+    int err = 0;
+    smbios_hdl_t *pSMB = smbios_open(NULL /* default fd */, SMB_VERSION, 0 /* flags */, &err);
+    if (pSMB)
+    {
+        smbios_system_t hSMBSys;
+        id_t hSMBId = smbios_info_system(pSMB, &hSMBSys);
+        if (hSMBId != SMB_ERR)
+        {
+            smbios_info_t hSMBInfo;
+            id_t hSMBInfoId = smbios_info_common(pSMB, hSMBId, &hSMBInfo);
+            if (hSMBInfoId != SMB_ERR)
+            {
+                switch (enmString)
+                {
+                    case RTSYSDMISTR_PRODUCT_UUID:
+                    {
+                        static char const s_szHex[17] = "0123456789ABCDEF";
+                        char szData[64];
+                        char *pszData = szData;
+                        for (unsigned i = 0; i < RT_MIN(hSMBSys.smbs_uuidlen, sizeof(szData) - 1); i++)
+                        {
+                            *pszData++ = s_szHex[hSMBSys.smbs_uuid[i] >> 4];
+                            *pszData++ = s_szHex[hSMBSys.smbs_uuid[i] & 0xf];
+                            if (i == 3 || i == 5 || i == 7 || i == 9)
+                                *pszData++ = '-';
+                        }
+                        *pszData = '\0';
+                        RTStrPrintf(pszBuf, cbBuf, "%s", szData);
+                        rc = VINF_SUCCESS;
+                        break;
+                    }
+
+                    case RTSYSDMISTR_PRODUCT_NAME:      RTStrPrintf(pszBuf, cbBuf, "%s", hSMBInfo.smbi_product); rc = VINF_SUCCESS; break;
+                    case RTSYSDMISTR_PRODUCT_VERSION:   RTStrPrintf(pszBuf, cbBuf, "%s", hSMBInfo.smbi_version); rc = VINF_SUCCESS; break;
+                    case RTSYSDMISTR_PRODUCT_SERIAL:    RTStrPrintf(pszBuf, cbBuf, "%s", hSMBInfo.smbi_serial);  rc = VINF_SUCCESS; break;
+
+                    default:
+                        rc = VERR_NOT_SUPPORTED;
+                }
+            }
+            else
+                rc = VERR_INTERNAL_ERROR_2;
+        }
+        else
+            rc = VERR_INTERNAL_ERROR;
+
+        smbios_close(pSMB);
+    }
+    else
+        rc = VERR_OPEN_FAILED;
+
+    return rc;
+}
+
+
