⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eltorito.c

📁 刻录光盘的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    {	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 + -