VirtualBox

儲存庫 vbox 的更動 67445


忽略:
時間撮記:
2017-6-16 下午02:31:28 (7 年 以前)
作者:
vboxsync
訊息:

IPRT: More ISO maker code (booting related).

位置:
trunk
檔案:
修改 4 筆資料

圖例:

未更動
新增
刪除
  • trunk/include/iprt/fsisomaker.h

    r67437 r67445  
    308308RTDECL(int) RTFsIsoMakerAddFileWithVfsFile(RTFSISOMAKER hIsoMaker, const char *pszFile, RTVFSFILE hVfsFileSrc, uint32_t *pidxObj);
    309309
     310
     311/**
     312 * Set the validation entry of the boot catalog (this is the first entry).
     313 *
     314 * @returns IPRT status code.
     315 * @param   hIsoMaker           The ISO maker handle.
     316 * @param   idPlatform          The platform ID
     317 *                              (ISO9660_ELTORITO_PLATFORM_ID_XXX).
     318 * @param   pszString           CD/DVD-ROM identifier.  Optional.
     319 */
     320RTDECL(int) RTFsIsoMakerBootCatSetValidationEntry(RTFSISOMAKER hIsoMaker, uint8_t idPlatform, const char *pszString);
     321
     322/**
     323 * Set the validation entry of the boot catalog (this is the first entry).
     324 *
     325 * @returns IPRT status code.
     326 * @param   hIsoMaker           The ISO maker handle.
     327 * @param   idxBootCat          The boot catalog entry.  Zero and two are
     328 *                              invalid.  Must be less than 63.
     329 * @param   idxImageObj         The configuration index of the boot image.
     330 * @param   bBootMediaType      The media type and flag (not for entry 1)
     331 *                              (ISO9660_ELTORITO_BOOT_MEDIA_TYPE_XXX,
     332 *                              ISO9660_ELTORITO_BOOT_MEDIA_F_XXX).
     333 * @param   bSystemType         The partitiona table system ID.
     334 * @param   fBootable           Whether it's a bootable entry or if we just want
     335 *                              the BIOS to setup the emulation without booting
     336 *                              it.
     337 * @param   uLoadSeg            The load address divided by 0x10 (i.e. the real
     338 *                              mode segment number).
     339 * @param   cSectorsToLoad      Number of emulated sectors to load.
     340 */
     341RTDECL(int) RTFsIsoMakerBootCatSetSectionEntry(RTFSISOMAKER hIsoMaker, uint32_t idxBootCat, uint32_t idxImageObj,
     342                                               uint8_t bBootMediaType, uint8_t bSystemType, bool fBootable,
     343                                               uint16_t uLoadSeg, uint16_t cSectorsToLoad);
     344
     345/**
     346 * Set the validation entry of the boot catalog (this is the first entry).
     347 *
     348 * @returns IPRT status code.
     349 * @param   hIsoMaker           The ISO maker handle.
     350 * @param   idxBootCat          The boot catalog entry.
     351 * @param   idPlatform          The platform ID
     352 *                              (ISO9660_ELTORITO_PLATFORM_ID_XXX).
     353 * @param   pszString           CD/DVD-ROM identifier.  Optional.
     354 */
     355RTDECL(int) RTFsIsoMakerBootCatSetSectionHeaderEntry(RTFSISOMAKER hIsoMaker, uint32_t idxBootCat, uint32_t cEntries,
     356                                                     uint8_t idPlatform, const char *pszString);
     357
    310358/**
    311359 * Finalizes the image.
  • trunk/include/iprt/mangling.h

    r67437 r67445  
    924924# define RTFsIsoMakerRetain                             RT_MANGLER(RTFsIsoMakerRetain)
    925925# define RTFsIsoMakerRelease                            RT_MANGLER(RTFsIsoMakerRelease)
     926# define RTFsIsoMakerBootCatSetValidationEntry          RT_MANGLER(RTFsIsoMakerBootCatSetValidationEntry)
     927# define RTFsIsoMakerBootCatSetSectionEntry             RT_MANGLER(RTFsIsoMakerBootCatSetSectionEntry)
     928# define RTFsIsoMakerBootCatSetSectionHeaderEntry       RT_MANGLER(RTFsIsoMakerBootCatSetSectionHeaderEntry)
    926929# define RTFsIsoMakerQueryObjIdxForBootCatalog          RT_MANGLER(RTFsIsoMakerQueryObjIdxForBootCatalog)
    927930# define RTFsIsoMakerSetIso9660Level                    RT_MANGLER(RTFsIsoMakerSetIso9660Level)
  • trunk/src/VBox/Runtime/common/fs/isomaker.cpp

    r67437 r67445  
    331331    /** Used to make sure things like the boot catalog stays in the image even if
    332332     * it's not mapped into any of the namespaces. */
    333     bool                    fNotOrphan;
     333    uint32_t                cNotOrphan;
    334334} RTFSISOMAKEROBJ;
    335335
     
    455455    /** The boot catalog file. */
    456456    PRTFSISOMAKERFILE       pBootCatFile;
    457 
     457    /** Per boot catalog entry data needed for updating offsets when finalizing. */
     458    struct
     459    {
     460        /** The type (ISO9660_ELTORITO_HEADER_ID_VALIDATION_ENTRY,
     461         * ISO9660_ELTORITO_HEADER_ID_SECTION_HEADER,
     462         * ISO9660_ELTORITO_HEADER_ID_FINAL_SECTION_HEADER,
     463         * ISO9660_ELTORITO_BOOT_INDICATOR_BOOTABLE or
     464         * ISO9660_ELTORITO_BOOT_INDICATOR_NOT_BOOTABLE). */
     465        uint8_t             bType;
     466        /** Number of entries related to this one.  This is zero for unused entries,
     467         *  2 for the validation entry, 2+ for section headers, and 1 for images. */
     468        uint8_t             cEntries;
     469        /** The boot file. */
     470        PRTFSISOMAKERFILE   pBootFile;
     471    }                       aBootCatEntries[64];
    458472    /** @} */
    459473
     
    25652579    pObj->pHfsName      = NULL;
    25662580    pObj->idxObj        = pThis->cObjects++;
    2567     pObj->fNotOrphan    = false;
     2581    pObj->cNotOrphan    = 0;
    25682582    if (pObjInfo)
    25692583    {
     
    29192933            pFile->u.hVfsFile       = hVfsFile;
    29202934            pFile->pBootInfoTable   = NULL;
    2921             pFile->Core.fNotOrphan  = true;
     2935            pFile->Core.cNotOrphan  = 1;
    29222936
    29232937            /* Save file pointer and we're done. */
     
    29612975
    29622976
     2977/**
     2978 * Set the validation entry of the boot catalog (this is the first entry).
     2979 *
     2980 * @returns IPRT status code.
     2981 * @param   hIsoMaker           The ISO maker handle.
     2982 * @param   idPlatform          The platform ID
     2983 *                              (ISO9660_ELTORITO_PLATFORM_ID_XXX).
     2984 * @param   pszString           CD/DVD-ROM identifier.  Optional.
     2985 */
     2986RTDECL(int) RTFsIsoMakerBootCatSetValidationEntry(RTFSISOMAKER hIsoMaker, uint8_t idPlatform, const char *pszString)
     2987{
     2988    /*
     2989     * Validate input.
     2990     */
     2991    PRTFSISOMAKERINT pThis = hIsoMaker;
     2992    RTFSISOMAKER_ASSERT_VALID_HANDLE_RET(pThis);
     2993    size_t cchString = 0;
     2994    if (pszString)
     2995    {
     2996        cchString = RTStrCalcLatin1Len(pszString);
     2997        AssertReturn(cchString < RT_SIZEOFMEMB(ISO9660ELTORITOVALIDATIONENTRY, achId), VERR_OUT_OF_RANGE);
     2998    }
     2999
     3000    /*
     3001     * Make sure we've got a boot file.
     3002     */
     3003    int rc = rtFsIsoMakerEnsureBootCatFile(pThis);
     3004    if (RT_SUCCESS(rc))
     3005    {
     3006        /*
     3007         * Construct the entry data.
     3008         */
     3009        ISO9660ELTORITOVALIDATIONENTRY Entry;
     3010        Entry.bHeaderId = ISO9660_ELTORITO_HEADER_ID_VALIDATION_ENTRY;
     3011        Entry.bPlatformId = idPlatform;
     3012        Entry.u16Reserved = 0;
     3013        RT_ZERO(Entry.achId);
     3014        if (cchString)
     3015        {
     3016            char *pszTmp = Entry.achId;
     3017            rc = RTStrToLatin1Ex(pszString, RTSTR_MAX, &pszTmp, sizeof(Entry.achId), NULL);
     3018            AssertRC(rc);
     3019        }
     3020        Entry.u16Checksum = 0;
     3021        Entry.bKey1 = ISO9660_ELTORITO_KEY_BYTE_1;
     3022        Entry.bKey2 = ISO9660_ELTORITO_KEY_BYTE_2;
     3023
     3024        /* Calc checksum. */
     3025        uint16_t uSum = 0;
     3026        uint16_t const *pu16Src = (uint16_t const *)&Entry;
     3027        uint16_t        cLeft   = sizeof(Entry) / sizeof(uint16_t);
     3028        while (cLeft-- > 0)
     3029        {
     3030            uSum += RT_LE2H_U16(*pu16Src);
     3031            pu16Src++;
     3032        }
     3033        Entry.u16Checksum = RT_H2LE_U16((uint16_t)0 - uSum);
     3034
     3035        /*
     3036         * Write the entry and update our internal tracker.
     3037         */
     3038        rc = RTVfsFileWriteAt(pThis->pBootCatFile->u.hVfsFile, 0, &Entry, sizeof(Entry), NULL);
     3039        if (RT_SUCCESS(rc))
     3040        {
     3041            pThis->aBootCatEntries[0].bType    = ISO9660_ELTORITO_HEADER_ID_VALIDATION_ENTRY;
     3042            pThis->aBootCatEntries[0].cEntries = 2;
     3043        }
     3044    }
     3045    return rc;
     3046}
     3047
     3048
     3049/**
     3050 * Set the validation entry of the boot catalog (this is the first entry).
     3051 *
     3052 * @returns IPRT status code.
     3053 * @param   hIsoMaker           The ISO maker handle.
     3054 * @param   idxBootCat          The boot catalog entry.  Zero and two are
     3055 *                              invalid.  Must be less than 63.
     3056 * @param   idxImageObj         The configuration index of the boot image.
     3057 * @param   bBootMediaType      The media type and flag (not for entry 1)
     3058 *                              (ISO9660_ELTORITO_BOOT_MEDIA_TYPE_XXX,
     3059 *                              ISO9660_ELTORITO_BOOT_MEDIA_F_XXX).
     3060 * @param   bSystemType         The partitiona table system ID.
     3061 * @param   fBootable           Whether it's a bootable entry or if we just want
     3062 *                              the BIOS to setup the emulation without booting
     3063 *                              it.
     3064 * @param   uLoadSeg            The load address divided by 0x10 (i.e. the real
     3065 *                              mode segment number).
     3066 * @param   cSectorsToLoad      Number of emulated sectors to load.
     3067 */
     3068RTDECL(int) RTFsIsoMakerBootCatSetSectionEntry(RTFSISOMAKER hIsoMaker, uint32_t idxBootCat, uint32_t idxImageObj,
     3069                                               uint8_t bBootMediaType, uint8_t bSystemType, bool fBootable,
     3070                                               uint16_t uLoadSeg, uint16_t cSectorsToLoad)
     3071{
     3072    /*
     3073     * Validate input.
     3074     */
     3075    PRTFSISOMAKERINT pThis = hIsoMaker;
     3076    RTFSISOMAKER_ASSERT_VALID_HANDLE_RET(pThis);
     3077    PRTFSISOMAKERFILE pFile = (PRTFSISOMAKERFILE)rtFsIsoMakerIndexToObj(pThis, idxImageObj);
     3078    AssertReturn(pFile, VERR_OUT_OF_RANGE);
     3079    AssertReturn((bBootMediaType & ISO9660_ELTORITO_BOOT_MEDIA_TYPE_MASK) <= ISO9660_ELTORITO_BOOT_MEDIA_TYPE_HARD_DISK,
     3080                 VERR_INVALID_PARAMETER);
     3081    AssertReturn(!(bBootMediaType & ISO9660_ELTORITO_BOOT_MEDIA_F_MASK) || idxBootCat != 1,
     3082                 VERR_INVALID_PARAMETER);
     3083
     3084    AssertReturn(idxBootCat != 0 && idxBootCat != 2 && idxBootCat < RT_ELEMENTS(pThis->aBootCatEntries) - 1U, VERR_OUT_OF_RANGE);
     3085
     3086    /*
     3087     * Make sure we've got a boot file.
     3088     */
     3089    int rc = rtFsIsoMakerEnsureBootCatFile(pThis);
     3090    if (RT_SUCCESS(rc))
     3091    {
     3092        /*
     3093         * Construct the entry.
     3094         */
     3095        ISO9660ELTORITOSECTIONENTRY Entry;
     3096        Entry.bBootIndicator            = fBootable ? ISO9660_ELTORITO_BOOT_INDICATOR_BOOTABLE
     3097                                        :             ISO9660_ELTORITO_BOOT_INDICATOR_NOT_BOOTABLE;
     3098        Entry.bBootMediaType            = bBootMediaType;
     3099        Entry.uLoadSeg                  = RT_H2LE_U16(uLoadSeg);
     3100        Entry.bSystemType               = bSystemType;
     3101        Entry.bUnused                   = 0;
     3102        Entry.cEmulatedSectorsToLoad    = RT_H2LE_U16(cSectorsToLoad);
     3103        Entry.offBootImage              = 0;
     3104        Entry.bSelectionCriteriaType    = ISO9660_ELTORITO_SEL_CRIT_TYPE_NONE;
     3105        RT_ZERO(Entry.abSelectionCriteria);
     3106
     3107        /*
     3108         * Write it and update our internal tracker.
     3109         */
     3110        rc = RTVfsFileWriteAt(pThis->pBootCatFile->u.hVfsFile, 32 * idxBootCat, &Entry, sizeof(Entry), NULL);
     3111        if (RT_SUCCESS(rc))
     3112        {
     3113            if (pThis->aBootCatEntries[idxBootCat].pBootFile != pFile)
     3114            {
     3115                if (pThis->aBootCatEntries[idxBootCat].pBootFile)
     3116                    pThis->aBootCatEntries[idxBootCat].pBootFile->Core.cNotOrphan--;
     3117                pFile->Core.cNotOrphan++;
     3118                pThis->aBootCatEntries[idxBootCat].pBootFile = pFile;
     3119            }
     3120
     3121            pThis->aBootCatEntries[idxBootCat].bType    = Entry.bBootIndicator;
     3122            pThis->aBootCatEntries[idxBootCat].cEntries = 1;
     3123        }
     3124    }
     3125    return rc;
     3126}
     3127
     3128
     3129/**
     3130 * Set the validation entry of the boot catalog (this is the first entry).
     3131 *
     3132 * @returns IPRT status code.
     3133 * @param   hIsoMaker           The ISO maker handle.
     3134 * @param   idxBootCat          The boot catalog entry.
     3135 * @param   idPlatform          The platform ID
     3136 *                              (ISO9660_ELTORITO_PLATFORM_ID_XXX).
     3137 * @param   pszString           CD/DVD-ROM identifier.  Optional.
     3138 */
     3139RTDECL(int) RTFsIsoMakerBootCatSetSectionHeaderEntry(RTFSISOMAKER hIsoMaker, uint32_t idxBootCat, uint32_t cEntries,
     3140                                                     uint8_t idPlatform, const char *pszString)
     3141{
     3142    RT_NOREF(hIsoMaker, idxBootCat, cEntries, idPlatform, pszString);
     3143    return VERR_NOT_IMPLEMENTED;
     3144}
     3145
     3146
     3147
    29633148
    29643149
     
    29913176                || pCur->pUdfName
    29923177                || pCur->pHfsName
    2993                 || pCur->fNotOrphan)
     3178                || pCur->cNotOrphan > 0)
    29943179            { /* likely */ }
    29953180            else
  • trunk/src/VBox/Runtime/common/fs/isomakercmd.cpp

    r67437 r67445  
    285285    } u;
    286286} RTFSISOMKCMDELTORITOENTRY;
     287/** Pointer to an el torito boot entry. */
     288typedef RTFSISOMKCMDELTORITOENTRY *PRTFSISOMKCMDELTORITOENTRY;
    287289
    288290/**
     
    13351337                if (idxObj != UINT32_MAX)
    13361338                {
    1337                     int rc = RTFsIsoMakerObjRemove(pOpts->hIsoMaker, idxObj);
     1339                    rc = RTFsIsoMakerObjRemove(pOpts->hIsoMaker, idxObj);
    13381340                    if (RT_FAILURE(rc))
    13391341                        return rtFsIsoMakerCmdErrorRc(pOpts, rc, "Failed to remove '%s': %Rrc", pszSpec, rc);
     
    13541356        uint32_t        offError;
    13551357        RTERRINFOSTATIC ErrInfo;
    1356         int rc = RTVfsChainQueryInfo(pszSrc, &ObjInfo, RTFSOBJATTRADD_UNIX,
    1357                                      RTPATH_F_FOLLOW_LINK, &offError, RTErrInfoInitStatic(&ErrInfo));
     1358        rc = RTVfsChainQueryInfo(pszSrc, &ObjInfo, RTFSOBJATTRADD_UNIX,
     1359                                 RTPATH_F_FOLLOW_LINK, &offError, RTErrInfoInitStatic(&ErrInfo));
    13581360        if (RT_FAILURE(rc))
    13591361            return rtFsIsoMakerCmdChainError(pOpts, "RTVfsChainQueryInfo", pszSrc, rc, offError, &ErrInfo.Core);
     
    17471749     * Locate and configure the boot images first.
    17481750     */
    1749     for (uint32_t idxBootCat = 1; idxBootCat < pOpts->cBootCatEntries; idxBootCat++)
    1750         if (   pOpts->aBootCatEntries[idxBootCat].enmType == RTFSISOMKCMDELTORITOENTRY::kEntryType_Default
    1751             || pOpts->aBootCatEntries[idxBootCat].enmType == RTFSISOMKCMDELTORITOENTRY::kEntryType_Section)
     1751    int rc;
     1752    PRTFSISOMKCMDELTORITOENTRY pBootCatEntry = &pOpts->aBootCatEntries[1];
     1753    for (uint32_t idxBootCat = 1; idxBootCat < pOpts->cBootCatEntries; idxBootCat++, pBootCatEntry++)
     1754        if (   pBootCatEntry->enmType == RTFSISOMKCMDELTORITOENTRY::kEntryType_Default
     1755            || pBootCatEntry->enmType == RTFSISOMKCMDELTORITOENTRY::kEntryType_Section)
    17521756        {
    17531757            /* Make sure we've got a boot image. */
    1754             uint32_t idxImageObj = pOpts->aBootCatEntries[idxBootCat].u.Section.idxImageObj;
     1758            uint32_t idxImageObj = pBootCatEntry->u.Section.idxImageObj;
    17551759            if (idxImageObj == UINT32_MAX)
    17561760            {
    1757                 const char *pszBootImage = pOpts->aBootCatEntries[idxBootCat].u.Section.pszImageNameInIso;
     1761                const char *pszBootImage = pBootCatEntry->u.Section.pszImageNameInIso;
    17581762                if (pszBootImage == NULL)
    17591763                    return rtFsIsoMakerCmdSyntaxError(pOpts, "No image name given for boot catalog entry #%u", idxBootCat);
     
    17631767                    return rtFsIsoMakerCmdSyntaxError(pOpts, "Unable to locate image for boot catalog entry #%u: %s",
    17641768                                                      idxBootCat, pszBootImage);
    1765                 pOpts->aBootCatEntries[idxBootCat].u.Section.idxImageObj = idxImageObj;
     1769                pBootCatEntry->u.Section.idxImageObj = idxImageObj;
    17661770            }
    17671771
    17681772            /* Enable patching it? */
    1769             if (pOpts->aBootCatEntries[idxBootCat].u.Section.fInsertBootInfoTable)
     1773            if (pBootCatEntry->u.Section.fInsertBootInfoTable)
    17701774            {
    1771                 int rc = RTFsIsoMakerObjEnableBootInfoTablePatching(pOpts->hIsoMaker, idxImageObj, true);
     1775                rc = RTFsIsoMakerObjEnableBootInfoTablePatching(pOpts->hIsoMaker, idxImageObj, true);
    17721776                if (RT_FAILURE(rc))
    17731777                    return rtFsIsoMakerCmdErrorRc(pOpts, rc,
     
    17771781
    17781782            /* Figure out the floppy type given the object size. */
    1779             if (pOpts->aBootCatEntries[idxBootCat].u.Section.bBootMediaType == ISO9660_ELTORITO_BOOT_MEDIA_TYPE_MASK)
     1783            if (pBootCatEntry->u.Section.bBootMediaType == ISO9660_ELTORITO_BOOT_MEDIA_TYPE_MASK)
    17801784            {
    17811785                uint64_t cbImage;
    1782                 int rc = RTFsIsoMakerObjQueryDataSize(pOpts->hIsoMaker, idxImageObj, &cbImage);
     1786                rc = RTFsIsoMakerObjQueryDataSize(pOpts->hIsoMaker, idxImageObj, &cbImage);
    17831787                if (RT_FAILURE(rc))
    17841788                    return rtFsIsoMakerCmdErrorRc(pOpts, rc, "RTFsIsoMakerObjGetDataSize failed on entry #%u: %Rrc\n",
    17851789                                                  idxBootCat, rc);
    17861790                if (cbImage == 1228800)
    1787                     pOpts->aBootCatEntries[idxBootCat].u.Section.bBootMediaType = ISO9660_ELTORITO_BOOT_MEDIA_TYPE_FLOPPY_1_2_MB;
     1791                    pBootCatEntry->u.Section.bBootMediaType = ISO9660_ELTORITO_BOOT_MEDIA_TYPE_FLOPPY_1_2_MB;
    17881792                else if (cbImage <= 1474560)
    1789                     pOpts->aBootCatEntries[idxBootCat].u.Section.bBootMediaType = ISO9660_ELTORITO_BOOT_MEDIA_TYPE_FLOPPY_1_44_MB;
     1793                    pBootCatEntry->u.Section.bBootMediaType = ISO9660_ELTORITO_BOOT_MEDIA_TYPE_FLOPPY_1_44_MB;
    17901794                else if (cbImage <= 2949120)
    1791                     pOpts->aBootCatEntries[idxBootCat].u.Section.bBootMediaType = ISO9660_ELTORITO_BOOT_MEDIA_TYPE_FLOPPY_2_88_MB;
     1795                    pBootCatEntry->u.Section.bBootMediaType = ISO9660_ELTORITO_BOOT_MEDIA_TYPE_FLOPPY_2_88_MB;
    17921796                else
    1793                     pOpts->aBootCatEntries[idxBootCat].u.Section.bBootMediaType = ISO9660_ELTORITO_BOOT_MEDIA_TYPE_HARD_DISK;
     1797                    pBootCatEntry->u.Section.bBootMediaType = ISO9660_ELTORITO_BOOT_MEDIA_TYPE_HARD_DISK;
    17941798            }
    17951799        }
     
    17981802     * Add the boot catalog entries.
    17991803     */
    1800 
     1804    pBootCatEntry = &pOpts->aBootCatEntries[0];
     1805    for (uint32_t idxBootCat = 0; idxBootCat < pOpts->cBootCatEntries; idxBootCat++, pBootCatEntry++)
     1806        switch (pBootCatEntry->enmType)
     1807        {
     1808            case RTFSISOMKCMDELTORITOENTRY::kEntryType_Validation:
     1809                Assert(idxBootCat == 0);
     1810                rc = RTFsIsoMakerBootCatSetValidationEntry(pOpts->hIsoMaker, pBootCatEntry->u.Validation.idPlatform,
     1811                                                           pBootCatEntry->u.Validation.pszString);
     1812                if (RT_FAILURE(rc))
     1813                    return rtFsIsoMakerCmdErrorRc(pOpts, rc, "RTFsIsoMakerBootCatSetValidationEntry failed: %Rrc\n", rc);
     1814                break;
     1815
     1816            case RTFSISOMKCMDELTORITOENTRY::kEntryType_Default:
     1817            case RTFSISOMKCMDELTORITOENTRY::kEntryType_Section:
     1818                Assert(pBootCatEntry->enmType == RTFSISOMKCMDELTORITOENTRY::kEntryType_Default ? idxBootCat == 1 : idxBootCat > 2);
     1819                rc = RTFsIsoMakerBootCatSetSectionEntry(pOpts->hIsoMaker, idxBootCat,
     1820                                                        pBootCatEntry->u.Section.idxImageObj,
     1821                                                        pBootCatEntry->u.Section.bBootMediaType,
     1822                                                        pBootCatEntry->u.Section.bSystemType,
     1823                                                        pBootCatEntry->u.Section.fBootable,
     1824                                                        pBootCatEntry->u.Section.uLoadSeg,
     1825                                                        pBootCatEntry->u.Section.cSectorsToLoad);
     1826                if (RT_FAILURE(rc))
     1827                    return rtFsIsoMakerCmdErrorRc(pOpts, rc, "RTFsIsoMakerBootCatSetSectionEntry failed on entry #%u: %Rrc\n",
     1828                                                  idxBootCat, rc);
     1829                break;
     1830
     1831            case RTFSISOMKCMDELTORITOENTRY::kEntryType_SectionHeader:
     1832            {
     1833                uint32_t cEntries = 1;
     1834                while (   idxBootCat + cEntries < pOpts->cBootCatEntries
     1835                       && pBootCatEntry[cEntries].enmType != RTFSISOMKCMDELTORITOENTRY::kEntryType_SectionHeader)
     1836                    cEntries++;
     1837                cEntries--;
     1838
     1839                Assert(idxBootCat > 1);
     1840                rc = RTFsIsoMakerBootCatSetSectionHeaderEntry(pOpts->hIsoMaker, idxBootCat, cEntries,
     1841                                                              pBootCatEntry->u.SectionHeader.idPlatform,
     1842                                                              pBootCatEntry->u.SectionHeader.pszString);
     1843                if (RT_FAILURE(rc))
     1844                    return rtFsIsoMakerCmdErrorRc(pOpts, rc,
     1845                                                  "RTFsIsoMakerBootCatSetSectionHeaderEntry failed on entry #%u: %Rrc\n",
     1846                                                  idxBootCat, rc);
     1847                break;
     1848            }
     1849
     1850            default:
     1851                AssertFailedReturn(VERR_INTERNAL_ERROR_3);
     1852        }
    18011853
    18021854    return VINF_SUCCESS;
     
    20022054            rc = rtFsIsoMakerCmdErrorRc(&Opts, VERR_INVALID_PARAMETER, "No output file specified (--output <file>)");
    20032055    }
     2056
     2057    /*
     2058     * Final actions.
     2059     */
     2060    if (RT_SUCCESS(rc))
     2061        rc = rtFsIsoMakerCmdOptEltoritoCommitBootCatalog(&Opts);
    20042062    if (RT_SUCCESS(rc))
    20052063    {
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette