返 回
C程序应用实例
主引导扇区的备份与恢复
成都教育学院 傅叔平
如果有一天你的硬盘分区乱套了或者干脆就找不到了,如果硬盘上存储的资料的重要性仅次于你的爱情和生命,你就只剩欲哭无泪的份了。
硬盘逻辑分区乱套是硬盘的主引导扇区的数据遭到了破坏,原因可能是病毒作崇,也可能是使用一些软件,特别是涉及直接磁盘读写的工具软件时,误操作所造成。
要防止这个悲剧发生,最简单可靠的办法是事先对主引导扇区数据进行备份。当主引导扇区遭到破坏后,将备份数据写回引导扇即万事大吉了。
如果是引导型病毒作崇,则即使对硬盘进行格式化也不能将其清除,不论是在DOS中还是在Windows各版本中。因为主引导扇区是独立于任何操作系统的。采用备份数据覆盖主引导扇区仍是最简单的最彻底的方法。
备份和恢复主引导扇区其实并不难,只要几行程序即可办到。下面给出两种方法:
方法一:将主引导扇区读出后写到软磁盘的一个扇区,恢复时反之。见程序1-1和程序1-2。
方法二:将主引导扇区读出后写成一个文件,恢复时先将文件内容读入缓冲区,再将其写回硬盘主引导扇区。见程序2-1和2-2。程序3-1和3-2是可读性和通用性更好的程序。
考虑到使用的方便性,在实际使用中建议用程序3-1和程序3-2。
另外,如果用汇编指令也只要几行即可解决问题,这留待大一的同学们学了汇编指令后再讲。
程序中用到的函数及各参数和返回值的意义在专题讲座中给同学们讲解。
为了方便读者使用,作者已提供了编译好的可执行文件,需要者请返回上页点击“程序下载”或点击这里下载。
/*
程序1-1:主引导扇区备份程序
*/
#include <bios.h>
main(void)
{
unsigned char buf[512];
biosdisk(2,0x80,0,0,1,1,buf);
biosdisk(3,0,0,31,1,1,buf);
}
/*
程序1-2:主引导扇区恢复程序
*/
#include <bios.h>
main(void)
{
unsigned char buf[512];
biosdisk(2,0,0,31,1,1,buf);
biosdisk(3,0x80,0,0,1,1,buf);
}
/*
程序2-1:主引导扇区备份程序
*/
#include <bios.h>
#include <stdio.h>
main(void)
{
unsigned char buf[512];
FILE *fp;
biosdisk(2,0x80,0,0,1,1,buf);
fp=fopen("a:\\boot.dat","wb");
fwrite(buf,512,1,fp);
fclose(fp);
}
/*
程序2-2:主引导扇区恢复程序
*/
#include <bios.h>
#include <stdio.h>
main(void)
{
unsigned char buf[512];
FILE *fp;
fp=fopen("a:\\boot.dat","rb");
fread(buf,512,1,fp);
fclose(fp);
biosdisk(3,0x80,0,0,1,1,buf);
}
/*
=============================================
程序3-1:主引导扇区备份程序
filename: BAKBOOT.C 2001.2 Shuping Fu
=============================================
*/
#include <bios.h>
#include <stdio.h>
#define READ 2
void main(void)
{
int drive=0x80,track=0,head=0,sector=1,nsects=1;
unsigned char buf[512];
FILE *fp;
char filename[30];
clrscr();
if(biosdisk(READ,drive,head,track,sector,nsects,buf))
{
printf("Can not read BOOTSECTOR !\n");
exit(1);
}
else
{
printf("Enter BOOT filename: ");
gets(filename);
if((fp=fopen(filename,"wb"))!=NULL)
{
fwrite(buf,512,1,fp);
fclose(fp);
}
}
}
/*
=============================================
程序3-2:主引导扇区恢复程序
filename: RESBOOT.C 2001.2 Shuping Fu
=============================================
*/
#include <bios.h>
#include <stdio.h>
#define WRITE 3
void main(void)
{
int drive=0x80,track=0,head=0,sector=1,nsects=1;
unsigned char buf[512];
FILE *fp;
char filename[30];
clrscr();
printf("Enter BOOT filename: ");
gets(filename);
if((fp=fopen(filename,"rb"))!=NULL)
{
fread(buf,512,1,fp);
fclose(fp);
}
else
{
printf("Can not read BOOT file !\n");
exit(1);
}
if(biosdisk(WRITE,drive,head,track,sector,nsects,buf))
printf("\n\nOk!\n");
else
printf("\n\nFail!\n");
}
返 回