Index: trunk/src/VBox/Runtime/common/fs/isomaker.cpp
===================================================================
--- trunk/src/VBox/Runtime/common/fs/isomaker.cpp	(revision 77733)
+++ trunk/src/VBox/Runtime/common/fs/isomaker.cpp	(revision 77734)
@@ -705,5 +705,6 @@
 *********************************************************************************************************************************/
 static int rtFsIsoMakerObjSetName(PRTFSISOMAKERINT pThis, PRTFSISOMAKERNAMESPACE pNamespace, PRTFSISOMAKEROBJ pObj,
-                                  PRTFSISOMAKERNAME pParent, const char *pchSpec, size_t cchSpec, PPRTFSISOMAKERNAME ppNewName);
+                                  PRTFSISOMAKERNAME pParent, const char *pchSpec, size_t cchSpec, bool fNoNormalize,
+                                  PPRTFSISOMAKERNAME ppNewName);
 static int rtFsIsoMakerObjUnsetName(PRTFSISOMAKERINT pThis, PRTFSISOMAKERNAMESPACE pNamespace, PRTFSISOMAKEROBJ pObj);
 static int rtFsIsoMakerAddUnnamedDirWorker(PRTFSISOMAKERINT pThis, PCRTFSOBJINFO pObjInfo, PRTFSISOMAKERDIR *ppDir);
@@ -1879,18 +1880,20 @@
  *
  * @returns IPRT status code.
- * @param   pThis       The ISO maker instance.
- * @param   pParent     The parent directory.  NULL if root.
- * @param   pchSrc      The specified name to normalize (not necessarily zero
- *                      terminated).
- * @param   cchSrc      The length of the specified name.
- * @param   fIsDir      Indicates whether it's a directory or file (like).
- * @param   pszDst      The output buffer.  Must be at least 32 bytes.
- * @param   cbDst       The size of the output buffer.
- * @param   pcchDst     Where to return the length of the returned string (i.e.
- *                      not counting the terminator).
- * @param   pcbInDirRec Where to return the name size in the directory record.
+ * @param   pThis           The ISO maker instance.
+ * @param   pParent         The parent directory.  NULL if root.
+ * @param   pchSrc          The specified name to normalize (not necessarily zero
+ *                          terminated).
+ * @param   cchSrc          The length of the specified name.
+ * @param   fNoNormalize    Don't normalize the name very strictly (imported or
+ *                          such).
+ * @param   fIsDir          Indicates whether it's a directory or file (like).
+ * @param   pszDst          The output buffer.  Must be at least 32 bytes.
+ * @param   cbDst           The size of the output buffer.
+ * @param   pcchDst         Where to return the length of the returned string (i.e.
+ *                          not counting the terminator).
+ * @param   pcbInDirRec     Where to return the name size in the directory record.
  */
 static int rtFsIsoMakerNormalizeNameForPrimaryIso9660(PRTFSISOMAKERINT pThis, PRTFSISOMAKERNAME pParent,
-                                                      const char *pchSrc, size_t cchSrc, bool fIsDir,
+                                                      const char *pchSrc, size_t cchSrc, bool fNoNormalize, bool fIsDir,
                                                       char *pszDst, size_t cbDst, size_t *pcchDst, size_t *pcbInDirRec)
 {
@@ -1909,8 +1912,8 @@
      * Produce a first name.
      */
-    uint8_t const uIsoLevel = pThis->PrimaryIso.uLevel;
+    uint8_t const uIsoLevel = !fNoNormalize ? pThis->PrimaryIso.uLevel : RT_MAX(pThis->PrimaryIso.uLevel, 3);
     size_t cchDst;
     size_t offDstDot;
-    if (fIsDir)
+    if (fIsDir && !fNoNormalize)
         offDstDot = cchDst = rtFsIsoMakerCopyIso9660Name(pszDst, uIsoLevel >= 2 ? ISO9660_MAX_NAME_LEN : 8,
                                                          pchSrc, cchSrc);
@@ -1923,5 +1926,19 @@
                 offLastDot = off;
 
-        if (offLastDot == cchSrc)
+        if (fNoNormalize)
+        {
+            /* Try preserve the imported name, though, put the foot down if too long. */
+            offDstDot = offLastDot;
+            cchDst    = cchSrc;
+            if (cchSrc > ISO9660_MAX_NAME_LEN)
+            {
+                cchDst = ISO9660_MAX_NAME_LEN;
+                if (offDstDot > cchDst)
+                    offDstDot = cchDst;
+            }
+            memcpy(pszDst, pchSrc, cchDst);
+            pszDst[cchDst] = '\0';
+        }
+        else if (offLastDot == cchSrc)
             offDstDot = cchDst = rtFsIsoMakerCopyIso9660Name(pszDst, uIsoLevel >= 2 ? ISO9660_MAX_NAME_LEN : 8,
                                                              pchSrc, cchSrc);
@@ -2019,19 +2036,22 @@
  *
  * @returns IPRT status code.
- * @param   pThis       The ISO maker instance.
- * @param   pNamespace  The namespace which rules to normalize it according to.
- * @param   pParent     The parent directory.  NULL if root.
- * @param   pchSrc      The specified name to normalize (not necessarily zero
- *                      terminated).
- * @param   cchSrc      The length of the specified name.
- * @param   fIsDir      Indicates whether it's a directory or file (like).
- * @param   pszDst      The output buffer.  Must be at least 32 bytes.
- * @param   cbDst       The size of the output buffer.
- * @param   pcchDst     Where to return the length of the returned string (i.e.
- *                      not counting the terminator).
- * @param   pcbInDirRec Where to return the name size in the directory record.
+ * @param   pThis           The ISO maker instance.
+ * @param   pNamespace      The namespace which rules to normalize it according to.
+ * @param   pParent         The parent directory.  NULL if root.
+ * @param   pchSrc          The specified name to normalize (not necessarily zero
+ *                          terminated).
+ * @param   cchSrc          The length of the specified name.
+ * @param   fIsDir          Indicates whether it's a directory or file (like).
+ * @param   fNoNormalize    Don't normalize the name very strictly (imported or
+ *                          such).
+ * @param   pszDst          The output buffer.  Must be at least 32 bytes.
+ * @param   cbDst           The size of the output buffer.
+ * @param   pcchDst         Where to return the length of the returned string (i.e.
+ *                          not counting the terminator).
+ * @param   pcbInDirRec     Where to return the name size in the directory record.
  */
 static int rtFsIsoMakerNormalizeNameForNamespace(PRTFSISOMAKERINT pThis, PRTFSISOMAKERNAMESPACE pNamespace,
-                                                 PRTFSISOMAKERNAME pParent, const char *pchSrc, size_t cchSrc, bool fIsDir,
+                                                 PRTFSISOMAKERNAME pParent, const char *pchSrc, size_t cchSrc,
+                                                 bool fNoNormalize, bool fIsDir,
                                                  char *pszDst, size_t cbDst, size_t *pcchDst, size_t *pcbInDirRec)
 {
@@ -2048,5 +2068,5 @@
              */
             case RTFSISOMAKER_NAMESPACE_ISO_9660:
-                return rtFsIsoMakerNormalizeNameForPrimaryIso9660(pThis, pParent, pchSrc, cchSrc, fIsDir,
+                return rtFsIsoMakerNormalizeNameForPrimaryIso9660(pThis, pParent, pchSrc, cchSrc, fNoNormalize, fIsDir,
                                                                   pszDst, cbDst, pcchDst, pcbInDirRec);
 
@@ -2121,6 +2141,6 @@
          */
         PRTFSISOMAKERNAME pTransTblNm;
-        rc = rtFsIsoMakerObjSetName(pThis, pNamespace, &pFile->Core, pDirName,
-                                    pNamespace->pszTransTbl, strlen(pNamespace->pszTransTbl), &pTransTblNm);
+        rc = rtFsIsoMakerObjSetName(pThis, pNamespace, &pFile->Core, pDirName, pNamespace->pszTransTbl,
+                                    strlen(pNamespace->pszTransTbl), false /*fNoNormalize*/, &pTransTblNm);
         if (RT_SUCCESS(rc))
         {
@@ -2147,14 +2167,16 @@
  *
  * @returns IPRT status code.
- * @param   pThis       The ISO maker instance.
- * @param   pNamespace  The namespace.
- * @param   pObj        The object to name.
- * @param   pParent     The parent namespace entry
- * @param   pchSpec     The specified name (not necessarily terminated).
- * @param   cchSpec     The specified name length.
- * @param   ppNewName   Where to return the name entry.  Optional.
+ * @param   pThis           The ISO maker instance.
+ * @param   pNamespace      The namespace.
+ * @param   pObj            The object to name.
+ * @param   pParent         The parent namespace entry
+ * @param   pchSpec         The specified name (not necessarily terminated).
+ * @param   cchSpec         The specified name length.
+ * @param   fNoNormalize    Don't normalize the name (imported or such).
+ * @param   ppNewName       Where to return the name entry.  Optional.
  */
 static int rtFsIsoMakerObjSetName(PRTFSISOMAKERINT pThis, PRTFSISOMAKERNAMESPACE pNamespace, PRTFSISOMAKEROBJ pObj,
-                                  PRTFSISOMAKERNAME pParent, const char *pchSpec, size_t cchSpec, PPRTFSISOMAKERNAME ppNewName)
+                                  PRTFSISOMAKERNAME pParent, const char *pchSpec, size_t cchSpec, bool fNoNormalize,
+                                  PPRTFSISOMAKERNAME ppNewName)
 {
     Assert(cchSpec < _32K);
@@ -2219,5 +2241,5 @@
     size_t cbNameInDirRec = 0;
     char   szName[RTFSISOMAKER_MAX_NAME_BUF];
-    int rc = rtFsIsoMakerNormalizeNameForNamespace(pThis, pNamespace, pParent, pchSpec, cchSpec,
+    int rc = rtFsIsoMakerNormalizeNameForNamespace(pThis, pNamespace, pParent, pchSpec, cchSpec, fNoNormalize,
                                                    pObj->enmType == RTFSISOMAKEROBJTYPE_DIR,
                                                    szName, sizeof(szName), &cchName, &cbNameInDirRec);
@@ -2376,5 +2398,5 @@
 #endif
 
-        rc = rtFsIsoMakerObjSetName(pThis, pNamespace, &pDir->Core, NULL /*pParent*/, "", 0, &pParent);
+        rc = rtFsIsoMakerObjSetName(pThis, pNamespace, &pDir->Core, NULL /*pParent*/, "", 0, false /*fNoNormalize*/, &pParent);
         AssertRCReturn(rc, rc);
         pParent = pNamespace->pRoot;
@@ -2451,5 +2473,6 @@
                     if (!*ppChildName)
                     {
-                        rc = rtFsIsoMakerObjSetName(pThis, pNamespace, &pChildObj->Core, pParent, pszPath, cchComponent, &pChild);
+                        rc = rtFsIsoMakerObjSetName(pThis, pNamespace, &pChildObj->Core, pParent, pszPath, cchComponent,
+                                                    false /*fNoNormalize*/, &pChild);
                         if (RT_FAILURE(rc))
                             return rc;
@@ -2462,5 +2485,6 @@
                     rc = rtFsIsoMakerAddUnnamedDirWorker(pThis, NULL /*pObjInfo*/, &pChildObj);
                     if (RT_SUCCESS(rc))
-                        rc = rtFsIsoMakerObjSetName(pThis, pNamespace, &pChildObj->Core, pParent, pszPath, cchComponent, &pChild);
+                        rc = rtFsIsoMakerObjSetName(pThis, pNamespace, &pChildObj->Core, pParent, pszPath, cchComponent,
+                                                    false /*fNoNormalize*/, &pChild);
                     if (RT_FAILURE(rc))
                         return rc;
@@ -2524,5 +2548,5 @@
         AssertReturn(!RTPATH_IS_SLASH(pszEntry[cchEntry]) || pObj->enmType == RTFSISOMAKEROBJTYPE_DIR,
                      VERR_NOT_A_DIRECTORY);
-        rc = rtFsIsoMakerObjSetName(pThis, pNamespace, pObj, pParent, pszEntry, cchEntry, NULL);
+        rc = rtFsIsoMakerObjSetName(pThis, pNamespace, pObj, pParent, pszEntry, cchEntry, false /*fNoNormalize*/, NULL);
     }
     return rc;
@@ -2836,7 +2860,8 @@
  *                              (RTFSISOMAKER_NAMESPACE_XXX).
  * @param   pszName             The name.
+ * @param   fNoNormalize        Don't normalize the name (imported or such).
  */
 RTDECL(int) RTFsIsoMakerObjSetNameAndParent(RTFSISOMAKER hIsoMaker, uint32_t idxObj, uint32_t idxParentObj,
-                                            uint32_t fNamespaces, const char *pszName)
+                                            uint32_t fNamespaces, const char *pszName, bool fNoNormalize)
 {
     /*
@@ -2870,5 +2895,6 @@
                 if (pParentName)
                 {
-                    int rc2 = rtFsIsoMakerObjSetName(pThis, pNamespace, pObj, pParentName, pszName, cchName, NULL /*ppNewName*/);
+                    int rc2 = rtFsIsoMakerObjSetName(pThis, pNamespace, pObj, pParentName, pszName, cchName,
+                                                     fNoNormalize, NULL /*ppNewName*/);
                     if (RT_SUCCESS(rc2))
                         cAdded++;
Index: trunk/src/VBox/Runtime/common/fs/isomakercmd.cpp
===================================================================
--- trunk/src/VBox/Runtime/common/fs/isomakercmd.cpp	(revision 77733)
+++ trunk/src/VBox/Runtime/common/fs/isomakercmd.cpp	(revision 77734)
@@ -1811,5 +1811,5 @@
                         pOpts->cItemsAdded++;
                         rc = RTFsIsoMakerObjSetNameAndParent(pOpts->hIsoMaker, idxObj, idxDirObj, fNamespaces,
-                                                             pDirEntry->szName);
+                                                             pDirEntry->szName, false /*fNoNormalize*/);
                         if (RT_FAILURE(rc))
                             rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "Error setting parent & name on file '%s' to '%s': %Rrc",
@@ -1831,5 +1831,5 @@
                             pOpts->cItemsAdded++;
                             rc = RTFsIsoMakerObjSetNameAndParent(pOpts->hIsoMaker, idxObj, idxDirObj, fNamespaces,
-                                                                 pDirEntry->szName);
+                                                                 pDirEntry->szName, false /*fNoNormalize*/);
                             if (RT_SUCCESS(rc))
                                 /* Recurse into the sub-directory. */
Index: trunk/src/VBox/Runtime/common/fs/isomakerimport.cpp
===================================================================
--- trunk/src/VBox/Runtime/common/fs/isomakerimport.cpp	(revision 77733)
+++ trunk/src/VBox/Runtime/common/fs/isomakerimport.cpp	(revision 77734)
@@ -400,5 +400,5 @@
          * Enter the object into the namespace.
          */
-        rc = RTFsIsoMakerObjSetNameAndParent(pThis->hIsoMaker, idxObj, idxParent, fNamespace, pszName);
+        rc = RTFsIsoMakerObjSetNameAndParent(pThis->hIsoMaker, idxObj, idxParent, fNamespace, pszName, true /*fNoNormalize*/);
         if (RT_SUCCESS(rc))
         {
@@ -454,5 +454,5 @@
          * Enter the object into the namespace.
          */
-        rc = RTFsIsoMakerObjSetNameAndParent(pThis->hIsoMaker, idxObj, idxParent, fNamespace, pszName);
+        rc = RTFsIsoMakerObjSetNameAndParent(pThis->hIsoMaker, idxObj, idxParent, fNamespace, pszName, true /*fNoNormalize*/);
         if (RT_SUCCESS(rc))
         {
@@ -603,5 +603,5 @@
      * Enter the object into the namespace.
      */
-    rc = RTFsIsoMakerObjSetNameAndParent(pThis->hIsoMaker, idxObj, idxParent, fNamespace, pszName);
+    rc = RTFsIsoMakerObjSetNameAndParent(pThis->hIsoMaker, idxObj, idxParent, fNamespace, pszName, true /*fNoNormalize*/);
     if (RT_SUCCESS(rc))
     {
