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

📄 srpd.cpp

📁 该软件是一个纯中文的DOS硬盘分区管理程序,它除了居有分区管理外还有MBR、DBR备份/恢复功能。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    hidden=dpt[i].pflag>0x10?"隐藏":" ";
    goto_xy(x,y+1+i);
    cprintf("  %3d %9s    %1s%6s %14.1lf %10.1f%% %8s",i+1,dpt[i].bflag==0x80?"活动":" ",pflag,type,dpt[i].sectors/double(pow(2,11)),used,hidden);
  }
  i=0;
  for(;;)
  {
    j=i;
    textbackground(2);
    textcolor(1);
    goto_xy(x,y+1+i);
    type=ptype(dpt[j].pflag);
    pflag=(dpt[j].pflag==0x0f?"*":" ");
    used=(dpt[j].flag=='L'||(dpt[j].flag==0x0&&dpt[j].pflag==0x05))?dpt[j].sectors/double(E_SECTORS)*100:dpt[j].sectors/double(SECTORS)*100;
    hidden=dpt[j].pflag>0x10?"隐藏":" ";
    cprintf("  %3d %9s    %1s%6s %14.1lf %10.1f%% %8s",j+1,dpt[j].bflag==0x80?"活动":" ",pflag,type,dpt[j].sectors/double(pow(2,11)),used,hidden);
    while(!bioskey(1));
    c.i=bioskey(0);
    if(c.ch[0])
    {
      k=find(c.ch[0],s);
      if(k!=-1)
      {
	SELECT=i+1;
	return k;
      }
      else if(c.ch[0]==27)
	return -1;
      else
      {
	sound(1500);
	delay(10);
	nosound();
      }
    }
    else
    {
      switch(c.ch[1])
      {
	case 72:i--;
		break;
	case 80:i++;
		break;
      }
    }
    if(i==P_TOTAL) i=0;
    if(i<0)i=P_TOTAL-1;
    goto_xy(x,y+1+j);
    textbackground(1);
    textcolor(15);
    cprintf("  %3d %9s    %1s%6s %14.1lf %10.1f%% %8s",j+1,dpt[j].bflag==0x80?"活动":" ",pflag,type,dpt[j].sectors/double(pow(2,11)),used,hidden);
    textbackground(2);
    textcolor(1);
    goto_xy(x,y+1+i);
    cprintf("  %3d %9s    %1s%6s %14.1lf %10.1f%% %8s",i+1,dpt[i].bflag==0x80?"活动":" ",pflag,type,dpt[i].sectors/double(pow(2,11)),used,hidden);
  }
}
int dbr_dpt(int x,int y,char *sd)
{
  union inkey
  {
	char ch[2];
	int i ;
  }c;
  int i,j,t,d;
  float used;
  BYTE *type;
  BYTE name[6]="";
  DPT ddpt[24];
  DWORD sectors;
  read_dbr(HDD);
  void notice(char *);
  for(i=0,t=0;t<P_TOTAL;t++)
  {
    if(dpt[t].flag==0x0)
      continue;
    if(dpt[t].flag=='E')
      continue;
    ddpt[i].flag=dpt[t].flag;
    ddpt[i].pflag=dpt[t].pflag;
    ddpt[i].ssectors=dpt[t].ssectors;
    ddpt[i].sectors=dpt[t].sectors;
    ddpt[i].s_position=dpt[t].s_position;
    i++;
  }
  t=i;/*保存分区数*/
  window(1,1,80,25);
  textbackground(0);
  clrscr();
  goto_xy((80-strlen(sd))/2,2);
  textcolor(14);
  cprintf(sd);
  goto_xy(20,4);
  cprintf("B---备份DBR    R---恢复DBR    X---返回");
  goto_xy(20,24);
  cprintf("已备份%d个DBR",DBR);
  goto_xy(46,24);
  cprintf("Copyright(C) Soaking Rain");
  textbackground(2);
  textcolor(4);
  goto_xy(x,y);
  cprintf("  分区号    类型      大小(M)      起始扇区号       扇区数  ");
  textbackground(1);
  textcolor(15);
  for(i=0;i<t;i++)
  {
    type=ptype(ddpt[i].pflag);
    goto_xy(x,y+1+i);
    cprintf("%5d    %8s  %10.1lf       %9lx    %9lx  ",i+1,type,ddpt[i].sectors/double(pow(2,11)),ddpt[i].s_position,ddpt[i].sectors);
  }
  i=0;
  for(;;)
  {
    j=i;
    textbackground(2);
    textcolor(1);
    goto_xy(x,y+1+i);
    type=ptype(ddpt[i].pflag);
    cprintf("%5d    %8s  %10.1lf       %9lx    %9lx  ",i+1,type,ddpt[i].sectors/double(pow(2,11)),ddpt[i].s_position,ddpt[i].sectors);
    while(!bioskey(1));
    c.i=bioskey(0);
    if(c.ch[0])
    {
      if(c.ch[0]=='R'||c.ch[0]=='r')
      {
	 switch(dbr_bck(2,HDD,i+1," ",ddpt))
	 {
	   case 1: notice("已经恢复DBR!!!");break;
	   case 2: notice("你以前没有备份该分区的DBR!!!");break;
	   case 0: notice("恢复DBR失败!!!");break;
	 }
	 return 1;
      }
      else if(c.ch[0]=='B'||c.ch[0]=='b')
      {
	  goto_xy(15,7+i);
	  textbackground(6);
	  textcolor(14);
	  cprintf("请输入标识名(最长6个字节):");
	  gets(name);
	  if(dbr_bck(1,HDD,i+1,name,ddpt)==1)
	    notice("已成功备份DBR!!!");
	  else
	    notice("备份DBR失败!!!");
	  return 1;
      }
      else if(c.ch[0]=='X'||c.ch[0]=='x')
	return -1;
      else if(c.ch[0]==27)
	return -1;
      else
      {
	sound(1500);
	delay(10);
	nosound();
      }
    }
    else
    {
      switch(c.ch[1])
      {
	case 72:i--;
		break;
	case 80:i++;
		break;
      }
    }
    if(i==t) i=0;
    if(i<0)i=t-1;
    goto_xy(x,y+1+j);
    textbackground(1);
    textcolor(15);
    cprintf("%5d    %8s  %10.1lf       %9lx    %9lx  ",j+1,type,ddpt[j].sectors/double(pow(2,11)),ddpt[j].s_position,ddpt[j].sectors);
    textbackground(2);
    textcolor(1);
    goto_xy(x,y+1+i);
    cprintf("%5d    %8s  %10.1lf       %9lx    %9lx  ",i+1,type,ddpt[i].sectors/double(pow(2,11)),ddpt[i].s_position,ddpt[i].sectors);
  }
}

void about()
{
  int i,j;
  char *s[]={"    该程序是一个全中文的分区程序,它除了据有分区功能外,还有MBR(Main Boot Record)、DBR(DOS Boot Record)、DPT(Disk Partition Table)备份及恢复功能,可以更有效的防止数据丢失.\n",
	 "    " ,"                 版权(C)2006.4-2006.5 淋雨",
		 "                      Ver 1.0.0 Beta\n",
	     " QQ:124208056    Tel:13399830686   E-mail:cqfjjin@163.com"};
  textbackground(0);
  clrscr();
  goto_xy(10,10);
  textcolor(2);
  window(10,9,70,24);
  for(i=0;i<5;i++)
  {
    cprintf(*(s+i));
    cprintf("\r\n");
  }
  getch();
  srgui();
}
void notice(char *s)
{
  goto_xy(15,23);
  textbackground(0);
  textcolor(14);
  cprintf(s);
  getch();
  textcolor(8);
  goto_xy(0,23);
  cprintf("   ************************************************************************");
}
void reset(void)
{
  asm mov ax,0x0040
  asm push ax
  asm pop ds
  asm mov word ptr [0x0072],0x1234
  asm mov ax,0xffff
  asm push ax
  asm mov ax,0x0
  asm push ax
  asm retf
}
void main()
{
  DWORD t;
  int i,r1,r2,r3;
  union inkey
  {
    char c[2];
    int i;
  }c;
  clrscr();
  if(detect_ext13(HDD)==0)
  {
    puts("你的BIOS不支持扩展INT 13!");
    exit(0);
  }
  detect_hdd(HDD);
  if(detect_hdd(HDD)==1)
    if(SECTORS==0||HEADS>255||T_SECTS>63)
    {
      detect_hdd(HDD);
	if(SECTORS==0||HEADS>255||T_SECTS>63)
	{
	  puts("硬盘不存在或读取硬盘参数错误!");
	  exit(0);
	}
    }
  srgui();
  read_dpt(HDD);
  for(;;)
  {
    switch(menu(20,14,4,menu1,"MDAX"))
    {
      case 0:
	     textbackground(0);
	     do
	     {
	       r1=p_dpt(10,4,"CDAHX","磁盘分区管理");
	       switch(r1)
	       {
		 case 0:if(dpt[SELECT-1].flag==0x0)
			{
			  while(1)
			  {
			    goto_xy(20,5+SELECT);
			    textbackground(2);
			    textcolor(14);
			    cprintf("请输入分区大小(%10lu)M",(dpt[SELECT-1].sectors/DWORD(pow(2,11))));
			    goto_xy(36,5+SELECT);
			    while(!bioskey(1));
			    c.i=bioskey(0);
			    if(c.c[0])
			    {
			      if(c.c[0]!='\r')
			      {
				cprintf("         ");
				goto_xy(36,5+SELECT);
				scanf("%ld",&t);
				t=t*DWORD(pow(2,11));
			      }
			      else
				t=dpt[SELECT-1].sectors;
			    }
			    if(t>dpt[SELECT-1].sectors)
			    {
			      notice("输入的分区值太大!!!");
			      continue;
			    }
			    else if(t<pow(2,14))
			    {
			      notice("输入的分区值太小!!!");
			      continue;
			    }
			    break;
			  }
			  if(EXT==0)
			  {
			    switch(menu(30,5+SELECT,2,cp_notice,"PE"))
			    {
			      case 0:if(create_p(1,HDD,SELECT,t,dpt[SELECT-1].s_position))
				       notice("主分区已创建!!!");
				     else
				       notice("创建主分区失败!!!");
				       break;
			      case 1:if(create_p(2,HDD,SELECT,t,dpt[SELECT-1].s_position))
				       notice("扩展分区已创建!!!");
				     else
				       notice("创建扩展分区失败!!!");
				       break;
			    }
			  }
			  else if(dpt[SELECT-1].pflag==0x0&&dpt[SELECT-1].flag==0x0)
			  {
			    if(create_p(1,HDD,SELECT,t,dpt[SELECT-1].s_position))
			      notice("主分区已创建!!!");
			    else
			      notice("创建主分区失败!!!");
			  }
			  else if(dpt[SELECT-1].flag==0x0&&dpt[SELECT-1].pflag==0x05)
			  {
			    if(create_p(3,HDD,SELECT,t,dpt[SELECT-1].s_position))
			      notice("逻辑分区已创建成功!!!");
			    else
			      notice("创建逻辑分区失败!!!");
			  }
			}
			break;
		 case 1:
			if(dpt[SELECT-1].flag==0x0)
			{
			  sound(1500);
			  delay(20);
			  nosound();
			}
			else
			{
			  if(answer(" 你真的要删除该分区吗?")==1)
			  {
			    if(dpt[SELECT-1].flag=='E'&&PNO_L>0)
			    {
			      sound(1500);
			      delay(20);
			      nosound();
			      notice("不能删除扩展分区,还有逻辑分区!!!");
			    }
			    else
			    {
			      if(delete_p(HDD,SELECT))
				notice("分区已被删除!!!");
			      else
				notice("分区没有被删除掉!!!");
			    }
			  }
			}
			break;
		 case 2:if(dpt[SELECT-1].flag!='P')
			{
			  sound(1500);
			  delay(20);
			  nosound();
			  notice("只能激活主分区!!!");
			}
			else if(answer(" 更改活动分区后可能系统不能正常运行,你真的要继续吗?")==1)
			  if(active_p(HDD,SELECT,dpt[SELECT-1].s_position))
			  {
			    notice("分区已被激活!!!");
			  }
			  else
			  {
			    notice("激活分区失败!!!");
			  }break;
		 case 3:if(dpt[SELECT-1].pflag==0)
			{
			  sound(1500);
			  delay(20);
			  nosound();
			}
			else if(dpt[SELECT-1].flag=='E')
			  notice("不能隐藏扩展分区!!!");
			else
			  if(dpt[SELECT-1].pflag<0x10)
			  {
			    if(answer(" 隐藏分区后无法使用该分区的数据,你真的要继续吗?")==1)
			      if(hidden_p(1,HDD,SELECT))
				notice("分区已被隐藏!!!");
			  }
			  else
			    if(hidden_p(2,HDD,SELECT))
			      notice("分区已被显示!!!");
			break;
		 case 4:r1=-1;
	       }
	       read_dpt(HDD);
	     }while(r1!=-1);
	     clrscr();
	     srgui();
	     break;
      case 1:
	       switch(menu(24,15,4,sub_menu1,"MDPX"))
	       {
		 case 0:
			 switch(menu(28,16,4,sub_menu2,"BRFX"))
			 {
			    case 0:
				   if(answer(" 你真的要覆盖复有备份吗? ")==1)
				   {
				     if(back_mbr(1,HDD)==1)
				     {
				       notice("MBR已成功备份!!!");
				       read_dpt(HDD);
				     }
				     else
				       notice("MBR备份失败!!!");
				   }
				   break;
			    case 1:
				   if(answer(" 你真的要覆盖现有MBR吗? ")==1)
				   {
				      switch(back_mbr(2,HDD))
				      {
					case 1:notice("MBR已成功恢复!!!");
					       read_dpt(HDD);
					       break;
					case 2:notice("您还没有备份MBR!!!");break;
					case 0:notice("MBR恢复失败!!!");break;
				      }
				   }
				   break;
			    case 2:
				   if(back_mbr(3,HDD)==1)
				     notice("MBR已成功写入!!!");
				   else
				     notice("MBR写入失败!!!");
				   break;
			}
			break;
		 case 1:
			do
			{
			  r2=dbr_dpt(10,5,"DBR管理");
			}while(r2!=-1);
			break;
		 case 2:
			  switch(menu(28,18,3,sub_menu3,"BRX"))
			  {
			    case 0:if(answer(" 你真的要覆盖原有备份吗? ")==1)
				   {
				     if(back_dpt(1,HDD))
				       notice("DPT已成功备份!!!");
				     else
				       notice("DPT备份失败!!!");
				   }
				   break;
			    case 1:
				   if(answer(" 你真的要覆盖现有DPT吗? ")==1)
				   {
				     switch(back_dpt(2,HDD))
				     {
				       case 0:notice("DPT恢复失败!!!");break;
				       case 1:notice("DPT成功已恢复!!!");read_dpt(HDD);break;
				       case 2:notice("您还没有备份DPT!!!");break;
				     }
				   }
			  }
			break;
	       }
	     srgui();
	     break;
      case 2:clrscr();
	     about();
	     break;
      case -1:
      case 3:if(CHANGE==1)
	     {
	       switch(answer(" 分区参已修改,是否重新启动计算机?"))
	       {
		 case 1:
			reset();break;
		 case -1:break;
		 case 0:textbackground(0);
			textcolor(7);
			clrscr();
			exit(1);
	       }
	     }
	     else
	     {
		textbackground(0);
		textcolor(7);
		clrscr();
		exit(1);
	     }
    }
  }
}

⌨️ 快捷键说明

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