home *** CD-ROM | disk | FTP | other *** search
- #define _PART_C
-
- #include "part.h"
-
- #define TMP_SZ 100
-
- struct event ev;
- int hd, ext_level, recursive_opt;
- struct part_long pseudo_part;
- struct mbr mbr, mbr2, mbr_orig;
- char tmp[TMP_SZ], tmp2[TMP_SZ];
-
- extern struct mbr IPL, EXT, STD_IPL;
- extern unsigned int IPL_SELECTOR, ENTRY_S, ENTRY_V;
-
-
- void main(int argc, char **argv)
- {
- int i;
- hd=0x80;
- messages_eng();
-
- argc--;
- argv++;
-
- if( argc>=2 && (argv[0][0]=='-' || argv[0][0]=='/')
- && (argv[0][1]=='L' || argv[0][1]=='l') )
- {
- if( strcmp(argv[1],"US")==0 ) messages_eng();
- /* if( strcmp(argv[1],"xx")==0 ) messages_xxx(); */
- else usage();
- argc-=2;
- argv+=2;
- }
-
- if( argc>=2 && (argv[0][0]=='-' || argv[0][0]=='/')
- && (argv[0][1]=='D' || argv[0][1]=='d') )
- {
- i=atoi(argv[1]);
- if( i<1 || i>16 ) usage();
- hd+=i-1;
- argc-=2;
- argv+=2;
- }
-
- conio_init();
- diskio_init();
-
- if( detected_os==SYS_WIN_NT )
- {
- fprintf(stderr,"This program will not run under Windows NT.\n");
- exit(1);
- }
-
- if( argc==0 )
- {
- interactive=1;
- start_gui();
- }
- else
- {
- interactive=0;
- command_line(argc,argv);
- }
-
- diskio_exit();
- conio_exit();
- exit(0);
- }/* main */
-
-
- void start_gui(void)
- {
- struct disk_info dinfo;
-
- border_window( Yellow+BakBlue, 1, 1, 80, 25, Border22f );
- write_string( BrWhite+BakBlue, 4, 2, HEADER_MAIN );
- write_string( Yellow+BakBlue, 3, 3, "────────────────────────────────────────────────────────────────────────────" );
-
- write_string( Yellow+BakBlue, 4, 24,"F1");
- write_string( BrCyan+BakBlue, 6, 24, MENU_HELP );
-
- write_string( Yellow+BakBlue, 15, 24,"F2");
- write_string( BrCyan+BakBlue, 17, 24, MENU_SAVE );
-
- write_string( Yellow+BakBlue, 34, 24,"F3");
- write_string( BrCyan+BakBlue, 36, 24, MENU_UNDO );
-
- write_string( Yellow+BakBlue, 45, 24,"F4");
- write_string( BrCyan+BakBlue, 47, 24, MENU_MODE );
-
- write_string( Yellow+BakBlue, 67, 24,"ESC");
- write_string( BrCyan+BakBlue, 70, 24, MENU_QUIT );
-
- write_string( Yellow+BakBlue, 11, 19,"H)");
- write_string( BrCyan+BakBlue, 13, 19, MENU_HIDE );
- write_string( Yellow+BakBlue, 11, 20,"F)");
- write_string( BrCyan+BakBlue, 13, 20, MENU_FORMAT );
- write_string( Yellow+BakBlue, 11, 21,"V)");
- write_string( BrCyan+BakBlue, 13, 21, MENU_VERIFY );
-
- write_string( Yellow+BakBlue, 42, 19,"S)");
- write_string( BrCyan+BakBlue, 44, 19, MENU_SAVE_FILE );
- write_string( Yellow+BakBlue, 42, 20,"L)");
- write_string( BrCyan+BakBlue, 44, 20, MENU_LOAD_FILE );
- write_string( Yellow+BakBlue, 42, 21,"X)");
- write_string( BrCyan+BakBlue, 44, 21, MENU_INST_CODE );
-
- setup_mbr(&dinfo,0);
-
- clear_window( White+BakBlack, 1, 1, 80, 25 );
- move_cursor(1,1);
- }/* start_gui */
-
-
- void write_mbr_menu(void)
- {
- write_string( Yellow+BakBlue, 11, 16,"I)");
- write_string( BrCyan+BakBlue, 13, 16, MENU_INSTALL );
- write_string( Yellow+BakBlue, 50, 16,"w");
- write_string( Yellow+BakBlue, 11, 17,"U)");
- write_string( BrCyan+BakBlue, 13, 17, MENU_UNINSTALL );
-
- write_string( Yellow+BakBlue, 56, 24,"F5");
- write_string( BrCyan+BakBlue, 58, 24, MENU_DISK );
- }/* write_mbr_menu */
-
-
- void write_embr_menu(void)
- {
- write_string( Yellow+BakBlue, 11, 16,"I)");
- write_string( BrCyan+BakBlue, 13, 16, MENU_INST_EXT );
-
- write_string( Yellow+BakBlue, 11, 17,"M)");
- write_string( BrCyan+BakBlue, 13, 17, MENU_MOVE_PRI );
-
- write_string( Brown+BakBlue, 56, 24,"F5");
- write_string( Cyan+BakBlue, 58, 24, MENU_DISK );
- }/* write_embr_menu */
-
-
- int setup_mbr(struct disk_info *dinfo, struct part_long *p)
- {
- int row, field, new_row, new_field;
- int i, changed, extended, num_disks, valid;
- int force_redraw, force_redraw_header, force_redraw_menu;
- int force_reload, force_unpack, force_recalculate, force_initial_test;
- char *hint=0, *mesg=0, *warn=0, *help_target=0;
- unsigned long *edit_target, edit_limit;
-
- struct disk_addr daddr;
- struct part_long part[4];
-
- static struct field_desc
- {
- unsigned long edit_limit;
- int pos;
- int len;
- }*fd,
- fd_chs[8]={ {0},{0}, {1023,37,4}, {255,42,4}, {63,47,4},
- {1023,53,4}, {255,58,4}, {63,63,4} },
- fd_lba[4]={ {0},{0}, {16777215,36,9},{16777215,46,10} };
-
- ext_level++;
-
- if( p==0 )
- {
- extended=0;
- ext_level=0;
- p=&pseudo_part;
- }
- else
- {
- extended=1;
- }
-
- row=0;
- field=0;
- new_row=0;
- new_field=0;
- force_reload=1;
- force_unpack=1;
- force_redraw=1;
- force_redraw_menu=1;
- force_recalculate=0;
- force_redraw_header=1;
- force_initial_test=0;
-
- changed=0;
-
- while(1)
- {
- help_target=0;
-
- if( extended==1 ) help_target="extended";
-
- if( force_redraw_menu==1 )
- {
- if( extended==0 ) write_mbr_menu();
- else write_embr_menu();
- force_redraw_menu=0;
- }
-
- if( force_reload==1 ) /* Read disk parameters and MBR from (hd) */
- {
- if( extended==0 )
- {
- write_string(BrCyan+BakBlue,4,4, HEADER_GET );
-
- write_int(BrWhite+BakBlue,14,4,2, hd-0x80+1 );
-
- if( (num_disks=get_disk_info(hd,dinfo))==-1 )
- {
- show_error(ERROR_DISK_INFO);
- if( hd!=0x80 ) { hd=0x80; force_reload=1; continue; }
- break;
- }
-
- p->container_base=0;
-
- p->start_cyl=0; p->end_cyl=dinfo->num_cyls-1;
- p->start_head=0; p->end_head=dinfo->num_heads-1;
- p->start_sect=1; p->end_sect=dinfo->num_sects;
-
- p->rel_sect=0;
- p->num_sect=dinfo->total_sects;
- }
-
- daddr.disk=dinfo->disk;
- daddr.cyl =p->start_cyl;
- daddr.head=p->start_head;
- daddr.sect=p->start_sect;
-
- clear_window(Yellow+BakBlue,4,9,74,7);
- write_string(Yellow+BakBlue,25,10,HEADER_READ);
-
- if( disk_read(&daddr,&mbr,1)==-1 )
- {
- show_error(ERROR_READ_MBR);
- if( extended==0 && hd!=0x80 ) { hd=0x80; force_reload=1; continue; }
- break;
- }
-
- memmove(&mbr_orig,&mbr,sizeof(struct mbr));
-
- force_redraw_header=1;
- force_unpack=1;
- force_reload=0;
- }
-
- if( force_redraw_header==1 )
- {
- clear_window(BrCyan+BakBlue,4,4,76,4);
-
- if( extended==0 )
- {
- write_string(BrCyan+BakBlue,4,4, HEADER_HD );
- write_int(BrWhite+BakBlue,14,4,2,dinfo->disk-0x80+1 );
- }
- else
- {
- write_string(BrCyan+BakBlue,4,4, HEADER_EXT );
- write_string(BrCyan+BakBlue,4,5, HEADER_EXT2 );
- write_int(BrWhite+BakBlue,14,5,2, ext_level );
- }
-
- if( mode==MODE_CHS )
- {
- write_string(BrCyan+BakBlue,18,4,HEADER_CHS );
- write_int(BrWhite+BakBlue,19,4,4,p->num_sect/2048);
- write_int(BrWhite+BakBlue,34,4,4,p->end_cyl-p->start_cyl+1);
- write_int(BrWhite+BakBlue,52,4,3,dinfo->num_heads);
- write_int(BrWhite+BakBlue,65,4,3,dinfo->num_sects);
- write_string(BrCyan+BakBlue,4,6, HEADER_CHS2 );
- write_string(BrCyan+BakBlue,4,7, HEADER_CHS3 );
- }
- else /* mode==MODE_LBA */
- {
- write_string(BrCyan+BakBlue,18,4,HEADER_LBA );
- write_int(BrWhite+BakBlue,19,4,4,p->num_sect/2048);
- sprintf(tmp2,"%10s",sprintf_long(tmp,p->num_sect));
- write_string(BrWhite+BakBlue,57,4,tmp2);
- write_string(BrCyan+BakBlue,4,6, HEADER_LBA2 );
- write_string(BrCyan+BakBlue,4,7, HEADER_LBA3 );
- }
- force_redraw_header=0;
- force_redraw=1;
- }
-
- if( force_unpack==1 ) /* Unpack mbr records into easy to use structures */
- {
- for( i=0 ; i<4 ; i++ )
- {
- unpack_part( &mbr.part_rec[i], &part[i] );
- part[i].num=i;
- part[i].daddr=&daddr;
- part[i].container_base=p->container_base+p->rel_sect;
- }
- force_initial_test=1;
- force_redraw=1;
- force_unpack=0;
- }
-
- if( force_recalculate==1 || force_initial_test==1 )
- {
- if( force_initial_test==1 )
- {
- if( !(valid=validate_table(dinfo,part,p,-1)) )
- warn=WARN_CONFLICT;
- }
- else
- valid=validate_table(dinfo,part,p,row);
-
- force_initial_test=0;
- force_recalculate=0;
- force_redraw=1;
- }
-
- if( row!=new_row || field!=new_field || force_redraw ) /* Redraw table */
- {
- for( i=0 ; i<4 ; i++ )
- {
- sprintf_partrec(tmp, &part[i]); tmp[76]=0;
- if( part[i].empty || part[i].valid )
- write_string(BrWhite+BakBlue,3,i+9,tmp);
- else
- write_string(BrRed+BakBlue,3,i+9,tmp);
- }
- row=new_row;
- field=new_field;
- force_redraw=0;
- }
-
- for( i=0 ; i<4 ; i++ ) pack_part( &part[i], &mbr.part_rec[i] );
-
- if( memcmp(&mbr,&mbr_orig,sizeof(struct mbr))!=0 )
- { changed=1; write_string( Blink+Yellow+BakBlue, 15, 24,"F2"); }
- else { changed=0; write_string( Yellow+BakBlue, 15, 24,"F2"); }
-
- if( field==0 ) /* Active: Yes/No */
- {
- write_string(BrWhite,7,row+9,(part[row].active)?" Yes ":" No ");
- move_cursor(8,row+9);
- hint=HINT_ACTIVE;
- }
- else if( field==1 ) /* Partition Type */
- {
- write_string(BrWhite,13,row+9, sprintf_os_name(tmp,&part[row]) );
- move_cursor(13,row+9);
- hint=HINT_SYSTYPE;
- }
- else if( mode==MODE_CHS && field==2 ) edit_target=&part[row].start_cyl;
- else if( mode==MODE_CHS && field==3 ) edit_target=&part[row].start_head;
- else if( mode==MODE_CHS && field==4 ) edit_target=&part[row].start_sect;
- else if( mode==MODE_CHS && field==5 ) edit_target=&part[row].end_cyl;
- else if( mode==MODE_CHS && field==6 ) edit_target=&part[row].end_head;
- else if( mode==MODE_CHS && field==7 ) edit_target=&part[row].end_sect;
- else if( mode==MODE_LBA && field==2 ) edit_target=&part[row].rel_sect;
- else if( mode==MODE_LBA && field==3 ) edit_target=&part[row].num_sect;
-
- if( field>1 )
- {
- fd = ( mode==MODE_CHS ) ? &fd_chs[field] : &fd_lba[field];
- edit_limit = fd->edit_limit;
- write_int( BrWhite, fd->pos, row+9, fd->len, *edit_target );
- move_cursor( fd->pos+fd->len-1, row+9 );
-
- if( mode==MODE_CHS )
- sprintf(tmp, HINT_LOC_CHS, p->start_cyl, p->end_cyl, dinfo->num_heads-1, dinfo->num_sects );
- else
- sprintf(tmp, HINT_LOC_LBA, p->num_sect-1, p->num_sect-1 );
-
- hint=tmp;
- help_target="create";
- }
-
- clear_window(BakBlue,4,14,75,1);
-
- if( warn!=0 ) write_string(BrRed+BakWhite,4,14,warn);
- else if( mesg!=0 ) write_string(Black+BakWhite,4,14,mesg);
- else if( hint!=0 ) write_string(Yellow+BakBlue,4,14,hint);
-
- if( !valid ) help_target="conflict";
-
- get_event( &ev, EV_KEY );
-
- hint=mesg=warn=0;
-
- if( ev.key==27 ) /* ESC - Quit */
- {
- if( !changed ) break;
- mesg=MESG_NOT_SAVED;
- continue;
- }
-
- if( field==0 || field==1 ) /* Active: Yes/No */
- {
- if( ev.key=='Y' || ev.key=='y' || ev.key==' ' && part[row].active==0 )
- {
- for( i=0 ; i<4 ; i++ )
- part[i].active=0;
- part[row].active=1;
- force_redraw=1;
- continue;
- }
- if( ev.key=='N' || ev.key=='n' || ev.key==' ' && part[row].active==1 )
- {
- part[row].active=0;
- continue;
- }
- /* Partition Type */
- if( ev.scan==0x52E0 || ev.scan==0x5200 ) /* Insert */
- {
- int part_was_empty=part[row].empty;
-
- select_system_type(&part[row]);
-
- if( part_was_empty && part[row].os_num!=0 )
- {
- if( mode==MODE_CHS )
- {
- part[row].start_cyl = part[row].end_cyl = p->start_cyl;
- part[row].start_head=0; part[row].end_head=dinfo->num_heads-1;
- part[row].start_sect=1; part[row].end_sect=dinfo->num_sects;
- }
- else
- {
- part[row].num_sect=1;
- }
- force_recalculate=1;
- }
- force_redraw=1;
- continue;
- }
- }
- /* Now it must be field >= 2 - long integers */
- /* Back Space or Delete */
- else if( ev.key == 8 || ev.scan==0x53E0 || ev.scan==0x5300 )
- {
- *edit_target/=10;
- force_recalculate=1;
- continue;
- }
- else if( ev.key>='0' && ev.key<='9' )
- {
- int x=ev.key-'0';
-
- if( edit_limit>x && (edit_limit-x)/10>=*edit_target )
- {
- *edit_target = *edit_target*10 + x;
- force_recalculate=1;
- }
-
- continue;
- }
- else if( mode==MODE_CHS && ev.key=='+' )
- {
- if( *edit_target<edit_limit )
- {
- (*edit_target)++;
- force_recalculate=1;
- }
- continue;
- }
- else if( mode==MODE_CHS && ev.key=='-' )
- {
- if( *edit_target>0 )
- {
- (*edit_target)--;
- force_recalculate=1;
- }
- continue;
- }
- else if( mode==MODE_LBA && ev.key=='+' )
- {
- unsigned long x=*edit_target-*edit_target%dinfo->num_sects;
-
- if( edit_limit>dinfo->num_sects && edit_limit-dinfo->num_sects>x )
- {
- *edit_target=x+dinfo->num_sects;
- force_recalculate=1;
- }
-
- continue;
- }
- else if( mode==MODE_LBA && ev.key=='-' )
- {
- if( *edit_target>0 )
- {
- (*edit_target)--;
- *edit_target-=*edit_target%dinfo->num_sects;
- force_recalculate=1;
- }
-
- continue;
- }
-
-
- if( ev.scan==0x50E0 || ev.scan==0x5000 ) /* down */
- {
- if( row<3 ) new_row=row+1;
- }
- else if( ev.scan==0x48E0 || ev.scan==0x4800 ) /* up */
- {
- if( row>0 ) new_row=row-1;
- }
- else if( ev.scan==0x51E0 || ev.scan==0x5100 || /* PgDn/End */
- ev.scan==0x4FE0 || ev.scan==0x4F00 )
- {
- if( row<3 ) new_row=3;
- }
- else if( ev.scan==0x49E0 || ev.scan==0x4900 || /* PgUp/Home */
- ev.scan==0x47E0 || ev.scan==0x4700 )
- {
- if( row>0 ) new_row=0;
- }
- else if( ev.scan==0x4BE0 || ev.scan==0x4B00 ) /* left */
- {
- if( field>0 ) new_field=field-1;
- }
- else if( ev.scan==0x4DE0 || ev.scan==0x4D00 ) /* right */
- {
- if( mode==MODE_CHS && field<7 ) new_field=field+1;
- if( mode==MODE_LBA && field<3 ) new_field=field+1;
- }
- else if( ev.scan==0x53E0 || ev.scan==0x5300 ) /* Delete */
- {
- part[row].empty=1;
- part[row].valid=0;
- part[row].active=0;
- part[row].os_id=0;
- part[row].os_num=0;
- part[row].start_cyl=0; part[row].end_cyl=0;
- part[row].start_head=0; part[row].end_head=0;
- part[row].start_sect=0; part[row].end_sect=0;
- part[row].rel_sect=0;
- part[row].num_sect=0;
- force_recalculate=1;
- force_redraw=1;
- }
- else if( ev.scan==0x3B00 ) /* F1 - Help */
- {
- html_view(HELP_TEXT,help_target);
- }
- else if( ev.scan==0x3C00 ) /* F2 - Save */
- {
- disk_lock(daddr.disk);
- mbr.magic=0xAA55;
- if( disk_write(&daddr,&mbr,1)==-1 )
- warn=WARN_WRITE_MBR;
- else
- {
- mesg=MESG_MBR_SAVED;
- memmove(&mbr_orig,&mbr,sizeof(struct mbr));
- }
- disk_unlock(daddr.disk);
- }
- else if( ev.scan==0x3D00 ) /* F3 - Undo */
- {
- memmove(&mbr,&mbr_orig,sizeof(struct mbr));
- force_unpack=1;
- }
- else if( ev.scan==0x3E00 ) /* F4 - Mode */
- {
- if( mode==MODE_CHS )
- {
- mode=MODE_LBA;
- if( field==2 || field==3 || field==4 ) new_field=2;
- if( field==5 || field==6 || field==7 ) new_field=3;
- }
- else
- {
- mode=MODE_CHS;
- if( field==2 ) new_field=2;
- if( field==3 ) new_field=5;
- }
- force_redraw_header=1;
- }
- else if( extended==0 && ev.scan==0x3F00 ) /* F5 - Select HD */
- {
- if( changed ) { mesg=MESG_NOT_SAVED; continue; }
- if( num_disks==+1 ) { mesg=MESG_ONLY_1HD; continue; }
-
- hd = (hd-0x80+1) % num_disks + 0x80;
- force_reload=1;
- }
- else if( (field==0 || field==1) && ev.key==0x0D ) /* Enter - Setup */
- {
- if( part[row].empty ) continue;
-
- if( os_desc[part[row].os_num].setup==0 )
- { show_error(ERROR_NO_SETUP); continue; }
-
- if( part[row].valid==0 )
- { show_error(ERROR_FIX_FIRST); }
-
- if( changed ) { mesg=MESG_NOT_SAVED; continue; }
-
- os_desc[part[row].os_num].setup(dinfo,&part[row]);
- force_redraw_header=1;
- force_redraw_menu=1;
- force_reload=1;
- }
- else if( ev.key=='H' || ev.key=='h' ) /* Hide */
- {
- part[row].os_id=OS_HIDDEN;
- detect_os_type(&part[row]);
- force_redraw=1;
- }
- else if( ev.key=='F' || ev.key=='f' ) /* Format */
- {
- int fstatus;
-
- #define NUM_ARGS 10
-
- char *argv[NUM_ARGS];
-
- if( part[row].empty ) continue;
-
- if( os_desc[part[row].os_num].format==0 )
- { show_error(ERROR_NO_FORMAT); continue; }
-
- if( part[row].valid==0 )
- { show_error(ERROR_FIX_FIRST); continue; }
-
- if( changed ) { mesg=MESG_NOT_SAVED; continue; }
-
- sprintf(tmp2,"os_id 0x%02X",part[row].os_id);
-
- if( enter_string(4,14,PROMPT_FORMAT,TMP_SZ,tmp,tmp2)==0 ) continue;
-
- parse_arg(tmp,argv,NUM_ARGS);
-
- format_progress_init();
- fstatus=os_desc[part[row].os_num].format(dinfo,&part[row],argv,format_progress);
- if( fstatus==FORMAT_OK ) mesg=MESG_FORMAT_OK;
- else if( fstatus==FORMAT_CANCEL ) mesg=WARN_FORMAT_CANCEL;
- else if( fstatus==FORMAT_FAILED ) show_error(ERROR_FORMAT_FAILED);
- format_progress_done();
- force_reload=1;
- }
- else if( ev.key=='V' || ev.key=='v' ) /* Verify */
- {
- int fstatus;
-
- if( part[row].empty ) continue;
-
- if( part[row].valid==0 )
- { show_error(ERROR_FIX_FIRST); continue; }
-
- if( changed ) { mesg=MESG_NOT_SAVED; continue; }
-
- format_progress_init();
- fstatus=generic_verify(dinfo,&part[row],0,0,format_progress);
- if( fstatus==FORMAT_OK ) mesg=MESG_VERIFY_OK;
- else if( fstatus==FORMAT_CANCEL ) mesg=WARN_VERIFY_CANCEL;
- else if( fstatus==FORMAT_FAILED ) show_error(ERROR_VERIFY_FAILED);
- format_progress_done();
- force_reload=1;
- }
- else if( extended==1 && (ev.key=='I' || ev.key=='i') ) /* Install dummy */
- {
- copy_xcode( &EXT, &mbr );
- mesg=MESG_INSTALL;
- }
- else if( extended==1 && (ev.key=='M' || ev.key=='m') ) /* Move to primary */
- {
- mesg="This option will be available in the next program release.";
- }
- else if( extended==0 && (ev.key=='I' || ev.key=='i') ) /* Install */
- {
- IPL_SELECTOR = (char*)&ENTRY_V - (char*)&IPL + 0x600;
- copy_xcode( &IPL, &mbr );
- mesg=MESG_INSTALL;
- }
- else if( extended==0 && (ev.key=='W' || ev.key=='w') ) /* Install-W */
- {
- IPL_SELECTOR = (char*)&ENTRY_S - (char*)&IPL + 0x600;
- copy_xcode( &IPL, &mbr );
- mesg=MESG_INSTALL;
- }
- else if( extended==0 && (ev.key=='U' || ev.key=='u') ) /* Uninstall */
- {
- copy_xcode( &STD_IPL, &mbr );
- mesg=MESG_UNINSTALL;
- }
- else if( ev.key=='S' || ev.key=='s' ) /* Save */
- {
- if( enter_string(20,10,PROMPT_FILE,TMP_SZ,tmp,"save") == 0 )
- continue;
- if( save_to_file(tmp,&mbr,sizeof(struct mbr))==-1 )
- warn=WARN_SAVE_FILE;
- else
- mesg=MESG_FILE_SAVED;
- }
- else if( ev.key=='L' || ev.key=='l' ) /* Load */
- {
- if( enter_string(20,10,PROMPT_FILE,TMP_SZ,tmp,"restore") == 0 )
- continue;
- if( load_from_file(tmp,&mbr2,sizeof(struct mbr))==-1 )
- warn=WARN_LOAD_FILE;
- else
- {
- mesg=MESG_FILE_LOADED;
- memmove(&mbr,&mbr2,sizeof(struct mbr));
- force_unpack=1;
- force_initial_test=1;
- }
- }
- else if( ev.key=='X' || ev.key=='x' ) /* Load IPL Code */
- {
- if( enter_string(20,10,PROMPT_FILE,TMP_SZ,tmp,"install") == 0 )
- continue;
- if( load_from_file(tmp,&mbr2,sizeof(struct mbr))==-1 )
- warn=WARN_LOAD_FILE;
- else
- {
- copy_xcode( &mbr2, &mbr );
- mesg=MESG_INSTALL;
- }
- }
-
- }/* while(1) */
-
- ext_level--;
-
- return 0;
- }/* setup_mbr */
-
-
- int write_int(int attr, int x, int y, int w, unsigned long xx)
- {
- char tmp[30];
-
- sprintf(tmp,"%*ld",w,xx);
- write_string(attr,x,y,tmp);
-
- return 0;
- }/* write_int */
-
-
- char *sprintf_long(char *tmp, unsigned long num)
- {
- int i=13; // 1,111,111,111
- tmp[i--]=0; // 0 234 678 012
-
- while( num!=0 )
- {
- if( i==9 || i==5 || i==1 ) tmp[i--]=',';
- tmp[i--]=num%10+'0';
- num/=10;
- }
-
- return tmp+i+1;
- }/* sprintf_long */
-
-
- char *sprintf_systype(char *tmp, int i)
- {
- sprintf(tmp," 0x%02X %-23s %s %s %s ",
- os_desc[i].os_id, os_desc[i].name,
- (os_desc[i].setup!=0)?"Yes":" - ",
- (os_desc[i].format!=0)?"Yes":" - ",
- (os_desc[i].printinfo!=0)?"Yes":" - " );
- return tmp;
- }/* sprintf_systype */
-
-
- char *sprintf_os_name(char *tmp, struct part_long *p)
- {
- if( os_desc[p->os_num].os_id != OS_UNKN )
- sprintf(tmp,"%-23s",os_desc[p->os_num].name );
- else
- sprintf(tmp,"Unknown code (0x%02X) ", p->os_id );
-
- return tmp;
- }/* sprintf_os_name */
-
-
-
- char *sprintf_partrec(char *tmp, struct part_long *p)
- {
- char tmp1[30], tmp2[30];
-
- if( mode==MODE_CHS )
- {
- sprintf(tmp," %d %-3s %s %4ld %4ld %4ld %4ld %4ld %4ld %10s ",
- p->num+1,
- p->active ? "Yes" : "No",
- sprintf_os_name(tmp1,p),
- p->start_cyl,
- p->start_head,
- p->start_sect,
- p->end_cyl,
- p->end_head,
- p->end_sect,
- sprintf_long(tmp2,p->num_sect/2) );
- }
- else /* MODE_LBA */
- {
- sprintf(tmp," %d %-3s %s%9lu %10lu %10lu %10s ",
- p->num+1,
- p->active ? "Yes" : "No",
- sprintf_os_name(tmp1,p),
- p->rel_sect,
- p->num_sect,
- (p->num_sect==0)?(0):(p->rel_sect+p->num_sect-1),
- sprintf_long(tmp2,p->num_sect/2) );
- }
-
- return tmp;
- }/* sprintf_part */
-
-
- void pack_part(struct part_long *prl, struct part_rec *pr)
- {
- if( prl->active==0 )
- {
- if( pr->boot_flag!=0 ) pr->boot_flag=0;
- }
- else
- {
- if( pr->boot_flag==0 ) pr->boot_flag=0x80;
- }
-
- pr->start_cylL = prl->start_cyl & 0xFF;
- pr->start_cylH = prl->start_cyl >> 8;
- pr->start_head = prl->start_head;
- pr->start_sect = prl->start_sect;
-
- pr->end_cylL = prl->end_cyl & 0xFF;
- pr->end_cylH = prl->end_cyl >> 8;
- pr->end_head = prl->end_head;
- pr->end_sect = prl->end_sect;
-
- pr->rel_sect = prl->rel_sect;
- pr->num_sect = prl->num_sect;
-
- pr->os_id = prl->os_id;
- }/* pack_part */
-
-
- void unpack_part(struct part_rec *pr, struct part_long *prl)
- {
- prl->active = (pr->boot_flag==0)?0:1;
-
- prl->start_cyl = pr->start_cylL+(pr->start_cylH<<8);
- prl->start_head = pr->start_head;
- prl->start_sect = pr->start_sect;
-
- prl->end_cyl = pr->end_cylL+(pr->end_cylH<<8);
- prl->end_head = pr->end_head;
- prl->end_sect = pr->end_sect;
-
- prl->rel_sect = pr->rel_sect;
- prl->num_sect = pr->num_sect;
-
- prl->os_id = pr->os_id;
-
- detect_os_type( prl );
- }/* unpack_part */
-
-
- void detect_os_type(struct part_long *p)
- {
- int i=0;
-
- while( os_desc[i].os_id!=p->os_id && os_desc[i].os_id!=OS_UNKN ) i++;
-
- p->os_num=i;
- }/* detect_os_type */
-
-
- int validate_table(struct disk_info *dinfo, struct part_long *part,
- struct part_long *container, int x)
- {
- int i, j;
- struct part_long *p, *q;
- unsigned long sect, rel_sect, num_sect;
- unsigned long sect_per_side = dinfo->num_sects;
- unsigned long sect_per_cyl = dinfo->num_heads * dinfo->num_sects;
-
- if( x!=-1 ) /* we have to recalculate partition x */
- {
- p=&part[x];
-
- if( mode==MODE_CHS )
- {
- p->rel_sect=0;
- p->num_sect=0;
-
- if( p->start_cyl!=0 || p->start_head!=0 || p->start_sect!=0 )
- {
- p->rel_sect = p->start_cyl*sect_per_cyl +
- p->start_head*sect_per_side +
- p->start_sect - 1 - p->container_base;
- }
-
- if( p->end_cyl!=0 || p->end_head!=0 || p->end_sect!=0 )
- {
- p->num_sect = p->end_cyl*sect_per_cyl +
- p->end_head*sect_per_side +
- p->end_sect - 1 - p->rel_sect - p->container_base + 1;
- }
- } /* CHS */
- else /* mode==MODE_LBA */
- {
- p->start_cyl=0; p->end_cyl=0;
- p->start_head=0; p->end_head=0;
- p->start_sect=0; p->end_sect=0;
-
- sect = p->container_base + p->rel_sect;
-
- if( p->rel_sect!=0 || p->num_sect!=0 )
- {
- p->start_cyl =(sect)/(sect_per_cyl);
- p->start_head=(sect)%(sect_per_cyl)/(sect_per_side);
- p->start_sect=(sect)%(sect_per_cyl)%(sect_per_side)+1;
- }
-
- sect = p->container_base + p->rel_sect + p->num_sect - 1;
-
- if( p->num_sect!=0 )
- {
- p->end_cyl =(sect)/(sect_per_cyl);
- p->end_head=(sect)%(sect_per_cyl)/(sect_per_side);
- p->end_sect=(sect)%(sect_per_cyl)%(sect_per_side)+1;
- }
- }/* LBA */
- }/* recalculate */
-
-
- for( p=part, i=0 ; i<4 ; i++, p++ )
- {
- p->empty=1;
-
- if( p->start_cyl!=0 ) p->empty=0;
- else if( p->start_head!=0 ) p->empty=0;
- else if( p->start_sect!=0 ) p->empty=0;
-
- else if( p->end_cyl!=0 ) p->empty=0;
- else if( p->end_head!=0 ) p->empty=0;
- else if( p->end_sect!=0 ) p->empty=0;
-
- else if( p->rel_sect!=0 ) p->empty=0;
- else if( p->num_sect!=0 ) p->empty=0;
- }
-
-
- for( p=part, i=0 ; i<4 ; i++, p++ )
- {
- if( p->empty ) continue;
-
- p->valid=1;
-
- if( p->start_cyl >= dinfo->num_cyls ) p->valid=0;
- else if( p->start_head >= dinfo->num_heads ) p->valid=0;
- else if( p->start_sect == 0 ) p->valid=0;
- else if( p->start_sect > dinfo->num_sects ) p->valid=0;
-
- else if( p->end_cyl >= dinfo->num_cyls ) p->valid=0;
- else if( p->end_head >= dinfo->num_heads ) p->valid=0;
- else if( p->end_sect == 0 ) p->valid=0;
- else if( p->end_sect > dinfo->num_sects ) p->valid=0;
-
- else if( p->end_cyl < p->start_cyl ) p->valid=0;
- else if( p->end_cyl == p->start_cyl && p->end_head < p->start_head ) p->valid=0;
- else if( p->end_cyl == p->start_cyl && p->end_head == p->start_head && p->end_sect < p->start_sect ) p->valid=0;
- else
- {
- rel_sect = p->start_cyl*sect_per_cyl +
- p->start_head*sect_per_side +
- p->start_sect - 1 - p->container_base;
-
- num_sect = p->end_cyl*sect_per_cyl +
- p->end_head*sect_per_side +
- p->end_sect - 1 - p->container_base - rel_sect + 1;
-
- if( rel_sect != p->rel_sect ) p->valid=0;
- if( num_sect != p->num_sect ) p->valid=0;
-
- if( rel_sect == 0 ) p->valid=0;
- if( rel_sect >= container->num_sect ) p->valid=0;
- if( rel_sect + num_sect - 1 >= container->num_sect ) p->valid=0;
- }
-
- for( q=part, j=0 ; j<4 ; j++, q++ )
- {
- if( i==j || q->empty ) continue;
-
- if( p->rel_sect >= q->rel_sect &&
- p->rel_sect <= q->rel_sect + q->num_sect - 1 ) p->valid=0;
-
- if( q->rel_sect >= p->rel_sect &&
- q->rel_sect <= p->rel_sect + p->num_sect - 1 ) p->valid=0;
- }/* q */
- }/* p */
-
- for( i=0 ; i<4 ; i++ )
- if( part[i].empty==0 && part[i].valid==0 )
- return 0;
-
- return 1;
- }/* validate_table */
-
-
-
- void copy_xcode(struct mbr *from, struct mbr *to)
- {
- memmove( &to->xcode, &from->xcode, sizeof(from->xcode) );
- }/* copy_xcode */
-
-
- void usage(void)
- {
- html_dump(stderr,HELP_TEXT,"usage");
- exit(1);
- }
-
- void cmd_error(char *msg)
- {
- fprintf(stderr,"\nError: %s\n",msg);
- exit(1);
- }
-
-
- void command_line(int argc, char **argv)
- {
- char ch;
- int i, x, valid;
- unsigned long total;
- struct disk_info dinfo;
- struct disk_addr daddr;
- struct part_long p, part[4];
-
- if( argv[0][0]=='H' || argv[0][0]=='h' ) /* Help */
- {
- html_dump(stdout,HELP_TEXT,0);
- return;
- }
-
- if( argv[0][0]=='M' || argv[0][0]=='m' ) /* Modules */
- {
- printf("\n%s\n\n",HEADER_SYSTYPE);
-
- for( i=1 ; os_desc[i].os_id!=OS_UNKN ; i++ )
- printf("%s\n",sprintf_systype(tmp,i));
-
- return;
- }
-
- if( strcmpi(argv[0],"Reboot")==0 ) reboot();
-
- for( i=0 ; (ch="PpAaDdVvSsLlXxIiWwUuFf"[i])!=0 ; i++ )
- if( argv[0][0]==ch ) break;
-
- if( ch==0 )
- {
- usage();
- return;
- }
-
- if( get_disk_info(hd,&dinfo)==-1 ) cmd_error(ERROR_DISK_INFO);
-
- p.container_base=0;
-
- p.start_cyl=0; p.end_cyl=dinfo.num_cyls-1;
- p.start_head=0; p.end_head=dinfo.num_heads-1;
- p.start_sect=1; p.end_sect=dinfo.num_sects;
-
- p.rel_sect=0;
- p.num_sect=dinfo.total_sects;
-
- if( argv[0][0]=='P' || argv[0][0]=='p' ) /* Print partition table */
- {
- ext_level=0;
- recursive_opt = (strncmpi(argv[1],"/r",2)==0)?1:0;
-
- /* HardDisk 1 1236 MB [ 1023 cyl x 255 heads x 63 sects = 11,111,111 sects ] */
- printf(" HardDisk %d %5lu MB [ %4d cyl x %3d heads x %2d sects = %10s sects ]\n\n",
- dinfo.disk-127, dinfo.total_sects/2048, dinfo.num_cyls,
- dinfo.num_heads, dinfo.num_sects, sprintf_long(tmp,dinfo.total_sects) );
-
- print_mbr(&dinfo, &p);
- return;
- }/* print */
-
- daddr.disk=hd;
- daddr.cyl=0;
- daddr.head=0;
- daddr.sect=1;
-
- if( disk_read(&daddr,&mbr,1)==-1 ) cmd_error(ERROR_READ_MBR);
-
- for( i=0 ; i<4 ; i++ )
- {
- unpack_part( &mbr.part_rec[i], &part[i] );
- part[i].num=i;
- part[i].daddr=&daddr;
- part[i].container_base=p.container_base+p.rel_sect;
- }
-
- valid=validate_table(&dinfo,part,&p,-1);
-
- if( argv[0][0]=='S' || argv[0][0]=='s' ) /* Save */
- {
- if( argc<2 ) usage();
- if( save_to_file(argv[1],&mbr,sizeof(struct mbr))==-1 )
- cmd_error(WARN_SAVE_FILE);
- printf("%s\n",MESG_FILE_SAVED);
- if( !valid )
- fprintf(stderr,"Warning: %s\n",ERROR_INVALID);
- return;
- }
-
- if( argv[0][0]=='L' || argv[0][0]=='l' ) /* Load */
- {
- if( argc<2 ) usage();
- if( load_from_file(argv[1],&mbr,sizeof(struct mbr))==-1 )
- cmd_error(WARN_LOAD_FILE);
- for( i=0 ; i<4 ; i++ )
- unpack_part( &mbr.part_rec[i], &part[i] );
- valid=validate_table(&dinfo,part,&p,-1);
- }
-
- if( !valid ) cmd_error(ERROR_INVALID);
-
- if( argv[0][0]=='I' || argv[0][0]=='i' ) /* Install */
- {
- IPL_SELECTOR = (char*)&ENTRY_V - (char*)&IPL + 0x600;
- copy_xcode( &IPL, &mbr );
- }
- else if( argv[0][0]=='W' || argv[0][0]=='w' ) /* Install-W */
- {
- IPL_SELECTOR = (char*)&ENTRY_S - (char*)&IPL + 0x600;
- copy_xcode( &IPL, &mbr );
- }
- else if( argv[0][0]=='U' || argv[0][0]=='u' ) /* Uninstall */
- {
- copy_xcode( &STD_IPL, &mbr );
- }
- else if( argv[0][0]=='X' || argv[0][0]=='x' ) /* Install IPL code */
- {
- if( argc<2 ) usage();
- if( load_from_file(argv[1],&mbr2,sizeof(struct mbr))==-1 )
- cmd_error(WARN_LOAD_FILE);
- copy_xcode( &mbr2, &mbr );
- }
- else if( argv[0][0]=='A' || argv[0][0]=='a' ) /* Activate */
- {
- if( argc<2 ) usage();
- i=atoi(argv[1])-1;
- if( i<0 || i>3 ) usage();
-
- for( x=0 ; x<4 ; x++ )
- part[x].active=0;
- part[i].active=1;
-
- for( i=0 ; i<4 ; i++ ) pack_part( &part[i], &mbr.part_rec[i] );
- }
- else if( argv[0][0]=='F' || argv[0][0]=='f' ) /* Format */
- {
- if( argc<2 ) usage();
- i=atoi(argv[1])-1;
- if( i<0 || i>3 ) usage();
-
- if( part[i].empty ) cmd_error(ERROR_FORMAT_EMPTY);
-
- if( os_desc[part[i].os_num].format==0 ) cmd_error(ERROR_NO_FORMAT);
-
- format_progress_init();
- x=os_desc[part[i].os_num].format(&dinfo,&part[i],argv+2,format_progress);
- if( x==FORMAT_FAILED ) cmd_error(ERROR_FORMAT_FAILED);
- else if( x==FORMAT_CANCEL ) cmd_error(WARN_FORMAT_CANCEL);
- else printf("\n%s\n",MESG_FORMAT_OK);
- format_progress_done();
- return;
- }
- else if( argv[0][0]=='V' || argv[0][0]=='v' ) /* Verify */
- {
- if( argc<2 ) usage();
- i=atoi(argv[1])-1;
- if( i<0 || i>3 ) usage();
-
- if( part[i].empty ) cmd_error(ERROR_FORMAT_EMPTY);
-
- printf("%50s%s\r","",PRESS_ESC);
-
- format_progress_init();
- x=generic_verify(&dinfo,&part[i],0,0,format_progress);
- if( x==FORMAT_FAILED ) cmd_error(ERROR_VERIFY_FAILED);
- else if( x==FORMAT_CANCEL ) cmd_error(WARN_VERIFY_CANCEL);
- else printf("\n%s\n",MESG_VERIFY_OK);
- format_progress_done();
- return;
- }
-
- disk_lock(hd);
-
- if( disk_write(&daddr,&mbr,1)==-1 )
- {
- disk_unlock(hd);
- cmd_error(WARN_WRITE_MBR);
- }
-
- printf("%s\n",MESG_MBR_SAVED);
-
- disk_unlock(hd);
- }/* command_line */
-
-
-
-
- int save_to_file(char *filename, void *buf, int len)
- {
- FILE *f;
-
- if( (f=fopen(filename,"wb"))==0 ) return -1;
-
- if( fwrite(buf,1,len,f)!=len ) return -1;
-
- fclose(f);
- return 0;
- }/* save_to_file */
-
-
-
- int load_from_file(char *filename, void *buf, int len)
- {
- FILE *f;
-
- if( (f=fopen(filename,"rb"))==0 ) return -1;
-
- if( fread(buf,1,len,f)!=len ) return -1;
-
- fclose(f);
- return 0;
- }/* load_from_file */
-
-
-
- void parse_arg(char *str, char **argv, int argv_size)
- {
- int i=0;
- char *p=str;
-
- while(1)
- {
- while( *p==' ' || *p=='\t' ) p++;
- if( *p==0 ) break;
- if( i>=argv_size-1 ) break;
- argv[i++]=p;
- while( *p!=' ' && *p!='\t' && *p!=0 ) p++;
- if( *p==0 ) break;
- *p=0;
- p++;
- }
-
- argv[i]=0;
- }/* parse_arg */
-
-
-
- int print_mbr(struct disk_info *dinfo, struct part_long *p)
- {
- int i;
- struct disk_addr daddr;
- struct part_long part[4];
-
- daddr.disk=dinfo->disk;
- daddr.cyl =p->start_cyl;
- daddr.head=p->start_head;
- daddr.sect=p->start_sect;
-
- if( disk_read(&daddr,&mbr,1)==-1 )
- {
- fprintf(stderr,"%s\n",ERROR_READ_MBR);
- return 0;
- }
-
- for( i=0 ; i<4 ; i++ )
- {
- unpack_part( &mbr.part_rec[i], &part[i] );
- part[i].num=i;
- part[i].daddr=&daddr;
- part[i].container_base=p->container_base+p->rel_sect;
- }
-
- validate_table(dinfo,part,p,-1);
-
- /*
- HardDisk 1 1236 MB [ 1023 cyl x 255 heads x 63 sects = 11,111,111 sects ]
-
- Active Starting Ending Starting Sectors Ending Partition
- # ! ID Cyl Head Sct Cyl Head Sct sector in part sector Size [KB]
- OK 1 Y 0xFF 1023 255 63 1023 255 63 12345678 12345678 12345678 1,111,111
- X 2 - 0xFF 1023 255 63 1023 255 63 12345678 12345678 12345678 1,111,111
- 3 - 0x00 0 0 0 0 0 0 0 0
- 4 - 0x00 0 0 0 0 0 0 0 0
- */
- printf(" Active Starting Ending Starting Sectors Ending Partition\n"
- " # ! ID Cyl Head Sct Cyl Head Sct sector in part sector Size [KB]\n");
-
- for( i=0 ; i<4 ; i++ )
- {
- printf("%s %d %s 0x%02X %4lu %3lu %2lu %4lu %3lu %2lu %8lu %8lu %8lu %10s\n",
- (part[i].empty)?" ":((part[i].valid)?"OK":" X"), i+1,
- (part[i].active)?"Yes":" - ",
- part[i].os_id,
- part[i].start_cyl, part[i].start_head, part[i].start_sect,
- part[i].end_cyl, part[i].end_head, part[i].end_sect,
- part[i].rel_sect, part[i].num_sect,
- (part[i].num_sect==0)?(0):(part[i].rel_sect+part[i].num_sect-1),
- sprintf_long(tmp,part[i].num_sect/2) );
- }
-
- for( i=0 ; i<4 ; i++ )
- if( !part[i].empty )
- {
- printf("\n # Active%s Size [KB]\n",HEADER_SYSTYPE);
- break;
- }
-
- for( i=0 ; i<4 ; i++ )
- if( !part[i].empty )
- {
- printf(" %d %s %s %10s\n", i+1,
- (part[i].active)?"Yes":" - ",
- sprintf_systype(tmp,part[i].os_num),
- sprintf_long(tmp2,part[i].num_sect/2));
- }
-
- printf("\n");
-
- if( recursive_opt==0 ) return 0;
-
- if( ext_level>10 )
- {
- printf("Warning: Recursion is too deep.\n");
- return 0;
- }
-
- ext_level++;
-
- for( i=0 ; i<4 ; i++ )
- if( !part[i].empty )
- if( os_desc[ part[i].os_num ].printinfo!=0 )
- {
- if( part[i].os_id==5 )
- printf("\nExtended DOS %4lu MB [ %s sectors ] at [ Cyl=%lu, Head=%lu, Sect=%lu ]\n"
- "MBR Level %d\n\n",
- part[i].num_sect/2048, sprintf_long(tmp,part[i].num_sect),
- part[i].start_cyl, part[i].start_head, part[i].start_sect,
- ext_level );
- else
- printf("\nPartition %4lu MB [ %s sectors ] at [ Cyl=%lu, Head=%lu, Sect=%lu ]\n"
- "Type: %s\n\n",
- part[i].num_sect/2048, sprintf_long(tmp,part[i].num_sect),
- part[i].start_cyl, part[i].start_head, part[i].start_sect,
- sprintf_os_name(tmp2,&part[i]) );
-
- os_desc[ part[i].os_num ].printinfo(dinfo,&part[i]);
- }
-
- ext_level--;
-
- printf("\n");
-
- return 0;
- }/* print_mbr */
-
-
- int format_ext(struct disk_info *dinfo, struct part_long *p, char **argv, int (*progress)(char*) )
- {
- disk_lock(dinfo->disk);
- progress("^Initializing Extended DOS partition ...");
-
- progress("Writing Extended Master Boot Record ...");
-
- if( disk_write_rel(dinfo,p,0,&EXT,1)==-1 )
- {
- progress("Error Writing Extended Master Boot Record.");
- disk_unlock(dinfo->disk);
- return FORMAT_FAILED;
- }
-
- argv++; /* so compiler will not show warning */
-
- sleep(2);
-
- disk_unlock(dinfo->disk);
- return FORMAT_OK;
- }/* format_ext */
-
-