为了方便广大一键还原爱好者进行自己的一键还原程序开发,贝壳一键还原提供了备份还原的后台程序供各位爱好者进行一键还原二次开发,贝壳一键还原各系列软件也是基于这样的备份后台,因此开发出来的一键还原所生成的镜像文件是和贝壳一键还原生成的镜像文件是通用的,可以用贝壳一键还原PE版里面的文件提取工具进行文件提取。
由于有很多一键还原程序是调用其它备份还原程序的exe文件,因此在获取进度方面和释放exe文件方面会比较麻烦。所以这里提供的是beikel.dll文件,并提供备份还原接口,通过简单的调用可以方便的进行一键还原软件的开发。
本程序的备份内核基于贝壳的备份还原内核,运行于PE之下,本程序需要beikel.dll库。
下面是一个简单的例子程序,可以看到通过简单的一些代码就可以制作出属于自己的DIY的一键还原软件,后面有下载包,里面有例子代码和beikel.dll文件,各爱好者可以根据自己的水平制作出有漂亮界面或者纯控制台等等的一键还原软件。
// main.cpp
///
/*说明:
*1、此程序属于贝壳一键还原系列的后台程序,运行于PE之下,进行分区备份还原。本程序只备份还原NTFS分区,目的分区亦需要是NTFS分区。
*2、本软件为贝壳完全自主开发的备份还原后台程序。
*3、凡以此beikel.dll进行二次开发,必须注明属于贝壳后台。
*4、未经作者允许,不可以将此程序和DLL文件进行商业用途,贝壳软件保留一切追究的权利。
*5、凡以此开发的软件所造成的后果,作者不负任何责任。
*6、作者QQ:554074233, 贝壳一键还原交流群:132195934,msn:beikel@msn.com
*7、Email:beikel@163.com
*/
#include <Windows.h>
#include <tchar.h>
#include <iostream>
using namespace std;
/*
* 进度处理函数
*/
typedef void (*Process_t)(int);
/*
* @PartLetter:需要备份的分区的盘符,如:'C'
* @ImagePathName:备份的镜像文件路径名,如:K:\\win7_image\\win7.bkp,注意,必须是以.bkp后缀名,否则出错。
* @Process:进度处理回调函数,将会传回备份的进度(1 -- 100)
* @bOutputLog:是否输出log信息,帮助分区备份状态信息,如果备份失败,请查看log信息,log文件和备份镜像同一个目录,如:K:\\win7_image\\beikel.log
* 返回值:true:表示备份成功,false:表示备份失败。
*/
typedef bool (*BackupPartition320_t)(_TCHAR PartLetter, const _TCHAR *ImagePathName, Process_t Process, bool bOutputLog);
/*
* @PartLetter:需要还原的分区的盘符,如:'C'
* @ImagePathName:镜像文件路径名,如:K:\\win7_image\\win7.bkp,注意,必须是以.bkp后缀名,否则出错。
* @Process:进度处理回调函数,将会传回备份的进度(1 -- 100)
* @bOutputLog:是否输出log信息,帮助分区备份状态信息,如果备份失败,请查看log信息,log文件和备份镜像同一个目录,如:K:\\win7_image\\beikel.log
* 返回值:true:表示还原成功,false:表示还原失败。
*/
typedef bool (*RestorePartition320_t)(_TCHAR PartLetter, const _TCHAR *ImagePathName, Process_t Process, bool bOutputLog);
static ULONGLONG StartTicks = 0;
static ULONGLONG EndTicks = 0;
static bool StartTime = false;
/*
* 进度处理函数,progress的值为 1 至 100,表示进度百分比
*/
static void Process(int progress)
{
if (progress && !StartTime)
{
/* 开始计算备份或者还原时间
* 因为备份后台在开始做备份或者做还原时需要进行初始化,
* 因此在第一次传数据出来时开始进行时间计算是最准确的。
*/
StartTime = true;
StartTicks = GetTickCount64();
}
cout<<"process: "<< progress<<"%"<<endl;;
}
int _tmain(int argc, _TCHAR* argv[])
{
BackupPartition320_t BackupPartition;
RestorePartition320_t RestorePartition;
HINSTANCE hinstLib = LoadLibrary(_T("beikel.dll"));
if(!hinstLib)
{
cerr<<"Can not load beikel.dll\n";
return -1;
}
BackupPartition = (BackupPartition320_t) GetProcAddress(hinstLib, "BackupPartition320");
RestorePartition = (RestorePartition320_t) GetProcAddress(hinstLib, "RestorePartition320");
int type;
cout<<"select backup or restore (input 1(backup) or 2(restore): ";
cin>>type;
cout<<endl;
bool b;
if (type == 1)
{
b = BackupPartition(_TCHAR('H'), _T("K:\\win7_image\\win7.bkp"), Process, true);
}
else if (type == 2)
{
b = RestorePartition(_TCHAR('H'), _T("K:\\win7_image\\win7.bkp"), Process, true);
}
else
{
cout<<"Error input!";
return -1;
}
EndTicks = GetTickCount64();
ULONGLONG SpendTime = EndTicks - StartTicks;
SpendTime /= 1000;
if (SpendTime > 3600)
{
int h = SpendTime/3600;
int m = SpendTime%3600/60;
int s = SpendTime%3600%60;
cout<<"Time spend:"<<h<<":"<<m<<":"<<s<<endl;
}
else if(SpendTime > 60)
{
int m = SpendTime/60;
int s = SpendTime%60;
cout<<"Time spend:"<<"0:"<<m<<":"<<s<<endl;
}
else
{
cout<<"Time spend:"<<"0:"<<"0:"<<SpendTime<<endl;
}
if (b)
{
if (type == 1)
cout<<"Backup Success!"<<endl;
else
cout<<"Restore Success!"<<endl;
}
else
{
if (type == 1)
cout<<"Backup Failed!"<<endl;
else
cout<<"Restore Failed!"<<endl;
}
return 0;
}
使用:
将代码拷贝为main.cpp,然后在vc下新建一个工程,并加入main.cpp并编译,编译成功后把beikel.dll拷贝到生产exe文件的目录下即可运行程序进行备份和还原。
源代码和beikel.dll包下载地址:
http://www.vdisk.cn/down/index/10989215
百度网盘下载地址:
http://pan.baidu.com/share/link?shareid=66660&uk=3525712704
为了防止下载到他人制作的虚假dll文件,各位可以下载完压缩包后,可以对压缩包进行md5和sha校验。
压缩包校验:
MD5: a2cb138ac796ae947c3156f037053fb8
Sha: 387b39c05e85f5403302d3cbca9fa9bc58163989