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

📄 allse.c

📁 硬盘扇区读写技术-修复硬盘与恢复文件随书源代码
💻 C
字号:
//********************************************
//文件名:ALLSE.C
//功能:对扇区数据进行十六进制读、字符读、
//      备份、拷贝、搬移、写入、清零操作
//********************************************
#include<stdio.h>                               //1.
#include<bios.h>                                //2.
#include<string.h>                              //3.
#include<stdlib.h>                              //4.
void main(int argc,char *argv[])                //5.使用命令行参数
{                                               //6.
   char h[512];                                 //7.存放扇区数据
   char ch[13];                                 //8.存放文件名
   char sh[13];                                 //9.存放程序开关字符串
   FILE *fp;                                    //10.
   int i,c;                                     //11.
   int cyl,head,sector;                         //12.定义柱面、磁头、扇区变量
   int cyl1,head1,sector1;                      //13.定义目的变量
                                                //14.
   if(argc==1)                                  //15.命令行参数等于1时
   {                                            //16.
     printf("Enter ALLSE /? to get help.");     //17.输出提示
     printf("\n");                              //18.
     exit(0);                                   //19.
   }                                            //20.
                                                //21.
   strcpy(sh,argv[1]);                          //22.拷贝程序开关字符串
   if((strcmp(sh,"/?")==0)&&argc==2)            //23.比较开关字符串
   {                                            //24.
     printf("The syntax of ALLSE.EXE is:");     //25.输出提示
     printf("\n");                              //26.
     printf("1.ALLSE [/?] is to get help.");    //27.
     printf("\n");                              //28.
     printf("2.ALLSE [/rh] is read sector.");   //29.
     printf("\n");                              //30.
     printf("3.ALLSE [/rc] is read sector.");   //31.
     printf("\n");                              //32.
     printf("4.ALLSE [/b] is backup sector.");  //33.
     printf("\n");                              //34.
     printf("5.ALLSE [/c] is copy sector.");    //35.
     printf("\n");                              //36.
     printf("6.ALLSE [/m] is move sector.");    //37.
     printf("\n");                              //38.
     printf("7.ALLSE [/w] is write sector.");   //39.
     printf("\n");                              //40.
     printf("8.ALLSE [/cle] is clear sector."); //41.
     printf("\n");                              //42.
     exit(0);                                   //43.
   }                                            //44.
                                                //45.
   if((strcmp(sh,"/rh")==0)                     //46. 比较开关字符串
     ||(strcmp(sh,"/RH")==0)&&argc==2)          //47.
   {                                            //48.
     printf("Enter cylinder number: ");         //49.输出提示
     scanf("%d",&cyl);                          //50.输入柱面号
     printf("Enter head number: ");             //51.输出提示
     scanf("%d",&head);                         //52.输入磁头号
     printf("Enter sector number: ");           //53.输出提示
     scanf("%d",&sector);                       //54.输入扇区号
     biosdisk(0x02,0x80,head,cyl,sector,1,h);   //55.读扇区数据
     fp=tmpfile();                              //56.打开一个临时文件
     for(i=0;i<=511;i++)                        //57.将扇区数据输出到文件
       fputc(h[i],fp);                          //58.
     rewind(fp);                                //59.文件指针回到开头
     for(i=1;i<=512;i++)                        //60.
     {                                          //61.
       c=fgetc(fp);                             //62.
       printf("%2x",c);                         //63.用16进制输出到屏幕
       if(i%32==0)                              //64.输出32个字节换行
       printf("\n");                            //65.
     }                                          //66.
     fclose(fp);                                //67.关闭文件
     printf("\n");                              //68.
   }                                            //69.
                                                //70.
   if((strcmp(sh,"/rc")==0)                     //71. 比较开关字符串
     ||(strcmp(sh,"/RC")==0)&&argc==2)          //72.
   {                                            //73.
     printf("Enter cylinder number: ");         //74.
     scanf("%d",&cyl);                          //75.
     printf("Enter head number: ");             //76.
     scanf("%d",&head);                         //77.
     printf("Enter sector number: ");           //78.
     scanf("%d",&sector);                       //79.
     biosdisk(0x02,0x80,head,cyl,sector,1,h);   //80.
     for(i=1;i<=512;i++)                        //81.
     {                                          //82.
       printf("%c ",h[i-1]);                    //83.将字符输出到屏幕
       if(i%32==0)                              //84.输出32个字符换行
       printf("\n");                            //85.
     }                                          //86.
     printf("\n");                              //87.
   }                                            //88.
                                                //89.
   if((strcmp(sh,"/b")==0)                      //90. 比较开关字符串
     ||(strcmp(sh,"/B")==0)&&argc==2)           //91.
   {                                            //92.
     printf("Enter cylinder number: ");         //93.
     scanf("%d",&cyl);                          //94.
     printf("Enter head number: ");             //95.
     scanf("%d",&head);                         //96.
     printf("Enter sector number: ");           //97.
     scanf("%d",&sector);                       //98.
     printf("Enter file name: ");               //99.
     scanf("%s",ch);                            //100.输入文件名
     fp=fopen(ch,"wb");                         //101.用二进制写方式打开文件
     biosdisk(0x02,0x80,head,cyl,sector,1,h);   //102.读扇区数据
     for(i=0;i<=511;i++)                        //103.
       fwrite(&h[i],1,1,fp);                    //104.将扇区数据写入文件
     fclose(fp);                                //105.关闭文件
     printf("\n");                              //106.
   }                                            //107.
                                                //108.
   if((strcmp(sh,"/c")==0)                      //109. 比较开关字符串
     ||(strcmp(sh,"/C")==0)&&argc==2)           //110.
   {                                            //111.
     printf("Enter SOURCE cylinder number: ");  //112.
     scanf("%d",&cyl);                          //113.
     printf("Enter SOURCE head number: ");      //114.
     scanf("%d",&head);                         //115.
     printf("Enter SOURCE sector number: ");    //116.
     scanf("%d",&sector);                       //117.
     biosdisk(0x02,0x80,head,cyl,sector,1,h);   //118.读源扇区数据
     printf("\n");                              //119.
     printf("Enter TARGET cylinder number: ");  //120.
     scanf("%d",&cyl1);                         //121.
     printf("Enter TARGET head number: ");      //122.
     scanf("%d",&head1);                        //123.
     printf("Enter TARGET sector number: ");    //124.
     scanf("%d",&sector1);                      //125.
     biosdisk(0x03,0x80,head1,cyl1,sector1,1,h);//126.将数据写到目的扇区
     printf("\n");                              //127.
   }                                            //128.
                                                //129.
   if((strcmp(sh,"/m")==0)                      //130.比较开关字符串
     ||(strcmp(sh,"/M")==0)&&argc==2)           //131.
   {                                            //132.
     printf("Enter SOURCE cylinder number: ");  //133.
     scanf("%d",&cyl);                          //134.
     printf("Enter SOURCE head number: ");      //135.
     scanf("%d",&head);                         //136.
     printf("Enter SOURCE sector number: ");    //137.
     scanf("%d",&sector);                       //138.
     biosdisk(0x02,0x80,head,cyl,sector,1,h);   //139.读源扇区数据
     printf("\n");                              //140.
     printf("Enter TARGET cylinder number: ");  //141.
     scanf("%d",&cyl1);                         //142.
     printf("Enter TARGET head number: ");      //143.
     scanf("%d",&head1);                        //144.
     printf("Enter TARGET sector number: ");    //145.
     scanf("%d",&sector1);                      //146.
     biosdisk(0x03,0x80,head1,cyl1,sector1,1,h);//147.将数据写到目的扇区
     for(i=0;i<=511;i++)                        //148.
       h[i]=0;                                  //149.将数组元素赋0值
     biosdisk(0x03,0x80,head,cyl,sector,1,h);   //150.将源扇区清0
     printf("\n");                              //151.
   }                                            //152.
                                                //153.
   if((strcmp(sh,"/w")==0)                      //154. 比较开关字符串
     ||(strcmp(sh,"/W")==0)&&argc==2)           //155.
   {                                            //156.
     printf("Enter cylinder number: ");         //157.
     scanf("%d",&cyl);                          //158.
     printf("Enter head number: ");             //159.
     scanf("%d",&head);                         //160.
     printf("Enter sector number: ");           //161.
     scanf("%d",&sector);                       //162.
     printf("Enter file name: ");               //163.
     scanf("%s",ch);                            //164.输入文件名
     if((fp=fopen(ch,"rb"))==NULL)              //165.测试文件是否存在
     {                                          //166.
       printf("File open fail !");              //167.
       exit(0);                                 //168.
     }                                          //169.
     for(i=0;i<=511;i++)                        //170.
       fread(&h[i],1,1,fp);                     //171.将文件数据读入数组
     biosdisk(0x03,0x80,head,cyl,sector,1,h);   //172.将数据写入扇区
     printf("\n");                              //173.
     fclose(fp);                                //174.
   }                                            //175.
                                                //176.
   if((strcmp(sh,"/cle")==0)                    //177. 比较开关字符串
     ||(strcmp(sh,"/CLE")==0)&&argc==2)         //178.
   {                                            //179.
     printf("Enter cylinder number: ");         //180.
     scanf("%d",&cyl);                          //181.
     printf("Enter head number: ");             //182.
     scanf("%d",&head);                         //183.
     printf("Enter sector number: ");           //184.
     scanf("%d",&sector);                       //185.
     for(i=0;i<=511;i++)                        //186.
       h[i]=0;                                  //187.将数组元素赋0值
     biosdisk(0x03,0x80,head,cyl,sector,1,h);   //188.将扇区清0
   }                                            //189.
}                                               //190.

⌨️ 快捷键说明

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