发信人: 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]
  | 
 
 
 |