Changeset 67434 in vbox
- Timestamp:
- Jun 16, 2017 9:51:43 AM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 116164
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/fs/isomakercmd.cpp
r67427 r67434 96 96 RTFSISOMAKERCMD_OPT_NO_JOLIET, 97 97 98 RTFSISOMAKERCMD_OPT_ELTORITO_NEW_ENTRY, 99 RTFSISOMAKERCMD_OPT_ELTORITO_ADD_IMAGE, 98 100 RTFSISOMAKERCMD_OPT_ELTORITO_FLOPPY_12, 99 101 RTFSISOMAKERCMD_OPT_ELTORITO_FLOPPY_144, … … 117 119 RTFSISOMAKERCMD_OPT_DIR_MODE, 118 120 RTFSISOMAKERCMD_OPT_DVD_VIDEO, 119 RTFSISOMAKERCMD_OPT_ELTORITO_ALT_BOOT,120 121 RTFSISOMAKERCMD_OPT_ELTORITO_PLATFORM_ID, 121 122 RTFSISOMAKERCMD_OPT_ELTORITO_HARD_DISK_BOOT, … … 234 235 } RTFSISOMAKERCMDOPT; 235 236 237 238 /** 239 * El Torito boot entry. 240 */ 241 typedef struct RTFSISOMKCMDELTORITOENTRY 242 { 243 /** The type of this entry. */ 244 enum 245 { 246 kEntryType_Invalid = 0, 247 kEntryType_Validation, /**< Same as kEntryType_SectionHeader, just hardcoded #0. */ 248 kEntryType_SectionHeader, 249 kEntryType_Default, /**< Same as kEntryType_Section, just hardcoded #1. */ 250 kEntryType_Section 251 } enmType; 252 /** Type specific data. */ 253 union 254 { 255 struct 256 { 257 /** The platform ID (ISO9660_ELTORITO_PLATFORM_ID_XXX). */ 258 uint8_t idPlatform; 259 /** Some string for the header. */ 260 const char *pszString; 261 } Validation, 262 SectionHeader; 263 struct 264 { 265 /** The name of the boot image wihtin the ISO (-b option). */ 266 const char *pszImageNameInIso; 267 /** The object ID of the image in the ISO. This is set to UINT32_MAX when 268 * pszImageNameInIso is used (i.e. -b option) and we've delayed everything 269 * boot related till after all files have been added to the image. */ 270 uint32_t idImage; 271 /** Whether to insert boot info table into the image. */ 272 bool fInsertBootInfoTable; 273 /** Bootble or not. Possible to make BIOS set up emulation w/o booting it. */ 274 bool fBootable; 275 /** The media type (ISO9660_ELTORITO_BOOT_MEDIA_TYPE_XXX) and flags 276 * (ISO9660_ELTORITO_BOOT_MEDIA_F_XXX). */ 277 uint8_t bBootMediaType; 278 /** File system / partition type. */ 279 uint8_t bSystemType; 280 /** Load address divided by 0x10. */ 281 uint16_t uLoadSeg; 282 /** Number of sectors (512) to load. */ 283 uint16_t cSectorsToLoad; 284 } Section, 285 Default; 286 } u; 287 } RTFSISOMKCMDELTORITOENTRY; 288 236 289 /** 237 290 * ISO maker command options & state. … … 277 330 /** @name Booting related options and state. 278 331 * @{ */ 279 /** The current El Torito boot entry, UINT32_MAX if none active. 280 * An entry starts when --eltorito-boot/-b is used the first time, or when 281 * --eltorito-alt-boot is used, or when --elptorito-platform-id is used 282 * with a different value after -b is specified. */ 283 uint32_t idEltoritoEntry; 284 /** The previous --eltorito-platform-id option. */ 285 const char *pszEltoritoPlatformId; 332 /** Number of boot catalog entries (aBootCatEntries). */ 333 uint32_t cBootCatEntries; 334 /** Number of boot catalog entries we're done with (i.e. added to hIsoMaker). */ 335 uint32_t cBootCatEntriesDone; 336 /** Boot catalog entries. */ 337 RTFSISOMKCMDELTORITOENTRY aBootCatEntries[64]; 286 338 /** @} */ 287 339 … … 329 381 { "--name-setup", RTFSISOMAKERCMD_OPT_NAME_SETUP, RTGETOPT_REQ_STRING }, 330 382 { "--no-joliet", RTFSISOMAKERCMD_OPT_NO_JOLIET, RTGETOPT_REQ_NOTHING }, 383 { "--eltorito-new-entry", RTFSISOMAKERCMD_OPT_ELTORITO_NEW_ENTRY, RTGETOPT_REQ_NOTHING }, 384 { "--eltorito-add-image", RTFSISOMAKERCMD_OPT_ELTORITO_ADD_IMAGE, RTGETOPT_REQ_NOTHING }, 385 { "--eltorito-floppy-12", RTFSISOMAKERCMD_OPT_ELTORITO_FLOPPY_12, RTGETOPT_REQ_NOTHING }, 386 { "--eltorito-floppy-144", RTFSISOMAKERCMD_OPT_ELTORITO_FLOPPY_144, RTGETOPT_REQ_NOTHING }, 387 { "--eltorito-floppy-288", RTFSISOMAKERCMD_OPT_ELTORITO_FLOPPY_288, RTGETOPT_REQ_NOTHING }, 331 388 332 389 #define DD(a_szLong, a_chShort, a_fFlags) { a_szLong, a_chShort, a_fFlags }, { "-" a_szLong, a_chShort, a_fFlags } … … 338 395 { "--generic-boot", 'G', RTGETOPT_REQ_STRING }, 339 396 DD("-eltorito-boot", 'b', RTGETOPT_REQ_STRING ), 340 DD("-eltorito-alt-boot", RTFSISOMAKERCMD_OPT_ELTORITO_ ALT_BOOT,RTGETOPT_REQ_NOTHING ),397 DD("-eltorito-alt-boot", RTFSISOMAKERCMD_OPT_ELTORITO_NEW_ENTRY, RTGETOPT_REQ_NOTHING ), 341 398 DD("-eltorito-platform-id", RTFSISOMAKERCMD_OPT_ELTORITO_PLATFORM_ID, RTGETOPT_REQ_STRING ), 342 399 DD("-hard-disk-boot", RTFSISOMAKERCMD_OPT_ELTORITO_HARD_DISK_BOOT, RTGETOPT_REQ_NOTHING ), … … 1237 1294 1238 1295 1239 static int rtFsIsoMakerCmdOptEltoritoBoot(PRTFSISOMAKERCMDOPTS pOpts, const char *pszBootImage) 1240 { 1241 RT_NOREF(pOpts, pszBootImage); 1242 return VERR_NOT_IMPLEMENTED; 1243 } 1244 1245 static int rtFsIsoMakerCmdOptEltoritoPlatformId(PRTFSISOMAKERCMDOPTS pOpts, const char *pszPlatformId) 1246 { 1247 RT_NOREF(pOpts, pszPlatformId); 1248 return VERR_NOT_IMPLEMENTED; 1249 } 1250 1251 static int rtFsIsoMakerCmdOptEltoritoSetNotBootable(PRTFSISOMAKERCMDOPTS pOpts) 1252 { 1253 RT_NOREF(pOpts); 1254 return VERR_NOT_IMPLEMENTED; 1255 } 1256 1257 static int rtFsIsoMakerCmdOptEltoritoSetMediaType(PRTFSISOMAKERCMDOPTS pOpts, uint8_t bMediaType) 1258 { 1259 RT_NOREF(pOpts, bMediaType); 1260 return VERR_NOT_IMPLEMENTED; 1261 } 1262 1263 static int rtFsIsoMakerCmdOptEltoritoSetLoadSegment(PRTFSISOMAKERCMDOPTS pOpts, uint16_t uSeg) 1264 { 1265 RT_NOREF(pOpts, uSeg); 1266 return VERR_NOT_IMPLEMENTED; 1267 } 1268 1269 static int rtFsIsoMakerCmdOptEltoritoSetLoadSectorCount(PRTFSISOMAKERCMDOPTS pOpts, uint16_t cSectors) 1270 { 1271 RT_NOREF(pOpts, cSectors); 1272 return VERR_NOT_IMPLEMENTED; 1273 } 1274 1275 static int rtFsIsoMakerCmdOptEltoritoEnableBootInfoTablePatching(PRTFSISOMAKERCMDOPTS pOpts) 1276 { 1277 RT_NOREF(pOpts); 1278 return VERR_NOT_IMPLEMENTED; 1279 } 1280 1296 /** 1297 * Deals with: --boot-catalog <path-spec> 1298 * 1299 * This enters the boot catalog into the namespaces of the image. The path-spec 1300 * is similar to what rtFsIsoMakerCmdAddSomething processes, only there isn't a 1301 * source file part. 1302 * 1303 * @returns IPRT status code 1304 * @param pOpts The ISO maker command instance. 1305 * @param pszGenericBootImage The generic boot image source. 1306 */ 1281 1307 static int rtFsIsoMakerCmdOptEltoritoSetBootCatalogPath(PRTFSISOMAKERCMDOPTS pOpts, const char *pszBootCat) 1282 1308 { … … 1285 1311 } 1286 1312 1313 1314 /** 1315 * Helper that makes sure we've got a validation boot entry. 1316 * 1317 * @returns IPRT status code 1318 * @param pOpts The ISO maker command instance. 1319 */ 1320 static void rtFsIsoMakerCmdOptEltoritoEnsureValiidationEntry(PRTFSISOMAKERCMDOPTS pOpts) 1321 { 1322 if (pOpts->cBootCatEntries == 0) 1323 { 1324 pOpts->aBootCatEntries[0].enmType = RTFSISOMKCMDELTORITOENTRY::kEntryType_Validation; 1325 pOpts->aBootCatEntries[0].u.Validation.idPlatform = ISO9660_ELTORITO_PLATFORM_ID_X86; 1326 pOpts->aBootCatEntries[0].u.Validation.pszString = NULL; 1327 pOpts->cBootCatEntries = 1; 1328 } 1329 } 1330 1331 1332 /** 1333 * Helper that makes sure we've got a current boot entry. 1334 * 1335 * @returns IPRT status code 1336 * @param pOpts The ISO maker command instance. 1337 * @param fForceNew Whether to force a new entry. 1338 * @param pidxBootCat Where to return the boot catalog index. 1339 */ 1340 static int rtFsIsoMakerCmdOptEltoritoEnsureSectionEntry(PRTFSISOMAKERCMDOPTS pOpts, bool fForceNew, uint32_t *pidxBootCat) 1341 { 1342 rtFsIsoMakerCmdOptEltoritoEnsureValiidationEntry(pOpts); 1343 1344 uint32_t i = pOpts->cBootCatEntries; 1345 if (i == 2 && fForceNew) 1346 { 1347 pOpts->aBootCatEntries[i].enmType = RTFSISOMKCMDELTORITOENTRY::kEntryType_SectionHeader; 1348 pOpts->aBootCatEntries[i].u.SectionHeader.idPlatform = pOpts->aBootCatEntries[0].u.Validation.idPlatform; 1349 pOpts->aBootCatEntries[i].u.SectionHeader.pszString = NULL; 1350 pOpts->cBootCatEntries = ++i; 1351 } 1352 1353 if ( i == 1 1354 || fForceNew 1355 || pOpts->aBootCatEntries[i - 1].enmType == RTFSISOMKCMDELTORITOENTRY::kEntryType_SectionHeader) 1356 { 1357 if (i >= RT_ELEMENTS(pOpts->aBootCatEntries)) 1358 { 1359 *pidxBootCat = UINT32_MAX; 1360 return rtFsIsoMakerCmdErrorRc(pOpts, VERR_BUFFER_OVERFLOW, "Too many boot catalog entries"); 1361 } 1362 1363 pOpts->aBootCatEntries[i].enmType = i == 1 ? RTFSISOMKCMDELTORITOENTRY::kEntryType_Default 1364 : RTFSISOMKCMDELTORITOENTRY::kEntryType_Section; 1365 pOpts->aBootCatEntries[i].u.Section.pszImageNameInIso = NULL; 1366 pOpts->aBootCatEntries[i].u.Section.idImage = UINT32_MAX; 1367 pOpts->aBootCatEntries[i].u.Section.fInsertBootInfoTable = false; 1368 pOpts->aBootCatEntries[i].u.Section.fBootable = true; 1369 pOpts->aBootCatEntries[i].u.Section.bBootMediaType = ISO9660_ELTORITO_BOOT_MEDIA_TYPE_MASK; 1370 pOpts->aBootCatEntries[i].u.Section.bSystemType = 1 /*FAT12*/; 1371 pOpts->aBootCatEntries[i].u.Section.uLoadSeg = 0x7c0; 1372 pOpts->aBootCatEntries[i].u.Section.cSectorsToLoad = 4; 1373 pOpts->cBootCatEntries = ++i; 1374 } 1375 1376 *pidxBootCat = i - 1; 1377 return VINF_SUCCESS; 1378 } 1379 1380 1381 /** 1382 * Deals with: --eltorito-add-image {file-spec} 1383 * 1384 * This differs from -b|--eltorito-boot in that it takes a source file 1385 * specification identical to what rtFsIsoMakerCmdAddSomething processes instead 1386 * of a reference to a file in the image. 1387 * 1388 * This operates on the current eltorito boot catalog entry. 1389 * 1390 * @returns IPRT status code 1391 * @param pOpts The ISO maker command instance. 1392 * @param pszGenericBootImage The generic boot image source. 1393 */ 1394 static int rtFsIsoMakerCmdOptEltoritoAddImage(PRTFSISOMAKERCMDOPTS pOpts, const char *pszBootImageSpec) 1395 { 1396 RT_NOREF(pOpts, pszBootImageSpec); 1397 return VERR_NOT_IMPLEMENTED; 1398 } 1399 1400 1401 /** 1402 * Deals with: -b|--eltorito-boot {file-in-iso} 1403 * 1404 * This operates on the current eltorito boot catalog entry. 1405 * 1406 * @returns IPRT status code 1407 * @param pOpts The ISO maker command instance. 1408 * @param pszGenericBootImage The generic boot image source. 1409 */ 1410 static int rtFsIsoMakerCmdOptEltoritoBoot(PRTFSISOMAKERCMDOPTS pOpts, const char *pszBootImage) 1411 { 1412 uint32_t idxBootCat; 1413 int rc = rtFsIsoMakerCmdOptEltoritoEnsureSectionEntry(pOpts, false /*fForceNew*/, &idxBootCat); 1414 if (RT_SUCCESS(rc)) 1415 { 1416 if ( pOpts->aBootCatEntries[idxBootCat].u.Section.idImage != UINT32_MAX 1417 || pOpts->aBootCatEntries[idxBootCat].u.Section.pszImageNameInIso != NULL) 1418 return rtFsIsoMakerCmdSyntaxError(pOpts, "boot image already given for current El Torito entry (%#u)", idxBootCat); 1419 1420 uint32_t idxObj = RTFsIsoMakerGetObjIdxForPath(pOpts->hIsoMaker, RTFSISOMAKER_NAMESPACE_ALL, pszBootImage); 1421 pOpts->aBootCatEntries[idxBootCat].u.Section.idImage = idxObj; 1422 if (idxObj == UINT32_MAX) 1423 pOpts->aBootCatEntries[idxBootCat].u.Section.pszImageNameInIso = pszBootImage; 1424 } 1425 return rc; 1426 } 1427 1428 1429 /** 1430 * Deals with: --eltorito-platform-id {x86|PPC|Mac|efi|number} 1431 * 1432 * Operates on the validation entry or a section header. 1433 * 1434 * @returns IPRT status code 1435 * @param pOpts The ISO maker command instance. 1436 * @param pszPlatformId The platform ID. 1437 */ 1438 static int rtFsIsoMakerCmdOptEltoritoPlatformId(PRTFSISOMAKERCMDOPTS pOpts, const char *pszPlatformId) 1439 { 1440 /* Decode it. */ 1441 uint8_t idPlatform; 1442 if (strcmp(pszPlatformId, "x86") == 0) 1443 idPlatform = ISO9660_ELTORITO_PLATFORM_ID_X86; 1444 else if (strcmp(pszPlatformId, "PPC") == 0) 1445 idPlatform = ISO9660_ELTORITO_PLATFORM_ID_PPC; 1446 else if (strcmp(pszPlatformId, "Mac") == 0) 1447 idPlatform = ISO9660_ELTORITO_PLATFORM_ID_MAC; 1448 else if (strcmp(pszPlatformId, "efi") == 0) 1449 idPlatform = ISO9660_ELTORITO_PLATFORM_ID_EFI; 1450 else 1451 { 1452 int rc = RTStrToUInt8Full(pszPlatformId, 0, &idPlatform); 1453 if (rc != VINF_SUCCESS) 1454 return rtFsIsoMakerCmdSyntaxError(pOpts, "invalid or unknown platform ID: %s", pszPlatformId); 1455 } 1456 1457 /* If this option comes before anything related to the default entry, work 1458 on the validation entry. */ 1459 if (pOpts->cBootCatEntries <= 1) 1460 { 1461 rtFsIsoMakerCmdOptEltoritoEnsureValiidationEntry(pOpts); 1462 pOpts->aBootCatEntries[0].u.Validation.idPlatform = idPlatform; 1463 } 1464 /* Otherwise, work on the current section header, creating a new one if necessary. */ 1465 else 1466 { 1467 uint32_t idxBootCat = pOpts->cBootCatEntries - 1; 1468 if (pOpts->aBootCatEntries[idxBootCat].enmType == RTFSISOMKCMDELTORITOENTRY::kEntryType_SectionHeader) 1469 pOpts->aBootCatEntries[idxBootCat].u.SectionHeader.idPlatform = idPlatform; 1470 else 1471 { 1472 idxBootCat++; 1473 if (idxBootCat + 2 > RT_ELEMENTS(pOpts->aBootCatEntries)) 1474 return rtFsIsoMakerCmdErrorRc(pOpts, VERR_BUFFER_OVERFLOW, "Too many boot catalog entries"); 1475 1476 pOpts->aBootCatEntries[idxBootCat].enmType = RTFSISOMKCMDELTORITOENTRY::kEntryType_SectionHeader; 1477 pOpts->aBootCatEntries[idxBootCat].u.SectionHeader.idPlatform = idPlatform; 1478 pOpts->aBootCatEntries[idxBootCat].u.SectionHeader.pszString = NULL; 1479 pOpts->cBootCatEntries = idxBootCat + 1; 1480 } 1481 } 1482 return VINF_SUCCESS; 1483 } 1484 1485 1486 /** 1487 * Deals with: -no-boot 1488 * 1489 * This operates on the current eltorito boot catalog entry. 1490 * 1491 * @returns IPRT status code 1492 * @param pOpts The ISO maker command instance. 1493 */ 1494 static int rtFsIsoMakerCmdOptEltoritoSetNotBootable(PRTFSISOMAKERCMDOPTS pOpts) 1495 { 1496 uint32_t idxBootCat; 1497 int rc = rtFsIsoMakerCmdOptEltoritoEnsureSectionEntry(pOpts, false /*fForceNew*/, &idxBootCat); 1498 if (RT_SUCCESS(rc)) 1499 pOpts->aBootCatEntries[idxBootCat].u.Section.fBootable = false; 1500 return rc; 1501 } 1502 1503 1504 /** 1505 * Deals with: -hard-disk-boot, -no-emulation-boot, --eltorito-floppy-12, 1506 * --eltorito-floppy-144, --eltorito-floppy-288 1507 * 1508 * This operates on the current eltorito boot catalog entry. 1509 * 1510 * @returns IPRT status code 1511 * @param pOpts The ISO maker command instance. 1512 * @param bMediaType The media type. 1513 */ 1514 static int rtFsIsoMakerCmdOptEltoritoSetMediaType(PRTFSISOMAKERCMDOPTS pOpts, uint8_t bMediaType) 1515 { 1516 uint32_t idxBootCat; 1517 int rc = rtFsIsoMakerCmdOptEltoritoEnsureSectionEntry(pOpts, false /*fForceNew*/, &idxBootCat); 1518 if (RT_SUCCESS(rc)) 1519 pOpts->aBootCatEntries[idxBootCat].u.Section.bBootMediaType = bMediaType; 1520 return rc; 1521 } 1522 1523 1524 /** 1525 * Deals with: -boot-load-seg {seg} 1526 * 1527 * This operates on the current eltorito boot catalog entry. 1528 * 1529 * @returns IPRT status code 1530 * @param pOpts The ISO maker command instance. 1531 * @param uSeg The load segment. 1532 */ 1533 static int rtFsIsoMakerCmdOptEltoritoSetLoadSegment(PRTFSISOMAKERCMDOPTS pOpts, uint16_t uSeg) 1534 { 1535 uint32_t idxBootCat; 1536 int rc = rtFsIsoMakerCmdOptEltoritoEnsureSectionEntry(pOpts, false /*fForceNew*/, &idxBootCat); 1537 if (RT_SUCCESS(rc)) 1538 pOpts->aBootCatEntries[idxBootCat].u.Section.uLoadSeg = uSeg; 1539 return rc; 1540 } 1541 1542 1543 /** 1544 * Deals with: -boot-load-size {sectors} 1545 * 1546 * This operates on the current eltorito boot catalog entry. 1547 * 1548 * @returns IPRT status code 1549 * @param pOpts The ISO maker command instance. 1550 * @param cSectors Number of emulated sectors to load 1551 */ 1552 static int rtFsIsoMakerCmdOptEltoritoSetLoadSectorCount(PRTFSISOMAKERCMDOPTS pOpts, uint16_t cSectors) 1553 { 1554 uint32_t idxBootCat; 1555 int rc = rtFsIsoMakerCmdOptEltoritoEnsureSectionEntry(pOpts, false /*fForceNew*/, &idxBootCat); 1556 if (RT_SUCCESS(rc)) 1557 pOpts->aBootCatEntries[idxBootCat].u.Section.cSectorsToLoad = cSectors; 1558 return rc; 1559 } 1560 1561 1562 /** 1563 * Deals with: -boot-info-table 1564 * 1565 * This operates on the current eltorito boot catalog entry. 1566 * 1567 * @returns IPRT status code 1568 * @param pOpts The ISO maker command instance. 1569 */ 1570 static int rtFsIsoMakerCmdOptEltoritoEnableBootInfoTablePatching(PRTFSISOMAKERCMDOPTS pOpts) 1571 { 1572 uint32_t idxBootCat; 1573 int rc = rtFsIsoMakerCmdOptEltoritoEnsureSectionEntry(pOpts, false /*fForceNew*/, &idxBootCat); 1574 if (RT_SUCCESS(rc)) 1575 pOpts->aBootCatEntries[idxBootCat].u.Section.fInsertBootInfoTable = true; 1576 return rc; 1577 } 1578 1579 1580 /** 1581 * Deals with: --eltorito-new-entry, --eltorito-alt-boot 1582 * 1583 * This operates on the current eltorito boot catalog entry. 1584 * 1585 * @returns IPRT status code 1586 * @param pOpts The ISO maker command instance. 1587 */ 1588 static int rtFsIsoMakerCmdOptEltoritoNewEntry(PRTFSISOMAKERCMDOPTS pOpts) 1589 { 1590 uint32_t idxBootCat; 1591 return rtFsIsoMakerCmdOptEltoritoEnsureSectionEntry(pOpts, true /*fForceNew*/, &idxBootCat); 1592 } 1287 1593 1288 1594 … … 1315 1621 Opts.afNameSpecifiers[0] = RTFSISOMAKERCMDNAME_MAJOR_MASK; 1316 1622 Opts.fDstNamespaces = RTFSISOMAKERCMDNAME_MAJOR_MASK; 1317 Opts.idEltoritoEntry = UINT32_MAX;1318 1623 if (phVfsFile) 1319 1624 *phVfsFile = NIL_RTVFSFILE; … … 1371 1676 break; 1372 1677 1678 case RTFSISOMAKERCMD_OPT_ELTORITO_ADD_IMAGE: 1679 rc = rtFsIsoMakerCmdOptEltoritoAddImage(&Opts, ValueUnion.psz); 1680 break; 1681 1373 1682 case 'b': /* --eltorito-boot <boot.img> */ 1374 1683 rc = rtFsIsoMakerCmdOptEltoritoBoot(&Opts, ValueUnion.psz); 1375 1684 break; 1376 1685 1377 case RTFSISOMAKERCMD_OPT_ELTORITO_ALT_BOOT: 1378 Opts.idEltoritoEntry = UINT32_MAX; 1379 break; 1380 1686 case RTFSISOMAKERCMD_OPT_ELTORITO_NEW_ENTRY: 1687 rc = rtFsIsoMakerCmdOptEltoritoNewEntry(&Opts); 1688 break; 1381 1689 1382 1690 case RTFSISOMAKERCMD_OPT_ELTORITO_PLATFORM_ID:
Note:
See TracChangeset
for help on using the changeset viewer.