📄 boot-parameters.c
字号:
/***************************************** Copyright (c) 2001-2002 Sigma Designs, Inc. All Rights Reserved Proprietary and Confidential *****************************************//* This is file is part of the Jasper DVD boot loader *//* * boot-parameters.c * * Utility to modify boot-cd ISO image parameters * */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <fcntl.h>//#include "config.h"#define ELTORITO_PLATFORM_ID 85static unsigned char sector[2048];static unsigned short calc_check(unsigned short *buf){ int i; unsigned short sum=0; for(i=0;i<16;i++) { sum+=buf[i]; } return sum;}int main(int argc, char *argv[]){ int fd; unsigned long cat_addr; // boot catalog address if(argc<2) { fprintf(stderr,"Usage: %s <image.iso>\n", argv[0]); exit(1); } fd=open(argv[1],O_RDWR); if(fd==-1) { perror("Cannot open ISO image"); exit(1); } // Seek to boot record lseek(fd, 2048*17, SEEK_SET); if(read(fd, sector, 2048)!=2048){ perror("Couldnt read fully the boot sector"); exit(1); } // test boot sector if(strcmp(sector+7,"EL TORITO SPECIFICATION")!=0) { printf("Not an EL TORITO boot image (%s)\n",sector+7); exit(1); } // Get the boot catalog address // - Warning cast doesnt respect aligment cat_addr = *(unsigned long *)(sector+0x47); printf("Boot catalog address: sector %ld (abs %lx)\n", cat_addr, cat_addr*2048); // Seek to boot catalog lseek(fd, cat_addr*2048, SEEK_SET); if(read(fd, sector, 2048)!=2048){ perror("Couldnt read fully the boot catalog"); exit(1); } // check validation entry if(sector[0]!=1) { printf("Validation Entry invalid %d instead of 1\n",sector[0]); exit(1); } printf("Current platform ID: %d\n",sector[1]); printf("Current ID string : %s\n",sector+4); printf("Current checksum word: %04x (sum=%04x)\n", *(unsigned short *)(sector+0x1c), calc_check((unsigned short *)sector)); #ifdef ELTORITO_PLATFORM_ID sector[1]=ELTORITO_PLATFORM_ID; printf("Changed platform ID to %d\n",ELTORITO_PLATFORM_ID);#endif#ifdef ELTORITO_ID_STRING memset(sector+4, 0, ELTORITO_ID_STRING_MAX_LENGTH); strncpy(sector+4, ELTORITO_ID_STRING, ELTORITO_ID_STRING_MAX_LENGTH); (sector+4)[ELTORITO_ID_STRING_MAX_LENGTH-1]=0; printf("Changed ID string to %s\n",sector+4);#endif *(unsigned short *)(sector+0x1c) = 0; *(unsigned short *)(sector+0x1c) = 0 - calc_check((unsigned short *)sector); printf("New checksum word: %04x (sum=%04x)\n", *(unsigned short *)(sector+0x1c), calc_check((unsigned short *)sector)); // check initial entry if(sector[0x20]!=0x88) { printf("Initial/Default entry not bootable.. abort\n"); exit(1); }#ifdef ELTORITO_EMULATION_TYPE if(sector[0x21]!=ELTORITO_EMULATION_TYPE) { printf("Initial/Default entry emulation type set to %d, resetting to %d\n", sector[0x21], ELTORITO_EMULATION_TYPE); sector[0x21]=ELTORITO_EMULATION_TYPE; }#endif lseek(fd, cat_addr*2048, SEEK_SET); write(fd, sector, 2048); close(fd); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -