精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● 电脑病毒>>★反病毒问题与指南★>>[转载] 主引导区恢复源程序(TC2.0)

主题:[转载] 主引导区恢复源程序(TC2.0)
发信人: yangcs()
整理人: emil(2000-06-24 14:36:06), 站内信件
【 以下文字转载自 CLanguage 讨论区 】
【 原文由 老山羊 所发表 】
    这是我刚学C时编的程序,当然用的是MSDOS3.3,几年来不断更新版本。
语句写的极为不好,我准备改进,并加一些注释,以后少上网,有空再说吧。

# define M (long)0xffffl 
# define N 512 
# define N2 (N*2) 
# define N12 (N/2) 
# define CMOSN 1024 
# include <io.h> 
# include <bios.h> 
# include <dos.h> 
# include <conio.h> 
# include <stdio.h> 
unsigned char s[N2],t[N],ss[N2]; 
unsigned int r[N],l[N],head,track,sec; 
static char *scr[]={"1--ycsread","2--ycswrite","3--ycsbf","4--ycssys",
 

      "5--fdisk","6--fdisk1","7--cmosread","8--cmoswrite","9--PAT","0-
 
-exit"}; 
static char pwd[]={'y'-10,'t'-10,'s'-10,'h'-10,'o'-10}; 
struct boot { char s1[28];long hidesec,totalsec;char s2[474]; 
      unsigned int flag0;} boot; 
main(n,c) 
int n; 
char *c[]; 

int i,j; 
char s[100]; 
password(); 
if(n==2) 
  { 
  i=c[1][0]; 
  ycs(i); 
  exit(0); 
  } 

while(1) 
  { 
  i=putscr(); 
  ycs(i); 
  } 


password() 

int i; 
window(1,1,80,25); 
clrscr(); 
gotoxy(20,15); 
cputs("passwd:(1999.04.26)"); 
for(i=0;i<5;i++)
if(getch()!=pwd[i]+10)
i=0;
}

putscr()
{
int i,j,k;
window(1,1,80,25);
clrscr();
window(20,10,60,21);
for(j=0;j<10;j++)
{
gotoxy(1,j+1);
cputs(scr[j]);
}
i=getch();
window(1,1,80,25);
clrscr();
return(i);
}

ycs(int i)
{
switch(i)
{
case '1': ycsread();break;
case '2': ycswrite();break;
case '3': ycsbf();break;
case '4': ycssys();break;
case '5': find55aa();fdisk();break;
case '6': fdisk1();break;
case '7': cmosread();break;
case '8': cmoswrite();break;
case '9': readpat();break;
case '0': exit(0);
}
}

ycsbf()
{
int i,j,k;
char f[100];
f[0]=60;
/* read PAT */
if(biosdisk(2,0x80,0,0,1,1,s)!=0)
{
gotoxy(20,24);
cputs("error read PAT");
sleep(2);
return;
}

/* read ROOT */
findroot();
if(biosdisk(2,0x80,head,track,sec,1,s+N)!=0)
{
gotoxy(20,24);
cputs("read Boot error");
sleep(2);
return;
}

gotoxy(20,15);
cputs("file name:");
cgets(f);
_creat(f+2,0x20);
if((k=_open(f+2,2))==-1)
{
gotoxy(20,24);
cputs("open file error");
sleep(2);
return;
}
if(_write(k,s,N2)==-1)
{
gotoxy(20,24);
cputs("write file error ");
sleep(2);
return;
}
}

ycssys()
{
int i,k;
char f[100];
f[0]=60;

gotoxy(20,15);
cputs("filename:");
cgets(f);
if((k=open(f+2,1))==-1)
{
gotoxy(20,24);
cputs("file not find");
sleep(2);
return;
}
if(_read(k,s,N2)==-1)
{
gotoxy(20,24);
cputs("read file error");
sleep(2);
return;
}

/* write PAT */
if(biosdisk(3,0x80,0,0,1,1,s)!=0)
{
gotoxy(20,24);
cputs("SYS error");
sleep(2);
return;
}

/* write BOOT */
findroot();
if(biosdisk(3,0x80,head,track,sec,1,s+N)!=0)
{
gotoxy(20,24);
cputs("write Boot error");
sleep(2);
return;
}
}


ycsread()
{
int i,j;

if(biosdisk(2,0x80,0,0,1,2,s)!=0)
{
gotoxy(20,24);
cputs("error sys");
sleep(2);
return(1);
}

for(i=0;i<6;i++)
s[N+i]=i;

if(biosdisk(3,0x80,0,0,2,1,s+N)!=0)
{
gotoxy(20,24);
cputs("write flag error");
sleep(2);
return(1);
}

/* read ROOT */
findroot();
if(biosdisk(2,0x80,head,track,sec,1,s+N)!=0)
{
gotoxy(20,24);
cputs("read Boot error");
sleep(2);
return(1);
}


if(biosdisk(3,0x80,0,0,3,2,s)!=0)
{
gotoxy(20,24);
cputs("error write");
sleep(2);
return(1);
}
else
{
gotoxy(20,23);
cputs("YCS tells you: Very good !");
gotoxy(20,24);
cputs("Telephone: 024-86908331,86892522");
sleep(2);
}

}

ycswrite()
{
int i=0;

if(biosdisk(2,0x80,0,0,2,1,s)!=0)
{
gotoxy(20,24);
cputs("read flag error");
sleep(2);
return(1);
}

for(i=0;i<6;i++)
if(s[i]!=i)
{
gotoxy(20,24);
cputs("flag error!");
sleep(2);
return(1);
}

if(biosdisk(2,0x80,0,0,3,2,s)!=0)
{
gotoxy(20,24);
cputs("read PAT OR ROOT error");
sleep(2);
return(1);
}

for(i=0x1c2;i<N;i+=0x10)
if((s[i]==1)||(s[i]==4)||(s[i]==6)||(s[i]==0x0b))
{
head=s[i-3];
sec=s[i-2]&0x3f;
track=(((int)(s[i-2]>>6))<<8)|s[i-1];
}

if(biosdisk(3,0x80,0,0,1,1,s)!=0)
{
gotoxy(20,24);
cputs("SYS write error");
sleep(2);
return(1);
}

if(biosdisk(2,0x80,head,track,sec,1,s)!=0)
{
gotoxy(20,24);
cputs("error");
sleep(2);
return(1);
}

if(biosdisk(3,0x80,0,0,5,1,s)!=0)
{
gotoxy(20,24);
cputs("error");
sleep(2);
return(1);
}

if(biosdisk(3,0x80,head,track,sec,1,s+N)!=0)
{
gotoxy(20,24);
cputs("Boot write error");
sleep(2);
return(1);
}
return(0);
}

findroot()
{
int i;
for(i=0x1c2;i<N;i+=0x10)
if((s[i]==1)||(s[i]==4)||(s[i]==6)||(s[i]==0x0b))
{
head=s[i-3];
sec=s[i-2]&0x3f;
track=(((int)(s[i-2]>>6))<<8)|s[i-1];
}
}

find55aa()
{
int i,n;
n=peek(peek(0,0x106),peek(0,0x104));
for(i=1;i<n;i++)
{
biosdisk(2,0x80,0,i,1,1,r);
if(r[N12-1]==0xaa55)
cprintf("%5d",i-1);
}
}

fdisk()
{
int ii,jj,fp;

fp=_open("SYS",1);
_read(fp,s,N);
_close(fp);

fdisk0(s);
}

fdisk0(s)
struct word { unsigned sec:6;unsigned track:10;} ;
struct fd {unsigned char bz0,head0;struct word word0;
unsigned char bz1,head1;struct word word1;
unsigned long int fd0,fd1;};
struct s {unsigned char a[0x1be];struct fd bd[4];unsigned int bz;} *s;


{
unsigned int s1,s2,head,track,sec;
unsigned long i,j,k,fd0,fd1,jj,nn;

int fp;
s2=peek(0,0x104); s1=peek(0,0x106);
track=peek(s1,s2)-1;s2+=2; head=peekb(s1,s2);s2+=12; sec=peekb(s1,s2

);
head &= 0xff;
biosdisk(2,0x80,1,0,1,1,&boot);
gotoxy(5,5);
cprintf("track:%5d head:%5d sec:%5d",track,head,sec);

i=sec*head; k=M/i; j= (k>track) ? track:k; 
nn=boot.hidesec+boot.totalsec; 
s1=(int)(nn/i); 
gotoxy(5,7); 
cprintf("MSDOS3.3 (C:32M) : %ld   \/   total : %d",j-1,track); 
/* 
cprintf("%ld %d %ld %4x",nn,s1,i,boot.flag0); 
*/ 

if((s1*i==nn)&&(boot.flag0==0xaa55)) 
  cprintf("   \/   default : %d",s1); 
gotoxy(5,9); 
cprintf("Please input a number (0 return) : "); 
cscanf("%ld",&jj); 
if(!jj) 
  return; 

(*s).bd[0].bz0=0x80; 
(*s).bd[0].head0=1; 
(*s).bd[0].word0.sec=1; 
(*s).bd[0].word0.track=0; 
(*s).bd[0].bz1 = (jj<=j) ? 4:6;
(*s).bd[0].head1=head-1;
(*s).bd[0].word1.sec=sec;
(*s).bd[0].word1.track=(jj<<2)+(jj>>8); 
(*s).bd[0].fd0=sec; 
(*s).bd[0].fd1=(jj*i)-(long)sec; 

if(jj<track)
{
jj++;
(*s).bd[1].bz0=0;
(*s).bd[1].head0=0;
(*s).bd[1].word0.sec=1;
(*s).bd[1].word0.track=(jj<<2)+(jj>>8); 
   (*s).bd[1].bz1=5; 
   (*s).bd[1].head1=head-1; 
   (*s).bd[1].word1.sec=sec; 
   (*s).bd[1].word1.track=(track<<2)+(track>>8); 
   (*s).bd[1].fd0=i*jj; 
   (*s).bd[1].fd1=(long)(track-jj)*i; 
   } 

biosdisk(3,0x80,0,0,1,1,s); 


cmosread() 

int i,j; 
unsigned char s[N]; 
char f[100]; 
gotoxy(20,15); 
cputs("read CMOS Name:"); 
f[0]=60; 
cgets(f); 
_creat(f+2,0x20); 
if((j=_open(f+2,4))==-1) 
   { 
   gotoxy(20,24); 
   cputs("file open error"); 
   sleep(2); 
   return(1); 
   } 
for(i=0;i<CMOSN;i++)
{
outportb(0x70,i);
s[i]=inportb(0x71);
}
if(_write(j,s,N)<=0)
{
gotoxy(20,24);
cputs("file write error");
sleep(2);
return(1);
}
_close(j);
gotoxy(20,24);
cputs("yes");
}

cmoswrite()
{
int i,k,j;
unsigned char s[N],f[100];
f[0]=60;
gotoxy(20,15);
cputs("write CMOS name:");
cgets(f);
if((j=_open(f+2,4))==-1)
{
gotoxy(20,24);
cputs("file not found");
sleep(2);
return(1);
}
if(_read(j,s,CMOSN)<CMOSN)
{
gotoxy(20,24);
cputs("file not found");
sleep(2);
return(1);
}
for(i=N-1;i>=0;i--) 
   { 
   outportb(0x70,i); 
   outportb(0x71,s[i]); 
   } 
_close(j); 
gotoxy(20,16); 
cputs("yes"); 
sleep(2); 


fdisk1() 

int i; 
char f[100]; 
unsigned char s[N],t[N]; 

i=_open("SYS",1); 
if(_read(i,s,N)==-1) 
  { 
  gotoxy(20,24); 
  cputs("file not find"); 
  sleep(2); 
  return(0); 
  } 

if(biosdisk(2,0x80,0,0,1,1,t)!=0) 
  { 
  gotoxy(20,24); 
  cputs("read PAT error"); 
  sleep(2); 
  return(0); 
  } 

for(i=0x1be;i<0x1fe;i++)
s[i]=t[i];
if(biosdisk(3,0x80,0,0,1,1,s)!=0)
{
gotoxy(20,24);
cputs("write PAT error");
sleep(2);
return(0);
}
}

readpat()
{
int i,j,k,k1,k2;
struct word { unsigned sec:6;unsigned track:10;} ;
struct fd {unsigned char bz0,head0;struct word word0;
unsigned char bz1,head1;struct word word1;
unsigned long int fd0,fd1;};
struct s {unsigned char a[0x1be];struct fd bd[4];unsigned int bz;} ss;


window(1,1,80,25);
clrscr();
if(biosdisk(2,0x80,0,0,1,1,s)!=0)
{
gotoxy(20,24);
cputs("error sys");
sleep(2);
return(1);
}

gotoxy(5,1);
for(k=0,j=0;j<8;j++)
{
cprintf(" %2x",(k++)&0xf);
cprintf("%2x",(k++)&0xf);
cprintf("%2x",(k++)&0xf);
cprintf("%2x",(k++)&0xf);
}

for(k=0,i=0;i<16;i++)
{
gotoxy(1,i+2);
cprintf("%04x",i*32);
for(j=0;j<8;j++)
{
cprintf(" %02x",s[k++]);
cprintf("%02x",s[k++]);
cprintf("%02x",s[k++]);
cprintf("%02x",s[k++]);
}
}
gotoxy(1,20);
biosdisk(2,0x80,0,0,1,1,&ss);
cprintf("System Boot Side0 Cylinder0 sector0 Side1 Cylinder1 sector1

sectors1 sectors2\r\n");
for(i=0;i<4;i++)
{
switch((int)ss.bd[i].bz1)
{
case 0: continue;
case 0x01: cputs("FAT-12");break;
case 0x02: cputs(" Xenix");break;
case 0x04: cputs("FAT-16");break;
case 0x05: cputs("ExtDOS");break;
case 0x06: cputs("BigDOS");break;
case 0x0b: cputs("FAT-32");break;
case 0x63: cputs(" unix");break;
default: cputs(" ? ");
}
if (ss.bd[i].bz0==0x80) cputs(" Yes"); else cputs(" No");
k1=((ss.bd[i].word0.track&3)<<8)|(ss.bd[i].word0.track>>2); 
   k2=((ss.bd[i].word1.track&3)<<8)|(ss.bd[i].word1.track>>2); 
   cprintf("%6d%10d%8d",ss.bd[i].head0,k1,ss.bd[i].word0.sec); 
   cprintf("%6d%10d%8d",ss.bd[i].head1,k2,ss.bd[i].word1.sec); 
   cprintf("%10ld%10ld\n\r",ss.bd[i].fd0,ss.bd[i].fd1); 
   } 
bioskey(0); 


--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.110.6.48]
--
※ 转载:.月光软件站 http://www.moon-soft.com.[FROM: 202.110.9.186]

[关闭][返回]