📄 eltorito.c
字号:
{ checksum += (unsigned int)checksum_ptr[i]; checksum += ((unsigned int)checksum_ptr[i+1])*256; } /* * now find out the real checksum */ checksum = -checksum; set_721(valid_desc.cksum, (unsigned int) checksum); /* * now make the initial/default entry for boot catalog */ memset(&default_desc, 0, sizeof(default_desc)); default_desc.boot_id[0] = (char)not_bootable ? EL_TORITO_NOT_BOOTABLE : EL_TORITO_BOOTABLE; /* * use default BIOS loadpnt */ set_721(default_desc.loadseg, load_addr); /* * figure out size of boot image in 512-byte sectors. However, * round up to the nearest integral CD (2048-byte) sector. * This is only used for no-emulation booting. */ nsectors = load_size ? load_size : ((de->size + 2047)/2048) * 4; fprintf(stderr, "\nSize of boot image is %d sectors -> ", nsectors); if (hard_disk_boot) { /* * sanity test hard disk boot image */ default_desc.boot_media[0] = EL_TORITO_MEDIA_HD; fprintf(stderr, "Emulating a hard disk\n"); /* * read MBR */ bootmbr = open(de->whole_name, O_RDONLY | O_BINARY); if (bootmbr == -1) {#ifdef USE_LIBSCHILY comerr("Error opening boot image '%s' for read.\n", de->whole_name);#else fprintf(stderr,"Error opening boot image '%s' for read.\n", de->whole_name); perror(""); exit(1);#endif } if(read(bootmbr, &disk_mbr, sizeof(disk_mbr)) != sizeof(disk_mbr)) {#ifdef USE_LIBSCHILY comerr("Error reading MBR from boot image '%s'.\n", de->whole_name);#else fprintf(stderr,"Error reading MBR from boot image '%s'.\n", de->whole_name); exit(1);#endif } close(bootmbr); if(la_to_u_2_byte(disk_mbr.magic) != MBR_MAGIC) {#ifdef USE_LIBSCHILY errmsgno(EX_BAD, "Warning: boot image '%s' MBR is not a boot sector.\n", de->whole_name);#else fprintf(stderr, "Warning: boot image '%s' MBR is not a boot sector.\n", de->whole_name);#endif } /* * find partition type */ default_desc.sys_type[0] = PARTITION_UNUSED; for(i = 0; i < PARTITION_COUNT; ++i) { int s_cyl_sec; int e_cyl_sec; s_cyl_sec = la_to_u_2_byte(disk_mbr.partition[i].s_cyl_sec); e_cyl_sec = la_to_u_2_byte(disk_mbr.partition[i].e_cyl_sec); if(disk_mbr.partition[i].type != PARTITION_UNUSED) { if(default_desc.sys_type[0] != PARTITION_UNUSED) {#ifdef USE_LIBSCHILY comerrno(EX_BAD, "Boot image '%s' has multiple partitions.\n", de->whole_name);#else fprintf(stderr, "Boot image '%s' has multiple partitions.\n", de->whole_name); exit(1);#endif } default_desc.sys_type[0] = disk_mbr.partition[i].type; /* * a few simple sanity warnings */ if(!not_bootable && disk_mbr.partition[i].status != PARTITION_ACTIVE) { fprintf(stderr, "Warning: partition not marked active.\n"); } if(MBR_CYLINDER(s_cyl_sec) != 0 || disk_mbr.partition[i].s_head != 1 || MBR_SECTOR(s_cyl_sec != 1)) { fprintf(stderr, "Warning: partition does not start at 0/1/1.\n"); } geosec = (MBR_CYLINDER(e_cyl_sec) + 1) * (disk_mbr.partition[i].e_head + 1) * MBR_SECTOR(e_cyl_sec); if(geosec != nsectors) { fprintf(stderr, "Warning: image size does not match geometry (%d)\n", geosec); }#ifdef DEBUG_TORITO fprintf(stderr, "Partition start %u/%u/%u\n", MBR_CYLINDER(s_cyl_sec), disk_mbr.partition[i].s_head, MBR_SECTOR(s_cyl_sec)); fprintf(stderr, "Partition end %u/%u/%u\n", MBR_CYLINDER(e_cyl_sec), disk_mbr.partition[i].e_head, MBR_SECTOR(e_cyl_sec));#endif } } if(default_desc.sys_type[0] == PARTITION_UNUSED) {#ifdef USE_LIBSCHILY comerrno(EX_BAD, "Boot image '%s' has no partitions.\n", de->whole_name);#else fprintf(stderr, "Boot image '%s' has no partitions.\n", de->whole_name); exit(1);#endif }#ifdef DEBUG_TORITO fprintf(stderr, "Partition type %u\n", default_desc.sys_type[0]);#endif /* * load single boot sector, in this case the MBR */ nsectors = 1; } else if(no_emul_boot) { /* * no emulation is a simple image boot of all the sectors in the boot image */ default_desc.boot_media[0] = EL_TORITO_MEDIA_NOEMUL; fprintf(stderr,"No emulation\n"); } else { /* * choose size of emulated floppy based on boot image size */ if (nsectors == 2880 ) { default_desc.boot_media[0] = EL_TORITO_MEDIA_144FLOP; fprintf(stderr, "Emulating a 1.44 meg floppy\n"); } else if (nsectors == 5760 ) { default_desc.boot_media[0] = EL_TORITO_MEDIA_288FLOP; fprintf(stderr,"Emulating a 2.88 meg floppy\n"); } else if (nsectors == 2400 ) { default_desc.boot_media[0] = EL_TORITO_MEDIA_12FLOP; fprintf(stderr,"Emulating a 1.2 meg floppy\n"); } else {#ifdef USE_LIBSCHILY comerrno(EX_BAD, "Error - boot image '%s' is not the an allowable size.\n", de->whole_name);#else fprintf(stderr,"Error - boot image '%s' is not the an allowable size.\n", de->whole_name); exit(1);#endif } /* * load single boot sector for floppies */ nsectors = 1; } /* * fill in boot image details */#ifdef DEBUG_TORITO fprintf(stderr,"Boot %u sectors\n",nsectors); fprintf(stderr,"Extent of boot images is %d\n",get_733(de->isorec.extent));#endif set_721(default_desc.nsect, (unsigned int) nsectors ); set_731(default_desc.bootoff, (unsigned int) get_733(de->isorec.extent)); /* * now write it to the virtual boot catalog */ memcpy(de2->table, &valid_desc, 32); memcpy(de2->table + 32, &default_desc, 32); /* * If the user has asked for it, patch the boot image */ if ( boot_info_table ) { int bootimage; unsigned int bi_checksum, total_len; static char csum_buffer[2048]; int len; struct mkisofs_boot_info bi_table; bootimage = open(de->whole_name, O_RDWR | O_BINARY); if ( bootimage == -1 ) {#ifdef USE_LIBSCHILY comerr("Error opening boot image file '%s' for update.\n", de->whole_name);#else fprintf(stderr,"Error opening boot image file '%s' for update.\n", de->whole_name); perror(""); exit(1);#endif } /* Compute checksum of boot image, sans 64 bytes */ total_len = 0; bi_checksum = 0; while ( (len = read(bootimage, csum_buffer, 2048)) > 0 ) { if ( total_len & 3 ) {#ifdef USE_LIBSCHILY comerrno(EX_BAD, "Odd alignment at non-end-of-file in boot image '%s'.\n", de->whole_name);#else fprintf(stderr, "Odd alignment at non-end-of-file in boot image '%s'.\n", de->whole_name); exit(1);#endif } if ( total_len < 64 ) memset(csum_buffer, 0, 64-total_len); if ( len < 2048 ) memset(csum_buffer+len, 0, 2048-len); for ( i = 0 ; i < 2048 ; i += 4 ) bi_checksum += get_731(&csum_buffer[i]); total_len += len; } if ( total_len != de->size ) {#ifdef USE_LIBSCHILY comerrno(EX_BAD, "Boot image file '%s' changed underneath us!\n", de->whole_name);#else fprintf(stderr, "Boot image file '%s' changed underneath us!\n", de->whole_name); exit(1);#endif } /* End of file, set position to byte 8 */ lseek(bootimage, 8, SEEK_SET); memset(&bi_table, 0, sizeof(bi_table)); /* Is it always safe to assume PVD is at session_start+16? */ set_731(bi_table.bi_pvd, session_start+16); set_731(bi_table.bi_file, de->starting_block); set_731(bi_table.bi_length, de->size); set_731(bi_table.bi_csum, bi_checksum); write(bootimage, &bi_table, sizeof(bi_table)); close(bootimage); }} /* get_torito_desc(... *//* * Function to write the EVD for the disc. */static int FDECL1(tvd_write, FILE *, outfile){ /* * check the boot image is not NULL */ if(!boot_image) {#ifdef USE_LIBSCHILY comerrno(EX_BAD, "No boot image specified.\n");#else fprintf(stderr,"No boot image specified.\n"); exit(1);#endif } /* * Next we write out the boot volume descriptor for the disc */ get_torito_desc(&gboot_desc); xfwrite(&gboot_desc, 1, SECTOR_SIZE, outfile); last_extent_written ++; return 0;}struct output_fragment torito_desc = {NULL, oneblock_size, NULL, tvd_write};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -