Browse Source

Experimental macros Libisofs_protective_msdos_plus_boot_dummY and

Libisofs_pmpbd_on_lba0 to test augmentation of GRUB2 protective msdos label.
release-1.5.4.branch
Thomas Schmitt 5 years ago
parent
commit
9e01d3654e
  1. 54
      libisofs/system_area.c

54
libisofs/system_area.c

@ -1800,6 +1800,10 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
if (ret != ISO_SUCCESS) /* error should never happen */
return ISO_ASSERT_FAILURE;
risk_of_ee = 1;
} else if (t->gpt_req_count > 0) {
/* >>> ??? change first partition type to 0xee */;
}
} else if (do_isohybrid) {
/* Patch externally provided system area as isohybrid MBR */
@ -1862,6 +1866,9 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
return ISO_ASSERT_FAILURE;
risk_of_ee = 1;
if (t->opts->appended_as_gpt && t->have_appended_partitions) {
/* >>> ??? Do this in any case of t->gpt_req_count > ? */;
/* Re-write partion entry 1 : protective MBR for GPT */
part_type = 0xee;
risk_of_ee = 1;
@ -1941,6 +1948,9 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
}
/* Prevent partition type 0xee if no GPT emerged */
/* >>> check for GPT magic number at byte 512 ff. */;
if (sa_type == 0 && ((t->system_area_options & 3) || risk_of_ee) &&
t->gpt_req_count == 0) {
for (i = 0; i < 4; i++) {
@ -1953,6 +1963,50 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
}
}
#ifdef Libisofs_protective_msdos_plus_boot_dummY
if (sa_type == 0 && (t->system_area_options & 3) == 1 &&
buf[446 + 4] == 0xee && buf[446] == 0x00) {
for (i = 446 + 16 ; i < 510; i++)
if(buf[i])
break;
if (i >= 510) {
/* Add a dummy partition of type 0 with boot flag */
#ifdef Libisofs_pmpbd_on_lba0
/* Start LBA 0, block count 1 */
buf[446 + 16 + 0] = 0x80; /* bootable */
buf[446 + 16 + 1] = 0x00; /* start head */
buf[446 + 16 + 2] = 0x01; /* start sector */
buf[446 + 16 + 3] = 0x00; /* start cylinder */
buf[446 + 16 + 4] = 0x00; /* partition type */
buf[446 + 16 + 5] = 0x00; /* end head */
buf[446 + 16 + 6] = 0x01; /* last sector */
buf[446 + 16 + 7] = 0x00; /* end cylinder */
buf[446 + 16 + 8] = 0x00; /* start LBA */
buf[446 + 16 + 9] = 0x00;
buf[446 + 16 + 10] = 0x00;
buf[446 + 16 + 11] = 0x00;
buf[446 + 16 + 12] = 0x01; /* block count */
buf[446 + 16 + 13] = 0x00;
buf[446 + 16 + 14] = 0x00;
buf[446 + 16 + 15] = 0x00;
#else
/* copy partition 1 to 2, set boot flag and type 0x00 */
memcpy(buf + 446 + 16, buf + 446, 16);
buf[446 + 16 + 0] = 0x80; /* bootable */
buf[446 + 16 + 4] = 0x00; /* partition type */
#endif /* ! Libisofs_pmpbd_on_lba0 */
}
}
#endif /* Libisofs_protective_msdos_plus_boot_dummY */
return ISO_SUCCESS;
}

Loading…
Cancel
Save