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

📄 srpd.cpp

📁 该软件是一个纯中文的DOS硬盘分区管理程序,它除了居有分区管理外还有MBR、DBR备份/恢复功能。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	}
	else
	  return 0;
      }
      else
	return 0;
    }
    else
    {
      if(read_sector(0x42,hdd,dpt[p_no-1].s_position,buff))
      {
	if(read_sector(0x42,hdd,dpt[p_no-2].s_position,buff1))
	{
	  if(dpt[p_no-2].flag!='E')
	  {
	    for(i=462;i<478;i++)
	      buff1[i]=buff[i];
	    if(read_sector(0x43,hdd,dpt[p_no-2].s_position,buff1))
	    {
	      CHANGE=1;
	      return 1;
	    }
	    else
	      return 0;
	  }
	  else
	  {
	    for(i=446;i<462;i++)
	      buff1[i]=buff1[i+16];
	    if(read_sector(0x43,hdd,dpt[p_no-1].s_position,buff1))
	    {
	      CHANGE=1;
	      return 1;
	    }
	    else
	      return 0;
	  }
	}
	else
	  return 0;
      }
      else
	return 0;
    }
  }
  else
  {
    if(dpt[p_no-1].flag=='E')
      if(PNO_L>0)
	return 2;
    if(read_sector(0x42,hdd,0,buff))
    {
      for(i=446;i<=494;i+=16)
      {
	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)
	{
	  for(j=i;j<510;j++)
	    buff[j]=buff[j+16];
	  for(j=446+(PNO_M-1)*16;j<510;j++)
	    buff[j]=0x0;
	  break;
	}
      }
      if(read_sector(0x43,hdd,0,buff))
      {
	CHANGE=1;
	return 1;
      }
      else
	return 0;
    }
    else
      return 0;
  }
}
/*cmd为1时创建主分区,为2时创建扩展分区,为3时创建逻辑分区,成功返回1,失败返回0,返回2时为cmd值错误,若为3时写DBR错误*/
int create_p(BYTE cmd,BYTE hdd,BYTE p_no,DWORD size,DWORD position)
{
  BYTE buff[512]="";
  BYTE buff1[16]="";
  DWORD t;
  int i,j;
  void notice(char *s);
  t=size/255/63;
  size=t*255*63;
  if(cmd==1||cmd==2)
  {
    if(read_sector(0x42,hdd,0,buff))
    {
      if(buff[450]==0)
	for(i=0;i<512;i++)
	  buff[i]=MBR[i];
      for(i=446;i<=494;i+=16)
      {
	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(t>position||t==0)
	  break;
      }
      for(j=509;j-16>=i;j--)
	buff[j]=buff[j-16];
      buff[i]=0x0;
      if(i==446)
      {
	buff[i+1]=0x01;
	size-=0x3f;
      }
      else
	buff[i+1]=0x00;
      if(position/63/255<256)
	buff[i+2]=0x01;
      else if(position/63/255<512)
	buff[i+2]=0x41;
      else if(position/63/255<768)
	buff[i+2]=0x81;
      else
	buff[i+2]=0xc1;
      if(position/63/255<256)
	buff[i+3]=position/63/255;
      else if(position/63/255<512)
	buff[i+3]=position/63/255-256;
      else if(position/63/255<768)
	buff[i+3]=position/63/255-512;
      else if(position/63/255<1024)
	buff[i+3]=position/63/255-768;
      else
	buff[i+3]=0xff;
      if(i==446)
	if(cmd==2)
	  if(position==0)
	  {
	    buff[i+3]=1;
	    buff[i+1]=0;
	    position+=255*63;
	    size-=255*63;
	  }
      if(cmd==1)
	buff[i+4]=0x0c;
      else
	buff[i+4]=0x0f;
      t=size+position;
      buff[i+5]=0xfe;
      if(t/63/255<256)
	buff[i+6]=0x3f;
      else if(t/63/255<512)
	buff[i+6]=0x7f;
      else if(t/63/255<768)
	buff[i+6]=0xbf;
      else
	buff[i+6]=0xff;
      if(t/63/255<256)
	buff[i+7]=t/63/255;
      else if(t/63/255<512)
	buff[i+7]=t/63/255-256;
      else if(t/63/255<768)
	buff[i+7]=t/63/255-512;
      else if(t/63/255<1024)
	buff[i+7]=t/63/255-768;
      else
	buff[i+7]=0xff;
      if(position!=0)
      {
	buff[i+8]=position%0x100;
	buff[i+9]=position/0x100%0x100;
	buff[i+10]=position/0x10000%0x100;
	buff[i+11]=position/0x1000000;
      }
      else
      {
	buff[i+8]=0x3f;
	buff[i+9]=0;
	buff[i+10]=0;
	buff[i+11]=0;
      }
      buff[i+12]=size%0x100;
      buff[i+13]=size/0x100%0x100;
      buff[i+14]=size/0x10000%0x100;
      buff[i+15]=size/0x1000000;
      if(read_sector(0x43,hdd,0,buff))
      {
	for(j=0;j<512;j++)
	  buff[j]=0;
	if(i==446)
	  if(read_sector(0x43,hdd,position+0x3f,buff))
	    if(read_sector(0x43,hdd,position+0x3f+6,buff))
	    {
	      CHANGE=1;
	      return 1;
	    }
	  else
	    return 3;
	else
	  if(read_sector(0x43,hdd,position,buff))
	    if(read_sector(0x43,hdd,position+6,buff))
	    {
	      CHANGE=1;
	      return 1;
	    }
	  else
	    return 3;
      }
      else
	return 0;
    }
    else
      return 0;
  }
  else if(cmd==3)
  {
    if(dpt[p_no-2].flag=='E')
    {
      if(PNO_L==0)
	for(i=0;i<512;i++)
	  buff[i]=0;
      else
	if(read_sector(0x42,hdd,dpt[p_no-1].s_position,buff)==0)
	  return 0;
      for(i=446;i<462;i++)
	buff[i+16]=buff[i];
      i=446;
      buff[i+1]=0x01;
      size-=0x3f;
      if(position/63/255<256)
	buff[i+2]=0x01;
      else if(position/63/255<512)
	buff[i+2]=0x41;
      else if(position/63/255<768)
	buff[i+2]=0x81;
      else
	buff[i+2]=0xc1;
      if(position/63/255<256)
	buff[i+3]=position/63/255;
      else if(position/63/255<512)
	buff[i+3]=position/63/255-256;
      else if(position/63/255<768)
	buff[i+3]=position/63/255-512;
      else if(position/63/255<1024)
	buff[i+3]=position/63/255-768;
      else
	buff[i+3]=0xff;
      buff[i+4]=0x0c;
      t=size+position+0x3f;
      buff[i+5]=0xfe;
      if(t/63/255<256)
	buff[i+6]=0x3f;
      else if(t/63/255<512)
	buff[i+6]=0x7f;
      else if(t/63/255<768)
	buff[i+6]=0xbf;
      else
	buff[i+6]=0xff;
      if(t/63/255<256)
	buff[i+7]=t/63/255;
      else if(t/63/255<512)
	buff[i+7]=t/63/255-256;
      else if(t/63/255<768)
	buff[i+7]=t/63/255-512;
      else if(t/63/255<1024)
	buff[i+7]=t/63/255-768;
      else
	buff[i+7]=0xff;
      buff[i+8]=0x3f;
      buff[i+9]=0;
      buff[i+10]=0;
      buff[i+11]=0;
      buff[i+12]=size%0x100;
      buff[i+13]=size/0x100%0x100;
      buff[i+14]=size/0x10000%0x100;
      buff[i+15]=size/0x1000000;
      buff[510]=0x55;
      buff[511]=0xaa;
      if(read_sector(0x43,hdd,position,buff))
      {
	for(i=0;i<512;i++)
	  buff[i]=0x0;
	if(read_sector(0x43,hdd,position+0x3f,buff))
	  if(read_sector(0x43,hdd,position+0x3f+6,buff))
	  {
	    CHANGE=1;
	    return 1;
	  }
	else
	  return 3;
      }
      else
	return 0;
    }
    else
    {
      if(read_sector(0x42,hdd,dpt[p_no-2].s_position,buff))
      {
	for(i=0;i<16;i++)
	  buff1[i]=buff[462+i];
	buff[462]=0;
	buff[463]=0x0;
	if(position/63/255<256)
	  buff[464]=0x01;
	else if(position/63/255<512)
	  buff[464]=0x41;
	else if(position/63/255<768)
	  buff[464]=0x81;
	else
	  buff[464]=0xc1;
	if(position/63/255<256)
	  buff[465]=position/63/255;
	else if(position/63/255<512)
	  buff[465]=position/63/255-256;
	else if(position/63/255<768)
	 buff[465]=position/63/255-512;
	else if(position/63/255<1024)
	  buff[465]=position/63/255-768;
	else
	  buff[465]=0xff;
	buff[466]=0x05;
	buff[467]=0xfe;
	t=position+size;
	if(t/63/255<256)
	  buff[468]=0x3f;
	else if(t/63/255<512)
	  buff[468]=0x7f;
	else if(t/63/255<768)
	  buff[468]=0xbf;
	else
	  buff[468]=0xff;
	if(t/63/255<256)
	  buff[469]=t/63/255;
	else if(t/63/255<512)
	  buff[469]=t/63/255-256;
	else if(t/63/255<768)
	 buff[469]=t/63/255-512;
	else if(t/63/255<1024)
	  buff[469]=t/63/255-768;
	else
	  buff[469]=0xff;
	t=position-M_SECTORS;
	buff[470]=t%0x100;
	buff[471]=t/0x100%0x100;
	buff[472]=t/0x10000%0x100;
	buff[473]=t/0x1000000;
	buff[474]=size%0x100;
	buff[475]=size/0x100%0x100;
	buff[476]=size/0x10000%0x100;
	buff[477]=size/0x1000000;
	if(read_sector(0x43,hdd,dpt[p_no-2].s_position,buff))
	{
	  for(i=446;i<462;i++)
	    buff[i]=buff[i+16];
	  for(i=0;i<16;i++)
	    buff[462+i]=buff1[i];
	  buff[447]=0x01;
	  buff[448]=0xc1;
	  buff[450]=0x0c;
	  buff[454]=0x3f;
	  buff[455]=0x0;
	  buff[456]=0x0;
	  buff[457]=0x0;
	  size-=0x3f;
	  buff[458]=size%0x100;
	  buff[459]=size/0x100%0x100;
	  buff[460]=size/0x10000%0x100;
	  buff[461]=size/0x1000000;
	  buff[510]=0x55;
	  buff[511]=0xaa;
	  if(read_sector(0x43,hdd,position,buff))
	  {
	    for(i=0;i<512;i++)
	      buff[i]=0x0;
	    if(read_sector(0x43,hdd,position+0x3f,buff))
	      if(read_sector(0x43,hdd,position+0x3f+6,buff))
	      {
		CHANGE=1;
		return 1;
	      }
	    else
	      return 3;/*DBR写错误*/
	  }
	  else
	    return 0;
	}
	else
	  return 0;
      }
      else
	return 0;
    }
  }
  else
    return 2;/*cmd值错误*/
}
int back_dpt(BYTE cmd,BYTE hdd)/*备份和恢复DPT,cmd为1时备份DPT,为2时恢复DPT,成功返回1,失败返回0,没有备份DPT返回2*/
{
  BYTE buff[512]="",buff1[512]="";
  int i,j,k,lp,tp;
  DWORD t,t1,t2,m_sectors;
  if(cmd==1)
  {
    for(i=0,j=16;i<P_TOTAL;i++,j+=20)
    {
      if(dpt[i].flag==0x00)
	continue;
      buff[j]=dpt[i].bflag;
      buff[j+1]=dpt[i].head;
      buff[j+2]=dpt[i].sector;
      buff[j+3]=dpt[i].cylinder;
      buff[j+4]=dpt[i].pflag;
      buff[j+5]=dpt[i].ehead;
      buff[j+6]=dpt[i].esector;
      buff[j+7]=dpt[i].ecylinder;
      buff[j+8]=dpt[i].ssectors%0x100;
      buff[j+9]=dpt[i].ssectors/0x100%0x100;
      buff[j+10]=dpt[i].ssectors/0x10000%0x100;
      buff[j+11]=dpt[i].ssectors/0x1000000;
      buff[j+12]=dpt[i].sectors%0x100;
      buff[j+13]=dpt[i].sectors/0x100%0x100;
      buff[j+14]=dpt[i].sectors/0x10000%0x100;
      buff[j+15]=dpt[i].sectors/0x1000000;
      buff[j+16]=dpt[i].s_position%0x100;
      buff[j+17]=dpt[i].s_position/0x100%0x100;
      buff[j+18]=dpt[i].s_position/0x10000%0x100;
      buff[j+19]=dpt[i].s_position/0x1000000;
      buff[0]++;
      if(dpt[i].flag=='P')
	buff[2]++;
      else if(dpt[i].flag=='L')
	buff[4]++;
    }
    if(read_sector(0x43,hdd,0x12,buff))
      return 1;
    else
      return 0;
  }
  else if(cmd==2)
  {
    if(read_sector(0x42,hdd,0x12,buff))
    {
      if(buff[0]!=0)
      {
	tp=buff[0];
	lp=buff[4];
	for(i=16;i<16+tp*20;i+=20)
	  if(buff[i+4]==0x0f)
	    break;
	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;
	m_sectors=t;
	for(j=1;j<=lp;j++)
	{ t1=t;
	  t=DWORD(buff[j*20+i+16]);
	  t=DWORD(buff[j*20+i+17])*0x100+t;
	  t=DWORD(buff[j*20+i+18])*0x10000+t;
	  t=DWORD(buff[j*20+i+19])*0x1000000+t;
	  if(j==1)
	  {
	    if(t==m_sectors)
	    {
	      for(k=0;k<16;k++)
	      {
		buff1[446+k]=buff[j*20+i+k];
	      }
	      if(read_sector(0x43,hdd,t,buff1)==0)
		return 0;
	    }
	  }
	  else
	  {
	    if(read_sector(0x42,hdd,t1,buff1))
	    {
	      for(k=0;k<16;k++)
		 buff1[462+k]=buff[j*20+i+k];
	      t2=t-m_sectors;
	      buff1[463]=0x00;
	      buff1[466]=0x05;
	      buff1[470]=t2%0x100;
	      buff1[471]=t2/0x100%0x100;
	      buff1[472]=t2/0x10000%0x100;
	      buff1[473]=t2/0x1000000;
	      t2=DWORD(buff[j*20+i+12]);
	      t2=DWORD(buff[j*20+i+13])*0x100+t2;
	      t2=DWORD(buff[j*20+i+14])*0x10000+t2;
	      t2=DWORD(buff[j*20+i+15])*0x1000000+t2;
	      t2+=0x3f;
	      buff1[474]=t2%0x100;
	      buff1[475]=t2/0x100%0x100;
	      buff1[476]=t2/0x10000%0x100;
	      buff1[477]=t2/0x1000000;
	      buff1[510]=0x55;
	      buff1[511]=0xaa;
	      if(read_sector(0x43,hdd,t1,buff1))
	      {
		for(k=0;k<512;k++)
		  buff1[k]=0;

⌨️ 快捷键说明

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