Index: /trunk/include/iprt/file.h
===================================================================
--- /trunk/include/iprt/file.h	(revision 68182)
+++ /trunk/include/iprt/file.h	(revision 68183)
@@ -1131,6 +1131,8 @@
 #define RTFILE_RDALL_O_DENY_NOT_DELETE      RTFILE_O_DENY_NOT_DELETE
 #define RTFILE_RDALL_O_DENY_MASK            RTFILE_O_DENY_MASK
+/** Add a trailing zero byte to facilitate reading text files. */
+#define RTFILE_RDALL_F_TRAILING_ZERO_BYTE   RT_BIT_32(31)
 /** Mask of valid flags. */
-#define RTFILE_RDALL_VALID_MASK             RTFILE_RDALL_O_DENY_MASK
+#define RTFILE_RDALL_VALID_MASK             (RTFILE_RDALL_O_DENY_MASK | UINT32_C(0x80000000))
 /** @} */
 
Index: /trunk/src/VBox/Runtime/common/fs/isomaker.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/fs/isomaker.cpp	(revision 68182)
+++ /trunk/src/VBox/Runtime/common/fs/isomaker.cpp	(revision 68183)
@@ -38,4 +38,5 @@
 #include <iprt/err.h>
 #include <iprt/ctype.h>
+#include <iprt/md5.h>
 #include <iprt/file.h>
 #include <iprt/list.h>
@@ -46,4 +47,5 @@
 #include <iprt/vfs.h>
 #include <iprt/vfslowlevel.h>
+#include <iprt/zero.h>
 #include <iprt/formats/iso9660.h>
 
@@ -5107,4 +5109,32 @@
     }
 
+#if 0 /* this doesn't quite fool it. */
+    /*
+     * isomd5sum fake.
+     */
+    if (1)
+    {
+        uint8_t      abDigest[RTMD5_HASH_SIZE];
+        if (pThis->cbSysArea == 0)
+            RTMd5(g_abRTZero4K, ISO9660_SECTOR_SIZE, abDigest);
+        else
+        {
+            RTMD5CONTEXT Ctx;
+            RTMd5Init(&Ctx);
+            RTMd5Update(&Ctx, pThis->pbSysArea, RT_MIN(pThis->cbSysArea, ISO9660_SECTOR_SIZE));
+            if (pThis->cbSysArea < ISO9660_SECTOR_SIZE)
+                RTMd5Update(&Ctx, g_abRTZero4K, ISO9660_SECTOR_SIZE - pThis->cbSysArea);
+            RTMd5Final(abDigest, &Ctx);
+        }
+        char szFakeHash[RTMD5_DIGEST_LEN + 1];
+        RTMd5ToString(abDigest, szFakeHash, sizeof(szFakeHash));
+
+        size_t cch = RTStrPrintf((char *)&pPrimary->abAppUse[0], sizeof(pPrimary->abAppUse),
+                                 "ISO MD5SUM = %s;SKIPSECTORS = %u;RHLISOSTATUS=1;THIS IS JUST A FAKE!",
+                                 szFakeHash, pThis->cbFinalizedImage / RTFSISOMAKER_SECTOR_SIZE - 1);
+        memset(&pPrimary->abAppUse[cch], ' ', sizeof(pPrimary->abAppUse) - cch);
+    }
+#endif
+
     return VINF_SUCCESS;
 }
Index: /trunk/src/VBox/Runtime/generic/RTFileReadAllByHandleEx-generic.cpp
===================================================================
--- /trunk/src/VBox/Runtime/generic/RTFileReadAllByHandleEx-generic.cpp	(revision 68182)
+++ /trunk/src/VBox/Runtime/generic/RTFileReadAllByHandleEx-generic.cpp	(revision 68183)
@@ -65,5 +65,5 @@
                  * Try allocate the required memory and initialize the header (hardcoded fun).
                  */
-                void *pvHdr = RTMemAlloc(cbAllocMem + 32);
+                void *pvHdr = RTMemAlloc(cbAllocMem + 32 + (fFlags & RTFILE_RDALL_F_TRAILING_ZERO_BYTE ? 1 : 0));
                 if (pvHdr)
                 {
@@ -81,4 +81,7 @@
                         if (RT_SUCCESS(rc))
                         {
+                            if (fFlags & RTFILE_RDALL_F_TRAILING_ZERO_BYTE)
+                                ((uint8_t *)pvFile)[cbAllocFile] = '\0';
+
                             /*
                              * Success - fill in the return values.
