#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
struct ghost
{
char mode[6];
char fname[13];
};
void sysBack(char ghfile[]);
void help();
int HeXin(int num);
int runghost(struct ghost gho,int xuanze);
void sysBack(char ghfile[])
{
system("tw /q");
system(ghfile);
}
int HeXin(int num)
{
struct ghost gho;
char *p=(char *)malloc(sizeof(char) * 200);
char tempfilename[13];
char name[10];
int panduan;
FILE *hddfile;
if(num==1)
{
strcpy(gho.mode,"pdump");
strcpy(name,"\"备份\"");
printf("请输入%s镜像文件名,不包括后缀!:",name);
}
else
{
strcpy(gho.mode,"pload");
strcpy(name,"\"还原\"");
printf("请输入%s镜像文件名,不包括后缀!:",name);
}
do
{
panduan=1;
scanf("%[QWERTYUIOPASDFGHJKLMNBVCXZ_qwertyuiopasdfghjklzxcvbnm0123456789]",p);
fflush(stdin);
if(strlen(p)>8)
{
printf("出错~!文件名太长或文件名不标准!!\n");
printf("请重新输入%s镜像文件名,不包括后缀!:",name);
continue;
}
strcpy(tempfilename,p);
strcat(tempfilename,".gho");
hddfile=fopen(tempfilename,"rb");
if(num==1 && hddfile != NULL)
{
printf("硬盘上已经存在相同名称的文件,建议不要重复使用同一文件名的备份!!\n");
printf("请重新输入%s镜像文件名,不包括后缀!:",name);
fclose(hddfile);
continue;
}
if(num==1 && hddfile == NULL)
{
hddfile=fopen(tempfilename,"wb");
if(hddfile != NULL)
{
fclose(hddfile);
remove(tempfilename);
}
else
{
printf("文件名不符合命名规则!\n");
printf("请重新输入%s镜像文件名,不包括后缀!:",name);
continue;
}
}
if(num==2 && hddfile == NULL)
{
system("dir/w *.gho");
printf("指向的镜像文件不存在,不能继续~!\n");
printf("请重新输入%s镜像文件名,不包括后缀!:",name);
continue;
}
strcpy(gho.fname,p);
panduan=0;
}while(panduan);
num=runghost(gho,num);
return num;
}
int runghost(struct ghost gho,int xuanze)
{
char panduan,ForPanduan;
char ghfile[100]="ghost8 -clone,mode=";
FILE *ForHDD;
switch(xuanze)
{
case 1:
strcat(ghfile,gho.mode);
strcat(ghfile,",src=1:1,dst=");
strcat(ghfile,gho.fname);
strcat(ghfile,".gho -z9 -rb -sure");
break;
case 2:
strcat(ghfile,gho.mode);
strcat(ghfile,",src=");
strcat(ghfile,gho.fname);
strcat(ghfile,".gho:1,dst=1:1 -sure -rb");
break;
}
fflush(stdin);
printf("警告:指令正确自动还原系统,请在这个过程中不要断电~!否则一切后果不担保!!!\n");
printf("指令是否正确??\t%s\n",ghfile);
printf("正确请输入[Y/y],否则请输入[N/n]:");
panduan=getchar();
fflush(stdin);
if(panduan=='y' || panduan=='Y')
{
switch(xuanze)
{
case 1:
sysBack(ghfile);
break;
case 2:
putchar('\n');
puts("还原前是否先快速格式化C盘?");
puts("警告:如果C盘是NTFS分区的话请选择\"N\",否则会格式化一个错误盘~!");
printf("格式化[Y/y],不格式化[N/n]:");
ForPanduan=getchar();
fflush(stdin);
if(ForPanduan == 'Y' || ForPanduan == 'y')
{
if((ForHDD=fopen("FORHDD.BAT","w")) != NULL)
{
system("tw /q");
fflush(stdout);
fprintf(ForHDD,"@ECHO OFF\n");
fprintf(ForHDD,"FORDOS C: /AUTOTEST /Q /U\n");
fprintf(ForHDD,"%s",ghfile);
fclose(ForHDD);
system("ForHDD.BAT");
break;
}
else
{
sysBack(ghfile);
break;
}
}
else
{
sysBack(ghfile);
break;
}
}
return 0;
}
else
{
printf("\n\n您现在可以重新设置指令\n\n");
return 1;
}
}
void main()
{
char *pass=(char *)malloc(sizeof(char) * 200);
char chnum;
int num,password;
system("DIR C:/A");
system("DIR/A");
system("tw");
do
{
printf("请输入密码:");
scanf("%s",pass);
fflush(stdin);
if(strcmp("repent",pass)!=0)
{
password=1;
printf("密码错误,请重新输入~!\n");
}
else
{
password=0;
system("cls");
}
}while(password);
free(pass);
system("dir/w *.gho");
puts("*******************************************");
puts("* ReGhost With Ghost For Dos *");
puts("* *");
puts("* 制作人:绝对后悔 *");
puts("* 程序源码:C *");
puts("* 编译软件:Turbo C *");
puts("* 发布时间:2005.9.6 *");
puts("*******************************************");
putchar('\n');
do
{
num=9;
printf("A.\"备份\"系统分区\n");
printf("B.\"还原\"系统分区\n");
printf("C.帮助\n");
printf("D.清屏查询当前目录文件\n");
printf("E.退出程序\n\n");
printf("请选择代号按\"回车\"继续:");
scanf("%c",&chnum);
fflush(stdin);
switch(chnum)
{
case 'A':
case 'a':
num=1;
num=HeXin(num);
break;
case 'B':
case 'b':
num=2;
num=HeXin(num);
break;
case 'C':
case 'c':
help();
continue;
case 'D':
case 'd':
system("cls");
system("dir/w *.gho");
continue;
case 'E':
case 'e':
system("tw /q");
exit(1);
default:
printf("操作出错~!请选择指定代号~!\n\n");
continue;
}
}while(num);
}
void help() /*帮助*/
{
putchar('\n');
puts("--帮助文档--[1]--");
puts("文件:");
puts("1.GHOST8.EXE (备份软件)");
puts("2.TW.EXE (中文软件)");
puts("3.FORDOS.COM (FORMAT.COM重命名)");
puts("4.FORHDD.BAT (程序自动生成的批处理文件,退出程序会自动删除)");
putchar('\n');
puts("运行状态:");
putchar('\n');
puts("1.建议程序必须运行在纯DOS模式下.");
puts("2.备份条件必须满足GHOST软件的条件.");
puts("3.文件不能放在所要备份/还原同一分区.");
puts("例如:");
puts("C:SYSTEM(FAT32),D:DOC(NTFS),E:BACKUP(FAT32)...");
puts("本程序和所必须引用的文件都应该放在E盘下.");
puts("备份后*.GHO文件会自动生成在E盘下.");
puts("4.用户所取备份文件名称长度不能大于8,建议不大于4.");
puts("5.本程序不提供多分区备份,只备份第一硬盘第一分区.");
putchar('\n');
printf("请按回车键继续...");
getchar(); fflush(stdin);
putchar('\n');
puts("--帮助文档--[2]--");
puts("安全隐患:");
puts("在还原备份前会提出\"是否先快速格式化再还原备份\"的选项.");
puts("用户可以因自己的需要选择 \"是\" 或 \"否\".");
puts("如果系统盘是C盘但又是NTFS格式分区的话请选择 \"否\".");
puts("否则会自动格式化一个DOS所认的C盘,而非WINDOWS所认的C盘.");
putchar('\n');
puts("使用条款:");
puts("1.本程序只作为学习,测试之用.代码完全公开!");
puts("2.所引用的其他软件都是在网上搜索的共享软件.");
puts("3.因本程序所令用户产生的一切后果本人不负责任何责任.");
putchar('\n');
}