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

📄 srpd.cpp

📁 该软件是一个纯中文的DOS硬盘分区管理程序,它除了居有分区管理外还有MBR、DBR备份/恢复功能。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		for(k=0;k<16;k++)
		  buff1[446+k]=buff[j*20+i+k];
		buff1[510]=0x55;
		buff1[511]=0xaa;
		if(read_sector(0x43,hdd,t,buff1)==0)
		  return 0;
	      }
	      else
		return 0;
	    }
	    else
	      return 0;
	  }
	}
	if(j-1==lp)
	{
	  CHANGE=1;
	  return 1;
	}
      }
      else
	return 2;
    }
    else
      return 0;
  }
  else
    return 0;
}
int hidden_p(BYTE cmd,BYTE hdd,BYTE p_no)/*显示或隐藏分区,成功返回1,失败返回0,cmd错误返回2,cmd=1为隐藏,cmd=2为显示*/
{
  BYTE buff[512]="";
  int i;
  DWORD t;
  if(cmd==1)
  {
    if(dpt[p_no-1].flag=='P')
      if(read_sector(0x42,hdd,0,buff))
      {
	for(i=446;i<=494;i++)
	{
	  t=DWORD(buff[i+8]);
	  t=DWORD(buff[i+9])*0x100+t;
	  t=DWORD(buff[i+10])*0x10000+t;
	  t=DWORD(buff[i+11])*0x1000000+t;
	  if(dpt[p_no-1].s_position==t)
	    break;
	}
	buff[i+4]=buff[i+4]+0x10;
	if(read_sector(0x43,hdd,0,buff))
	{
	  CHANGE=1;
	  return 1;
	}
	else
	  return 0;
      }
      else
	return 0;
    else if(dpt[p_no-1].flag=='L')
    {
      if(read_sector(0x42,hdd,dpt[p_no-1].s_position,buff))
      {
	buff[450]=buff[450]+0x10;
	if(read_sector(0x43,hdd,dpt[p_no-1].s_position,buff))
	{
	  CHANGE=1;
	  return 1;
	}
	else
	  return 0;
      }
      else
	return 0;
    }
    else
      return 0;
  }
  else if(cmd==2)
  {
    if(dpt[p_no-1].flag=='P')
      if(read_sector(0x42,hdd,0,buff))
      {
	for(i=446;i<=494;i++)
	{
	  t=DWORD(buff[i+8]);
	  t=DWORD(buff[i+9])*0x100+t;
	  t=DWORD(buff[i+10])*0x10000+t;
	  t=DWORD(buff[i+11])*0x1000000+t;
	  if(dpt[p_no-1].s_position==t)
	    break;
	}
	buff[i+4]=buff[i+4]-0x10;
	if(read_sector(0x43,hdd,0,buff))
	{
	  CHANGE=1;
	  return 1;
	}
	else
	  return 0;
      }
      else
	return 0;
    else if(dpt[p_no-1].flag=='L')
      if(read_sector(0x42,hdd,dpt[p_no-1].s_position,buff))
      {
	buff[450]=buff[450]-0x10;
	if(read_sector(0x43,hdd,dpt[p_no-1].s_position,buff))
	{
	  CHANGE=1;
	  return 1;
	}
	else
	  return 0;
      }
      else
	return 0;
    else
      return 0;
  }
  else
    return 2;
}
int back_mbr(BYTE cmd,BYTE hdd)/*cmd为1时备份MBR到10h扇区,为2时将10h中的数据恢复到0扇区,为3时重写MBR,若没有备份MBR则返回2*/
{
  BYTE buff[512]="";
  int i;
  if(cmd==1)
    if(read_sector(0x42,hdd,0,buff))
      if(read_sector(0x43,hdd,0x10,buff))
	return 1;
      else
	return 0;
    else
      return 0;
  else if(cmd==2)
    if(read_sector(0x42,hdd,0x10,buff))
    {
      if(buff[0]==0)
	return 2;
      if(read_sector(0x43,hdd,0,buff))
      {
	CHANGE=1;
	return 1;
      }
      else
	return 0;
    }
    else
      return 0;
  else if(cmd==3)
    if(read_sector(0x42,hdd,0,buff))
    {
      for(i=0;i<446;i++)
	buff[i]=MBR[i];
      buff[510]=0x55;
      buff[511]=0xaa;
      if(read_sector(0x43,hdd,0,buff))
      {
	CHANGE=1;
	return 1;
      }
      else
	return 0;
    }
    else
      return 0;
  else
    return 0;
}
char *ptype(BYTE sign)
{
  char *type;
  switch(sign)
  {
    case 0x00:type="未使用";break;
    case 0x01:
    case 0x11:type="FAT12";break;
    case 0x06:
    case 0x16:
    case 0x1E:
    case 0x0E:type="FAT16";break;
    case 0x07:
    case 0x17:type="NTFS";break;
    case 0x0B:
    case 0x1B:
    case 0x1C:
    case 0x0C:type="FAT32";break;
    case 0x05:type="未使用";break;
    case 0x0f:type="Ext";break;
    default:type="未知";break;
  }
  return type;
}
int read_dbr(BYTE hdd)/*读取备份DBR*/
{
  int i,j;
  DWORD t;
  BYTE buff[512]="";
  for(i=0;i<24;i++)
  {
    dbr[i].name[0]='\0';
    dbr[i].pflag=0;
    dbr[i].size=0;
    dbr[i].position=0;
    dbr[i].reserve=0;
  }
  if(read_sector(0x42,hdd,0x14,buff))
  {
    DBR=buff[0];
    for(i=0;i<DBR;i++)
    {
      for(j=0;j<6;j++)
	dbr[i].name[j]=buff[i*16+32+j];
      dbr[i].pflag=buff[i*16+38];
      t=DWORD(buff[i*16+39]);
      t=DWORD(buff[i*16+40])*0x100+t;
      t=DWORD(buff[i*16+41])*0x10000+t;
      t=DWORD(buff[i*16+42])*0x1000000+t;
      dbr[i].size=t;
      t=DWORD(buff[i*16+43]);
      t=DWORD(buff[i*16+44])*0x100+t;
      t=DWORD(buff[i*16+45])*0x10000+t;
      t=DWORD(buff[i*16+46])*0x1000000+t;
      dbr[i].position=t;
      dbr[i].reserve=buff[i*16+47];
    }
    return 1;
  }
  else
    return 0;
}
int dbr_bck(BYTE cmd,BYTE hdd,BYTE p_no,char *name,DPT dpt[])/*cmd为1时备份DBR,为2时恢复DBR,成功返回1,失败返回0,没有备份返回2,记录已达最大数返回3*/
{
  BYTE buff[512]="";
  DWORD t;
  int i,j;
  if(!read_dbr(hdd))
    return 0;
  if(cmd==1)/*备份*/
  {
    for(i=0;i<DBR;i++)
      if(dbr[i].position==dpt[p_no-1].s_position)
	break;
    if(i<DBR)
    {
      if(answer(" 记录已经存在,是否覆盖?")==1)
      {
	dbr[i].pflag=dpt[p_no-1].pflag;
	dbr[i].size=dpt[p_no-1].sectors;
	dbr[i].position=dpt[p_no-1].s_position;
	if(dpt[p_no-1].flag=='P')
	  dbr[i].reserve=0;
	else
	  dbr[i].reserve=dpt[p_no-1].ssectors;
	if(read_sector(0x42,hdd,dbr[i].position+dbr[i].reserve,buff))
	{
	  if(read_sector(0x43,hdd,0x15+i,buff))
	  {
	    for(i=0;i<512;i++)
	      buff[i]=0;
	    buff[0]=DBR;
	    for(i=0;i<DBR;i++)
	    {
	      for(j=0;j<6&&dbr[i].name[j]!=0;j++)
		buff[i*16+32+j]=dbr[i].name[j];
	      buff[i*16+32+6]=dbr[i].pflag;
	      buff[i*16+32+7]=dbr[i].size%0x100;
	      buff[i*16+32+8]=dbr[i].size/0x100%0x100;
	      buff[i*16+32+9]=dbr[i].size/0x10000%0x100;
	      buff[i*16+32+10]=dbr[i].size/0x1000000;
	      buff[i*16+32+11]=dbr[i].position%0x100;
	      buff[i*16+32+12]=dbr[i].position/0x100%0x100;
	      buff[i*16+32+13]=dbr[i].position/0x10000%0x100;
	      buff[i*16+32+14]=dbr[i].position/0x1000000;
	      buff[i*16+32+15]=dbr[i].reserve;
	    }
	    if(read_sector(0x43,hdd,0x14,buff))
	      return 1;
	    else
	      return 0;
	  }
	  else
	    return 0;
	}
	else
	  return 0;
      }
    }
    else
    {
      if(DBR<24)
      {
	strcpy(dbr[i].name,strupr(name));
	dbr[i].pflag=dpt[p_no-1].pflag;
	dbr[i].size=dpt[p_no-1].sectors;
	dbr[i].position=dpt[p_no-1].s_position;
	if(dpt[p_no-1].ssectors==dpt[p_no-1].s_position)
	  dbr[i].reserve=0;
	else
	  dbr[i].reserve=dpt[p_no-1].ssectors;
	if(read_sector(0x42,hdd,dbr[i].position+dbr[i].reserve,buff))
	{
	  if(read_sector(0x43,hdd,0x15+i,buff))
	  {
	    DBR++;
	    for(j=0;j<512;j++)
	      buff[j]=0;
	    buff[0]=DBR;
	    for(i=0;i<DBR;i++)
	    {
	      for(j=0;j<6&&dbr[i].name[j]!=0;j++)
		buff[i*16+32+j]=dbr[i].name[j];
	      buff[i*16+32+6]=dbr[i].pflag;
	      buff[i*16+32+7]=dbr[i].size%0x100;
	      buff[i*16+32+8]=dbr[i].size/0x100%0x100;
	      buff[i*16+32+9]=dbr[i].size/0x10000%0x100;
	      buff[i*16+32+10]=dbr[i].size/0x1000000;
	      buff[i*16+32+11]=dbr[i].position%0x100;
	      buff[i*16+32+12]=dbr[i].position/0x100%0x100;
	      buff[i*16+32+13]=dbr[i].position/0x10000%0x100;
	      buff[i*16+32+14]=dbr[i].position/0x1000000;
	      buff[i*16+32+15]=dbr[i].reserve;
	    }
	    if(read_sector(0x43,hdd,0x14,buff))
	      return 1;
	    else
	      return 0;
	  }
	  else
	    return 0;
	}
	else
	  return 0;
      }
      else
	return 3;/*记录已达最大数*/
    }

  }
  else if(cmd==2)/*恢复*/
  {
    for(i=0;i<DBR;i++)
    {
      if(dbr[i].position==dpt[p_no-1].s_position&&dbr[i].size==dpt[p_no-1].sectors)
      {
	if(dbr[i].pflag!=dpt[p_no-1].pflag)
	{
	  if(answer(" 备份前后分区类型不一样,恢复后可能不能正常使用,是否继续?")==1)
	  {
	    if(read_sector(0x42,hdd,0x15+i,buff))
	      if(read_sector(0x43,hdd,dbr[i].position+dbr[i].reserve,buff))
	      {
		CHANGE=1;
		return 1;
	      }
	      else
		return 0;
	    else
	      return 0;
	  }
	  else
	    return 0;
	}
	if(answer(" 你真的要恢复DBR吗?")==1)
	{
	  if(read_sector(0x42,hdd,0x15+i,buff))
	    if(read_sector(0x43,hdd,dbr[i].position+dbr[i].reserve,buff))
	    {
	      CHANGE=1;
	      return 1;
	    }
	    else
	      return 0;
	  else
	    return 0;
	}
      }
    }
    if(i==DBR)
      return 2;
  }
  else
    return 4;/*表示cmd值错误*/
}
int find(char c,char *s)/*返回找到字符在字符串中的位置,找到返回位置,否则返回-1*/
{
  int i;
  if(c>=97&&c<122)
    c-=32;
  for(i=0;*s;i++)
    if(c==*s++)
      return i;
  sound(1500);
  delay(10);
  nosound();
  return -1;
}
int menu(int x,int y,int count,char *m[],char *s)
{
  union inkey
  {
	char ch[2];
	int i ;
  }c ;
  int k,i = 0,j;
  textbackground(1);
  textcolor(15);
  for(j=0;j<count;j++)
  {
    goto_xy(x,y+j);
    cprintf("%s\n\r",*(m+j));
  }
  for(;;)
  {
    j=i;
    textbackground(2);
    textcolor(1);
    goto_xy(x,y+i);
    cprintf(*(m+j));
    while(!bioskey(1));
    c.i=bioskey(0);
    if(c.ch[0])
    {
      k=find(c.ch[0],s);
      if(k!=-1)
	return k;
      switch(c.ch[0])
      {
	case '\n':
	case '\r': return i;
	case ' ':  i++;
		   break;
	case 27: return -1;
	default:
		sound(1500);
		delay(10);
		nosound();

      }
    }
    else
    {
      switch(c.ch[1])
      {
	case 72:i--;
		break;
	case 80:i++;
		break;
	default:
		sound(1500);
		delay(10);
		nosound();
      }
    }
    if(i==count)i=0;
    if(i<0)i=count-1;
    goto_xy(x,y+j);
    textbackground(1);
    textcolor(15);
    cprintf(*(m+j));
    textbackground(2);
    textcolor(1);
    goto_xy(x,y+i);
    cprintf("%s",*(m+i));
  }
}
int p_dpt(int x,int y,char *s,char *sd)
{
  union inkey
  {
	char ch[2];
	int i ;
  }c;
  int i,j,k;
  float used;
  BYTE *type;
  BYTE *pflag,*hidden;
  window(1,1,80,26);
  textbackground(0);
  clrscr();
  goto_xy((80-strlen(sd))/2,1);
  textcolor(14);
  cprintf(sd);
  goto_xy(10,3);
  cprintf(" A--激活分区  C--创建分区  D--删除分区  H--隐藏分区  X--返回");
  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<P_TOTAL;i++)
  {
    type=ptype(dpt[i].pflag);
    pflag=(dpt[i].pflag==0x0f?"*":" ");
    used=(dpt[i].flag=='L'||(dpt[i].flag==0x0&&dpt[i].pflag==0x05))?dpt[i].sectors/double(E_SECTORS)*100:dpt[i].sectors/double(SECTORS)*100;

⌨️ 快捷键说明

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