📄 srpd.cpp
字号:
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 + -