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

📄 tools321.c

📁 这是一个强大的磁盘维护工具 读写任意扇区 能对MBR等重要数据进行备份
💻 C
📖 第 1 页 / 共 2 页
字号:
			     }
			else {
			   	mouse_off(1);
			   	clear_sub_menu(last_menu);
			   	sub_menu_on=0;mouse_on(1);
			}
		break;

		case 2:
			if (mouse_in_box(0,20,6,20+sub_width[2],5+sub_menu_nums[2]))
			      {
			      	mouse_txt_posn(&mousex,&mousey);
			       sub_num=mousey-7;
			       /*if((sub_num==2)||(sub_num==4))	//这里原来的菜单项已经被删除
			       if(menu_status==32)
					break;
			       if((sub_num==3)||(sub_num==5))
			       if(menu_status==16)
					break;*/
			      mouse_off(1);
			      clear_roll_bar(last_menu,last_sub_num);
			      last_sub_num=sub_num;
			      draw_roll_bar(last_menu,sub_num);
			      mouse_on(1);
			      goto enter;
			     }
			else {
			     	mouse_off(1);
			     	clear_sub_menu(last_menu);
			     	sub_menu_on=0;mouse_on(1);
			}
		break;

		case 3:
			if(mouse_in_box(0,28,6,28+sub_width[3],5+sub_menu_nums[3]))
			      {
			      	mouse_txt_posn(&mousex,&mousey);
			       sub_num=mousey-7;
			       mouse_off(1);
			       clear_roll_bar(last_menu,last_sub_num);
			       last_sub_num=sub_num;
			       draw_roll_bar(last_menu,sub_num);
			       mouse_on(1);
			       goto enter;
			      }
			else {
			      	mouse_off(1);
			      	clear_sub_menu(last_menu);
			      	sub_menu_on=0;mouse_on(1);
			}
		break;

		case 4:
			if(mouse_in_box(0,36,6,36+sub_width[4],5+sub_menu_nums[4]))
			      {
			      	mouse_txt_posn(&mousex,&mousey);
			       sub_num=mousey-7;
			       mouse_off(1);
			       clear_roll_bar(last_menu,last_sub_num);
			       last_sub_num=sub_num;
			       draw_roll_bar(last_menu,sub_num);
			       mouse_on(1);goto enter;
			      }
			else {
			      	mouse_off(1);
			      	clear_sub_menu(last_menu);
			      	sub_menu_on=0;
			      	mouse_on(1);
			}
		break;

		case 5:
			if(mouse_in_box(0,43,6,43+sub_width[5],5+sub_menu_nums[5]))
			      {
			      	mouse_txt_posn(&mousex,&mousey);
			       sub_num=mousey-7;
			     if(sub_num==2)
				if(menu_status==32)
				  	break;		//这里控制鼠标点击相应子菜单无效
			     if(sub_num==3)
				if(menu_status==16)
				 	break;
			       mouse_off(1);
			       clear_roll_bar(last_menu,last_sub_num);
			       last_sub_num=sub_num;
			       draw_roll_bar(last_menu,sub_num);
			       mouse_on(1);goto enter;
			      }
			else {
			      	mouse_off(1);
			      	clear_sub_menu(last_menu);
			      	sub_menu_on=0;
			      	mouse_on(1);
			}
		break;

		case 6:
			if(mouse_in_box(0,50,6,50+sub_width[6],5+sub_menu_nums[6]))
			      {
			      	mouse_txt_posn(&mousex,&mousey);
			       sub_num=mousey-7;
			       mouse_off(1);
			       clear_roll_bar(last_menu,last_sub_num);
			       last_sub_num=sub_num;
			       draw_roll_bar(last_menu,sub_num);
			       mouse_on(1);goto enter;
			      }
			else {
			      	mouse_off(1);
			      	clear_sub_menu(last_menu);
			      	sub_menu_on=0;mouse_on(1);
			}
		break;

		case 7:
			if(mouse_in_box(0,63,6,63+sub_width[7],5+sub_menu_nums[7]))
			      {
			      	mouse_txt_posn(&mousex,&mousey);
			       sub_num=mousey-7;
			       mouse_off(1);
			       clear_roll_bar(last_menu,last_sub_num);
			       last_sub_num=sub_num;
			       draw_roll_bar(last_menu,sub_num);
			       mouse_on(1);
			       goto enter;
			      }
			else {
			      	mouse_off(1);
			      	clear_sub_menu(last_menu);
			      	sub_menu_on=0;mouse_on(1);
			}
		break;

	}
	break;

	case F10:               /*  菜单激发键  */
	case ESC:
	case ' ':
	    mouse_off(1);
	    if(!sub_menu_on){
		draw_sub_menu(last_menu,1);
		sub_num=last_sub_num=main_menu[last_menu].last_choice;
		sub_menu_on=1;
	    }
	    else{
		clear_sub_menu(last_menu);
		sub_menu_on=0;
	    }
	    mouse_on(1);
	    break;
      }//匹配 switch(key){

    }//匹配 if(sub_menu_on || key==ESC || key==F10 || key==' '||key==LEFT_MOUSE_PRESS){
    /*  浏览键判断  */
    else if(!sub_menu_on){
	switch(key){
	    case PGUP:
		if(pos==16 && data_lines>16){  pos=0; display(pos); }
		break;
	    case PGDN:
		if(pos==0 && data_lines>16){   pos=16;display(pos); }
		break;
	}
    }
    key=0;
   }while(!sys_end);
  setblank(1);
  textattr(7);
  clrscr();
ENDS:  setcursor(6,7);

}
/*--------------子函数--------------*/
/////////////////////////////////////////////////////////////////////////////
int hotkey_func(int key)   //热键判断
{
    if(key==Ctrl_Q || key==Alt_X){
      if(object==NONE) {sys_end=1;mouse_off(1);
      }
      else
	if(make_sure(1,"Are you sure to Exit? (Y/N)"))  sys_end=1;
    }
    else if(key==F1 || key=='/' || key=='?')  help();
    else if(key==Alt_F10) shell();
    else if(key==Ctrl_B || key==Ctrl_W){	//写引导扇区
      	if(sub_menu_on && last_menu==4 && sub_num>=2)
	write_boot(sub_num-2);	//注意,这一句,要改动主菜单BOOT的子菜单保存的功能
    }
    else if(key==Ctrl_R || key==F3 || key==Alt_E){
	 if(sub_menu_on){
	    clear_sub_menu(last_menu);
	    sub_menu_on=0;
	 }
	 if(key==Ctrl_R) /**readdisk_window();/**/read_freely();
    else if(key==F3 || key==Alt_E){
	 if(edit_data(object,pos))
		putsxy(prompt1,2,24,(bgcolor<<4)+0xb);
	}
    }
    else return(0);
    return(1);
}

/*************** Sub *****************/
char    scr_buff[4100];         /*  用于保存屏幕  */

void shell(void) //DOS SHELL
{
  void *scr;
  scr=malloc(4096);
  gettext(1,1,80,25,scr);	/*将文本屏幕上的文本拷贝到内存,左、上、右、下*/
  if(filefind("\\command.com")){
    setcursor(6,7);
    setblank(1);
    textattr(7);
    clrscr();
    putsxy("Type Exit to return to Tools  ",1,1,0x8f);
    system("\\command.com");
    setblank(0);
    setcursor(1,0);
  }
  else
    make_sure(0,"COMMAND.COM not in root!");
  puttext(1,1,80,25,scr);	/*从内存区拷贝文本到屏幕*/
}

void put_item(struct menu_type *m,int status)	//显示主菜单字符
/*  status=0  Off;    status=1  On */
{
  char x,color,*str;

  x=m->item_pos;  str=m->item;
  if(status==0)			//将选中的主菜单变色
    while(*str!='\0'){
      if(str==m->item) color=hot_color;
      else  color=item_color;
      putchxy(*str,x,item_line,(menu_line_color<<4)+color);	//刷新显示主菜单
      x++;    str++;
    }
  else
    putsxy(str,x,item_line,(moving_bcolor<<4)+moving_tcolor);	//将选中的主菜单变色
}

void init_menu(void)            /*  初始化菜单项  */
{
  int i;
  struct menu_type *m;

  main_menu[0].item_pos =4;
  for(i=0;i<Max_menus;i++){
	main_menu[i].hotkey     =*menuitem[i];
	main_menu[i].item       =menuitem[i];	//要显示的主菜单项
	main_menu[i].item_width=strlen(main_menu[i].item)+3;	//控制每个主菜单项的间隔
	if(i)
	main_menu[i].item_pos   =main_menu[i-1].item_width+
				 +main_menu[i-1].item_pos;

	main_menu[i].left       =main_menu[i].item_pos-1;
	main_menu[i].top        =item_line+item_height+1;

	main_menu[i].sub_width  =sub_width[i];
	main_menu[i].sub_menu_nums=sub_menu_nums[i];
	main_menu[i].last_choice=0;
  }
  main_menu[i-1].left=77-sub_width[i-1]-1;	//帮助子菜单的显示位置
  main_menu[i-1].item_pos=77-main_menu[i-1].item_width;	//主菜单“help”的位置
  init_interface();
}

void init_interface(void)       /*  初始化界面  */
{
  int   i;
  struct menu_type *m;

  setcursor(1,0);
  textattr(7);
  clrscr();
  draw_text_frame(1,1,80,4,0,7);
  draw_text_frame(1,23,80,25,1,7);
  settextattr(1,1,80,4,(bgcolor<<4)+15);
  settextattr(1,23,80,25,(bgcolor<<4)+15);
  putsxy(version,2,2,(bgcolor<<4)+0xf);
  putsxy(titles,(80-strlen(titles))/2,3,(bgcolor<<4)+0xa);
  /*putsxy(prompt0,(80-strlen(prompt0))/2,4,(bgcolor<<4)+0x7);*/
  putsxy(prompt1,2,24,(bgcolor<<4)+0xb);
  putsxy(prompt4,(80-strlen(prompt3))/2,4,(bgcolor<<4)+0xb);
  putchxy(0x10,25,3,(bgcolor<<4)+0xc);
  putchxy(0x10,26,3,(bgcolor<<4)+0xa);
  putchxy(0x10,27,3,(bgcolor<<4)+0xe);
  putchxy(0x11,52,3,(bgcolor<<4)+0xe);
  putchxy(0x11,53,3,(bgcolor<<4)+0xa);
  putchxy(0x11,54,3,(bgcolor<<4)+0xc);
  textwin(1,item_line+1,80,22,edit_bgcolor<<4,0);
  draw_menu_line();
}

void draw_menu_line(void)
{
  int i;
  struct menu_type *m;
  textwin(1,item_line,80,item_line,menu_line_color<<4,0);	//画主菜单之间的空白
  for(i=0;i<Max_menus;i++){
    m=&main_menu[i];
    put_item(m,0);		//写各个主菜单
  }
}

void draw_sub_menu(int menu_no,int enable)	//画各个子菜单项
{
  int i,x,y,s_w,s_h;
  struct menu_type *m;
    if(menu_no>=Max_menus) return;
    m=&main_menu[menu_no];
    x=m->left;  y=m->top;
    s_w=m->sub_width;
  //  if(menu_no==4)
    //	 m->sub_menu_nums=sub_menu_nums[4];
    s_h=m->sub_menu_nums*sub_item_height;
    put_item(m,1);
    if(m->sub_menu_nums){
      gettext(x,y,x+s_w+2,y+s_h+2,scr_buff);
      textwin(x+1,y+1,x+s_w+2,y+s_h+2,0x80,0);
      textwin(x,y,x+s_w+1,y+s_h+1,0,1);
      draw_text_frame(x,y,x+s_w+1,y+s_h+1,1,7);
      i=(sub_menu_bgcolor<<4)+sub_menu_color;
      textwin(x,y,x+s_w+1,y+s_h+1,i,0);
      for(i=0;i<m->sub_menu_nums;i++){
       	putsxy(sub_menu[menu_no][i],x+1,y+1+i,15<<4); 	//显示菜单的字符
	if(i==4)
	 /*if(menu_no==2)
	  {  if(menu_status==16)
		putsxy(sub_menu[menu_no][i],x+1,y+1+i,15<<4);
	     else
		putsxy(sub_menu[menu_no][i],x+1,y+1+i,(15<<4)+7);
	  }*/
	if(i==2)
	 //if((menu_no==2)||(menu_no==5))
	 if(menu_no==5)
	  {  if(menu_status==16)
		putsxy(sub_menu[menu_no][i],x+1,y+1+i,15<<4);
	     else
		putsxy(sub_menu[menu_no][i],x+1,y+1+i,(15<<4)+7);
	  }
	if(i==3)
	  //if((menu_no==2)||(menu_no==5))
	  if(menu_no==5)
	    {  if(menu_status==32)
		putsxy(sub_menu[menu_no][i],x+1,y+1+i,15<<4);
	       else
		putsxy(sub_menu[menu_no][i],x+1,y+1+i,(15<<4)+7);	//使无效菜单变成灰色
	    }
      }
      if(enable) draw_roll_bar(menu_no,m->last_choice);
    }
}

void clear_sub_menu(int menu_no)
{
  int i,x,y,s_w,s_h;
  struct menu_type *m;

    if(menu_no>=Max_menus) return;
    m=&main_menu[menu_no];
    x=m->left;  y=m->top;
    s_w=m->sub_width;
    s_h=m->sub_menu_nums*sub_item_height;

    put_item(m,0);		//刷新主菜单
    if(m->sub_menu_nums){
      puttext(x,y,x+s_w+2,y+s_h+2,scr_buff);	//刷新子菜单项
    }
}

void draw_roll_bar(int menu_no,int sub_no)	//改变得到焦点的子菜单的颜色
{
  int i,x,y,s_w;
  struct menu_type *m;

  if(menu_no>=Max_menus)  return;
  m=&main_menu[menu_no];
  if(sub_no>=m->sub_menu_nums) return;

  x=m->left;    s_w=m->sub_width;  y=m->top+1+sub_no;
  i=(moving_bcolor<<4)+moving_tcolor;
  textwin(x+1,y,x+s_w,y,i,0);
  putsxy(sub_menu[menu_no][sub_no],x+1,y,i);
}

void clear_roll_bar(int menu_no,int sub_no)	//当子菜单失去焦点时变回原来的颜色(白底黑字)
{
  int i,x,y,s_w;
  struct menu_type *m;

  if(menu_no>=Max_menus)  return;
  m=&main_menu[menu_no];
  if(sub_no>=m->sub_menu_nums) return;

  x=m->left;    s_w=m->sub_width;  y=m->top+1+sub_no;
  i=(sub_menu_bgcolor<<4)+sub_menu_color;
  textwin(x+1,y,x+s_w,y,i-sub_menu_color,0);
  putsxy(sub_menu[menu_no][sub_no],x+1,y,i);
}

void edit_chs(void)
{
  int  keys,index,value,dest;
  int  attr1=(bgcolor<<4)+0x0f,attr2=(moving_bcolor<<4)+11;
  char str[80];
  int attr0=(moving_bcolor<<4)+10;
  int i,j,key,head[12],k=0;
  int x,y;
  long str_buff1[8];
  char str_buff[10];
  int lens=4;
  int get_mess[8];
  char *mess[ ]={"Boot indicator(E10):","Beginning head:",
		 "Beginning sector:","Beginning cylinder:",
		 "System indicator(E10):","Ending head:",
		 "Ending sector:","Ending cylinder:",0};
  void *scr,*scr1;
  int x1=12,y1=6,x2=65,y2=21;
  setcursor(6,7);
  //bootdisk(READ,0,drivers[0][1],drivers[0][0],buff);
  if(exist_eint13()==0){	//如果不支持 E-INT13 则应调用 biosdisk << 注意:drivers[i][]已被修改为记录分区的扇区号、柱面号
  	biosdisk(2,0x80,0,drivers[0][1],drivers[0][0],1,buff);
  }
  else{
  	eint_disk_chs(READ,drivers[0][1],0,drivers[0][0],buff);
  }
  head[0]=buff[0x01be];		//分区的活动标志
  head[1]=buff[0x01be+1];		//start Head
  head[2]=buff[0x01be+2]&0x3f;	//start Sector
  head[3]=(buff[0x01be+2]>>6)*256+buff[0x01be+3];	//start Cylin
  head[4]=buff[0x01be+4];		//分区类型标志
  head[5]=buff[0x01be+5];		//end Head
  head[6]=buff[0x01be+6]&0x3f;	//end Sector
  head[7]=(buff[0x01be+6]>>6)*256+buff[0x01be+7];	//end Cylin
  for(i=0;i<8;i++)
   str_buff1[i]=head[i];
  for(i=0;i<8;i++)
   get_mess[i]=strlen(mess[i]);
  x=x1+1+get_mess[0];y=y1+5;
  gotoxy(x1+1+get_mess[0],y1+5);
  scr=malloc(4096);
  scr1=malloc(4096);
  gettext(x1,y1,x2,y2,scr);
  textwin(x1,y1,x2,y2,attr0,1);
  putsxy("This action can change data of Disk Partition Table.",x1+1,y1+1,attr2);
  draw_text_frame(x1,y1,x2,y1+2,0,attr0);
  draw_text_frame(x1,y1+3,x2,y2,1,attr0);
  for(i=0;i<10;i++)
   putchxy('

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -