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