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

📄 fatmain.c

📁 硬盘扇区读写技术-修复硬盘与恢复文件随书源代码
💻 C
字号:
//********************************************
//文件名:FATMAIN.C
//功能:1. 调用显示汉字函数
//      2. 调用字符处理函数
//      3. 调用读扇区汇编子程序
//      4. 查找FAT表并建立扇区数据文件
//      5. 将找到的扇区数据用十六进制显示
//********************************************
#include<string.h>                          //1.
#include<graphics.h>                        //2.
#include<stdio.h>                           //3.
#include<conio.h>                           //4.
#include<ctype.h>                           //5.
#include<fcntl.h>                           //6.
#include<io.h>                              //7.
#include<stdlib.h>                          //8.
#include<dos.h>                             //9.
extern RHD(int,int,int,int,char *);         //10.声明读扇区汇编子程序
int outhz(int,int,char *,int);              //11.声明汉字显示函数
void finame(int,int);                       //12.声明字符处理函数
void disph(void);                           //13.声明十六进制显示函数
void sou(void);                             //14.声明发声函数
unsigned char h[512];                       //15.
void main(int argc,char *argv[])            //16.
{                                           //17.
  FILE *tmfp,*fp;                           //18.
  int i,c,m;                                //19.
  char name[13];                            //20.
  char sh[13];                              //21.
  char fh[512];                             //22.
  char th[20];                              //23.
  unsigned long k;                          //24.
  long t=0;                                 //25.
  unsigned char s1,s2,s3,s4;                //26.
  extern char gsh[16];                      //27.
  int gdriver=DETECT,gmode;                 //28.
  registerbgidriver(EGAVGA_driver);         //29.
  initgraph(&gdriver,&gmode,"");            //30.
  setbkcolor(0);                            //31.
  cleardevice();                            //32.
                                            //33.
  if(argc==1)                               //34.
  {                                         //35.
    outhz(0,20,"输入[HFATFIND /?]"          //36.
    "获得帮助",7);                          //37.
    outhz(0,40,"按任一键退出",7);           //38.
    getch();                                //39.
    closegraph();                           //40.
    exit(0);                                //41.
  }                                         //42.
  strcpy(sh,argv[1]);                       //43.
  if((strcmp(sh,"/?")==0)&&argc==2)         //44.显示帮助提示
  {                                         //45.
    outhz(0,20,"程序HFATFIND.EXE"           //46.
    "使用方法:",7);                        //47.
    outhz(0,40,"1. [HFATFIND /?]"           //48.
    "获得帮助",7);                          //49.
    outhz(0,60,"2. [HFATFIND /+]"           //50.
    "是向扇区号增加的方向查找",7);          //51.
    outhz(0,80,"3. [HFATFIND /-]"           //52.
    "是向扇区号减少的方向查找",7);          //53.
    outhz(0,100,"按任一键退出",7);          //54.
    getch();                                //55.
    closegraph();                           //56.
    exit(0);                                //57.
  }                                         //58.
                                            //59.
  if((strcmp(sh,"/+")==0)                   //60.判断程序开关
   ||(strcmp(sh,"/-")==0)&&argc==2)         //61.
  {                                         //62.
    setviewport(0,20,400,40,0);             //63.
    outhz(0,20,"输入需要建立的文件名:",7); //64.
    finame(190,40);                         //65.
    strcpy(name,gsh);                       //66.
    if((fp=fopen(gsh,"rb"))!=NULL)          //67.如果打开文件成功
    {                                       //68.
      fclose(fp);                           //69.
      setviewport(0,40,400,60,0);           //70.
      strcat(gsh,"文件在当前目录下"         //71.
      "已经存在!");                        //72.
      outhz(0,20,gsh,14);                   //73.
      outhz(0,40,"是否继续运行"             //74.
      "(Y/N)?",15);                   //75.
      c=toupper(getch());                   //76.
      while((c==78)||(c==89))               //77.
      {                                     //78.
        if(c==78)                           //79.
        {                                   //80.
          closegraph();                     //81.
          exit(0);                          //82.
        }                                   //83.
        if(c==89)                           //84.
          break;                            //85.
      }                                     //86.
    }                                       //87.
    cleardevice();                          //88.
    setviewport(0,20,400,40,0);             //89.
    outhz(0,20,"输入查找的起始扇区号:",7); //90.
    finame(190,40);                         //91.
    k=atol(gsh);                            //92.
    m=0;                                    //93.
    while(1)                                //94.
    {                                       //95.
      tmfp=tmpfile();                       //96.
      fwrite(&k,4,1,tmfp);                  //97.
      rewind(tmfp);                         //98.
      fread(&s4,1,1,tmfp);                  //99.
      fread(&s3,1,1,tmfp);                  //100.
      fread(&s2,1,1,tmfp);                  //101.
      fread(&s1,1,1,tmfp);                  //102.
      fclose(tmfp);                         //103.
      RHD(s1,s2,s3,s4,name);                //104.
      fp=fopen(name,"rb");                  //105.
      for(i=0;i<=511;i++)                   //106.
        h[i]=fgetc(fp);                     //107.
      fclose(fp);                           //108.
      if((h[0]==0xf8)&&(h[1]==0xff))        //109.判断前两个字节是否为f8 ff
      {                                     //110.
        m=3;                                //111.设置标志
        break;                              //112.
      }                                     //113.
      cleardevice();                        //114.
      setviewport(0,20,400,40,0);           //115.
      outhz(0,20,"当前查找的扇区号是:",7); //116.
      outhz(0,40,"按任一键终止查找",15);    //117.
      ltoa(k,th,10);                        //118.
      outhz(180,20,th,7);                   //119.
      clearviewport();                      //120.
      if(kbhit()!=0)                        //121.判断是否有键按下
      {                                     //122.
        c=toupper(getch());                 //123.
        if(c!=0)                            //124.
        {                                   //125.
          cleardevice();                    //126.
          setviewport(0,20,400,40,0);       //127.
          outhz(0,20,"目前查找扇区的"       //128.
          "终止编号是:",7);                //129.
          outhz(0,40,"按任一键退出",7);     //130.
          outhz(230,20,th,7);               //131.
          getch();                          //132.
        }                                   //133.
        break;                              //134.
      }                                     //135.
      if((strcmp(sh,"/+"))==0)              //136.向扇区号增加的方向查找
        k++;                                //137.
      if((strcmp(sh,"/-"))==0)              //138.向扇区号减少的方向查找
        k--;                                //139.
    }                                       //140.
                                            //141.
    if(m==3)                                //142.找到扇区标志
    {                                       //143.
      fp=fopen(name,"rb");                  //144.
      for(i=0;i<=511;i++)                   //145.
      {                                     //146.
        h[i]=fgetc(fp);                     //147.
      }                                     //148.
      fclose(fp);                           //149.
      cleardevice();                        //150.
      setviewport(0,0,620,20,0);            //151.
      disph();                              //152.显示十六进制数据
      setviewport(0,320,400,400,0);         //153.
      outhz(0,0,"上面显示的是扇区文件"      //154.
      "十六进制数据:",7);                  //155.
      fp=fopen(name,"rb");                  //156.
      for(i=0;i<=511;i++)                   //157.
      {                                     //158.
        fh[i]=fgetc(fp);                    //159.
      }                                     //160.
      fclose(fp);                           //161.
      for(i=0;i<=511;i++)                   //162.
        t+=fh[i];                           //163.字节累加
      ltoa(t,th,10);                        //164.
      outhz(0,40,"字节总算术和是:",7);     //165.
      outhz(140,40,th,7);                   //166.
      outhz(0,60,"找到需要的扇区号是:",7); //167.
      ltoa(k,th,10);                        //168.
      outhz(180,60,th,7);                   //169.
      outhz(0,80,"按任一键退出",7);         //170.
      sou();                                //171.调用发声函数
    }                                       //172.
  }                                         //173.
  closegraph();                             //174.
}                                           //175.
char gsh[16];                               //176.定义全局变量
                                            //177.
void disph()                                //178.十六进制显示函数
{                                           //179.
  FILE *tmfp;                               //180.
  char q[2];                                //181.
  int x,y,m;                                //182.
  int i,j,k,l;                              //183.
  int x1,x2,y1,y2;                          //184.
  x1=0;  x2=600;                            //185.
  y1=0;  y2=20;                             //186.
  i=0;  j=0;                                //187.
  while(j<16)                               //188.
  {                                         //189.
    setviewport(x1,y1,x2,y2,0);             //190.
    x=0;  y=0;  k=0;                        //191.
    while(k<32)                             //192.
    {                                       //193.
      moveto(x,y);                          //194.
      tmfp=tmpfile();                       //195.
      m=h[i];                               //196.
      fprintf(tmfp,"%2x",m);                //197.
      rewind(tmfp);                         //198.
      l=0;                                  //199.
      while(l<2)                            //200.
      {                                     //201.
        *q=fgetc(tmfp);                     //202.
        *(q+1)='\0';                        //203.
        settextstyle(DEFAULT_FONT,          //204.
        HORIZ_DIR,1);                       //205.
        outtextxy(x,y+4,q);                 //206.
        x+=8+1;  l++;                       //207.
      }                                     //208.
      i++;   k++;                           //209.
      fclose(tmfp);                         //210.
    }                                       //211.
    j++;                                    //212.
    y1=y1+20;  y2=y2+20;                    //213.
  }                                         //214.
}                                           //215.
                                            //216.
void sou(void)                              //217.发声函数
{                                           //218.
  unsigned long t;                          //219.
  unsigned i;                               //220.
  int j;                                    //221.
  while(1)                                  //222.
  {                                         //223.
    i=1800;                                 //224.
    for(j=0;j<=2;j++)                       //225.
    {                                       //226.
      sound(i);                             //227.
      for(t=0;t<20000000;t++)               //228.
      ;                                     //229.
      i=i+200;                              //230.
      nosound();                            //231.
    }                                       //232.
    i=i-300;                                //233.
    sound(i);                               //234.
    for(t=0;t<20000000;t++)                 //235.
    ;                                       //236.
    nosound();                              //237.
    for(t=0;t<100000000;t++)                //238.
    ;                                       //239.
    if(kbhit()!=0)                          //240.
      break;                                //241.
  }                                         //242.
}                                           //243.

⌨️ 快捷键说明

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