发信人: yangcs()
整理人: emil(2000-06-24 14:36:14), 站内信件
|
【 以下文字转载自 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]
|
|