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

📄 unitmain.pas

📁 易游虚拟还原相关程序,易游虚拟还原相关程序
💻 PAS
字号:
unit unitMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Registry, StdCtrls;

Const
//下面常量以创建文件时的path、name和size为准,声明常量只为演示
  cvdFileName:String='111.cvd';
  bakFileName:String='111.cvdbak';
  LocalDiskName:String='d:\';
  MountPoint:String='e:\test\';

type
  TfrmMain = class(TForm)
    GroupBox1: TGroupBox;
    btnSetup: TButton;
    GroupBox2: TGroupBox;
    btnPowerOn: TButton;
    GroupBox3: TGroupBox;
    btnCreateFile: TButton;
    btnDeleteFile: TButton;
    btnMountDisk: TButton;
    btnUmountDisk: TButton;
    btnProtectDisk: TButton;
    btnUprotectDisk: TButton;
    procedure btnCreateFileClick(Sender: TObject);
    procedure btnSetupClick(Sender: TObject);
    procedure btnPowerOnClick(Sender: TObject);
    procedure btnDeleteFileClick(Sender: TObject);
    procedure btnMountDiskClick(Sender: TObject);
    procedure btnUmountDiskClick(Sender: TObject);
    procedure btnProtectDiskClick(Sender: TObject);
    procedure btnUprotectDiskClick(Sender: TObject);

  private
    { Private declarations }
  public
  end;

  Function EplDriveDisk(strParameter:String):integer;stdcall;external 'epldrive.dll';
  Function mksparse(strFilePath,strFileSize:String):integer;stdcall;external  'mksparse.dll';
  Function GetVolume(strVolumeMountPoint, strVolumeName:String; intBufferLength:Longword):integer; stdcall; external 'DiskVolume.dll';
  Function DeleteVolume(strVolumeMountPoint:String):integer;stdcall;external 'DiskVolume.dll';
  Function SetVolume(strVolumeMountPoint,strVolumeName:String):integer;stdcall;external 'DiskVolume.dll';


  Function GetCvdFileSize():String;
  Function GetVolumeName():String;

var
  frmMain: TfrmMain;

implementation

uses unitCreateFile;

{$R *.dfm}


procedure TfrmMain.btnSetupClick(Sender: TObject);
var
  bufVolumeName:String;
  rc:integer;
  Reg:TRegistry;
begin
  //获取D分区的VolumeName
  SetLength(bufVolumeName,1024);
  rc:=GetVolume(LocalDiskName,bufVolumeName,1024);
  if rc<>0 then
  begin
    ShowMessage('GetVolume失败');
    exit;
  end;

  //把VolumeName写入注册表
  Reg:=Tregistry.Create;
  try
    Reg.RootKey:=HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\Software\E-Play',True) then
      Reg.WriteString('VolumeName',bufVolumeName);
  Finally
    Reg.CloseKey;
    Reg.Free;
  end;

  //隐藏盘符
  rc:=DeleteVolume(LocalDiskName);
  if rc<>0 then
  begin
    ShowMessage('隐藏D分区失败,程序退出');
    exit;
  end;

  //生成磁盘加载点
  rc:=SetVolume(MountPoint,bufVolumeName);
  if rc<>0 then
  begin
    ShowMessage('生成加载点失败,程序退出');
    exit;
  end;

  //隐藏加载点
  rc:=DeleteVolume(MountPoint);
  if rc<>0 then
  begin
    ShowMessage('隐藏加载点失败,程序退出');
    exit;
  end;

  //以下代码与调用无关,仅为示例的正常运行
  SetVolume(LocalDiskName,bufVolumeName);
  ShowMessage('成功');
end;


procedure TfrmMain.btnPowerOnClick(Sender: TObject);
var
  VolumeName:String;
  rc:integer;
  strTemp:String;
  cvdFileSize:String;
begin
  //该段代码与调用无关,仅为示例可以正常运行
  DeleteVolume(LocalDiskName);

  //以下代码有效
  //从注册表获取VolumeName
  VolumeName:=GetVolumeName();

  //从注册表获取cvdFileSize
  cvdFileSize:=GetCvdFileSize();

  //由VolumeName生成加载点
  rc:=SetVolume(MountPoint,VolumeName);
  if rc<>0 then
  begin
    ShowMessage('生成加载点失败,程序退出');
    exit;
  end;

  //删除bak文件
  if not DeleteFile(MountPoint+bakFileName) then
  begin
    ShowMessage('删除bak文件失败,程序退出');
    exit;
  end;

  //开机创建bak文件
  rc:=mksparse(MountPoint+bakFileName,'1M');
  if rc<>0 then
  begin
    ShowMessage('创建bak文件失败,程序退出');
    exit;
  end;

  //加载虚拟盘
  strTemp:='/mount 0 ' + MountPoint+cvdFilename + ' ' + cvdFileSize + ' ' + 'd:';
  rc:=EplDriveDisk(strTemp);
  if rc<>0 then
  begin
    ShowMessage('加载虚拟D失败');
    exit;
  end;

  //隐藏加载点
  rc:=DeleteVolume(MountPoint);
  if rc<>0 then
  begin
    ShowMessage('隐藏加载点失败');
    exit;
  end;

  ShowMessage('成功');
end;


procedure TfrmMain.btnCreateFileClick(Sender: TObject);
begin
  frmCreateFile.show;
end;

procedure TfrmMain.btnDeleteFileClick(Sender: TObject);
begin
  if not DeleteFile(LocalDiskName+cvdFileName) then
  begin
    ShowMessage('删除cvd文件失败,请检查文件是否存在或者是否被占用中');
    exit;
  end;

  if not DeleteFile(LocalDiskName+bakFileName) then
  begin
    ShowMessage('删除bak文件失败,请检查文件是否存在或者是否被占用中');
    exit;
  end;

  ShowMessage('删除成功');
end;

procedure TfrmMain.btnMountDiskClick(Sender: TObject);
var
  VolumeName:String;
  strTemp:String;
  rc:integer;
  cvdFileSize:String;
begin
  //从注册表获取VolumeName
 VolumeName:=GetVolumeName();

 //从注册表获取cvdFileSize
 cvdFileSize:=GetCvdFileSize();

  //隐藏物理分区
  rc:=DeleteVolume(LocalDiskName);
  if rc<>0 then
  begin
    ShowMessage('隐藏D分区失败,程序退出');
    exit;
  end;

  //生成加载点
  rc:=SetVolume(MountPoint,VolumeName);
  if rc<>0 then
  begin
    ShowMessage('生成加载点失败,程序退出');
    exit;
  end;

  //加载虚拟盘
  strTemp:='/mount 0 ' + MountPoint + cvdFileName + ' ' + cvdFileSize + ' ' + LocalDiskName;
  rc:=EplDriveDisk(strTemp);
  if rc<>0 then
  begin
    ShowMessage('生成虚拟盘失败');
    exit;
  end;

  //隐藏加载点
  rc:=DeleteVolume(MountPoint);
  if rc<>0 then
  begin
    ShowMessage('隐藏加载点失败');
    exit;
  end;

  ShowMessage('成功');
end;

procedure TfrmMain.btnUmountDiskClick(Sender: TObject);
var
  VolumeName:String;
  rc:integer;
  strTemp:string;
begin
  //从注册表里获取VolumeName
 VolumeName:=GetVolumeName();

  strTemp:='/umount ' + LocalDiskName;
  rc:=EplDriveDisk(strTemp);
  if rc<>0 then
  begin
    ShowMessage('卸载虚拟盘失败');
    exit;
  end;

  //还原物理分区
  rc:=SetVolume(LocalDiskName,VolumeName);
  if rc<>0 then
  begin
    ShowMessage('生成D盘失败');
    exit;
  end;

  ShowMessage('成功');
end;


procedure TfrmMain.btnProtectDiskClick(Sender: TObject);
var
  VolumeName:String;
  rc:integer;
  strTemp:String;
  cvdFileSize:String;
begin
  //从注册表获取VolumeName
  VolumeName:=GetVolumeName();

  //从注册表获取cvdFileSize
  cvdFileSize:=GetCvdFileSize();

  //卸载虚拟分区
  strTemp:='/umount ' + LocalDiskName;
  rc:=EplDriveDisk(strTemp);
  if rc<>0 then
  begin
    ShowMessage('卸载虚拟分区失败');
    exit;
  end;

  //生成加载点
  rc:=SetVolume(MountPoint,VolumeName);
  if rc<>0 then
  begin
    ShowMessage('生成加载点失败');
    exit;
  end;

  //加载虚拟分区
  strTemp:='/mount 0 ' + MountPoint + cvdFileName + ' ' + cvdFileSize + ' ' + LocalDiskName;
  rc:=EplDriveDisk(strTemp);
  if rc<>0 then
  begin
    ShowMessage('加载D盘失败');
    exit;
  end;

  //设置磁盘为保护状态
  rc:=EplDriveDisk('/setflag d: 1');
  if rc<>0 then
  begin
    ShowMessage('设置D盘保护状态失败');
    exit;
  end;

  //隐藏加载点
  rc:=DeleteVolume(MountPoint);
  if rc<>0 then
  begin
    ShowMessage('删除加载点失败');
    exit;
  end;

  ShowMessage('成功');
end;

procedure TfrmMain.btnUprotectDiskClick(Sender: TObject);
var
  VolumeName:String;
  rc:integer;
  strTemp:String;
  cvdFileSize:String;
begin
  //从注册表获取VolumeName
  VolumeName:=GetVolumeName();

  //从注册表获取cvdFileSize
  cvdFileSize:=GetCvdFileSize();

  //卸载虚拟盘
  strTemp:='/umount ' + LocalDiskName;
  rc:=EplDriveDisk(strTemp);
  if rc<>0 then
  begin
    ShowMessage('卸载D盘失败');
    exit;
  end;

  //生成加载点
  rc:=SetVolume(MountPoint,VolumeName);
  if rc<>0 then
  begin
    ShowMessage('生成加载点失败');
    exit;
  end;

  //加载虚拟盘
  strTemp:='/mount 0 ' + MountPoint + cvdFileName + ' ' + cvdFileSize + ' ' + 'd:';
  rc:=EplDriveDisk(strTemp);
  if rc<>0 then
  begin
    ShowMessage('加载虚拟盘失败');
    exit;
  end;

  //设置虚拟盘为非保护状态
  rc:=EplDriveDisk('/setflag d: 0');
  if rc<>0 then
  begin
    ShowMessage('设置D盘非保护状态失败');
    exit;
  end;

  //隐藏加载点
  rc:=DeleteVolume(MountPoint);
  if rc<>0 then
  begin
    ShowMessage('删除加载点失败');
    exit;
  end;

  ShowMessage('成功');
end;


Function GetVolumeName():String;
var
  Reg:TRegistry;
  VolumeName:String;
begin
  Reg:=TRegistry.Create;
  try
  Reg.RootKey:=HKEY_LOCAL_MACHINE;
  if not Reg.KeyExists('\Software\E-Play') then
    begin
      ShowMessage('读取注册表失败,键值不存在');
      exit;
    end
  else
    begin
      Reg.OpenKey('\Software\E-Play',False);
      if not Reg.ValueExists('VolumeName') then
        begin
          ShowMessage('键值不存在');
          exit;
        end
      else
        begin
          VolumeName:=Reg.ReadString('VolumeName');
          if VolumeName='' then
            begin
              ShowMessage('VolumeName为空');
              exit;
            end;
        end;
    end;
  finally
    Reg.CloseKey;
    Reg.Free;
  end;
  result:=VolumeName;
end;


Function GetCvdFileSize():String;
var
  Reg:TRegistry;
  cvdFileSize:String;
begin
  Reg:=TRegistry.Create;
  try
  Reg.RootKey:=HKEY_LOCAL_MACHINE;
  if not Reg.KeyExists('\Software\E-Play') then
    begin
      ShowMessage('读取注册表失败,键值不存在');
      exit;
    end
  else
    begin
      Reg.OpenKey('\Software\E-Play',False);
      if not Reg.ValueExists('cvdFileSize') then
        begin
          ShowMessage('键值不存在');
          exit;
        end
      else
        begin
          cvdFileSize:=Reg.ReadString('cvdFileSize');
          if cvdFileSize='' then
            begin
              ShowMessage('cvdFileSize为空');
              exit;
            end;
        end;
    end;
  finally
    Reg.CloseKey;
    Reg.Free;
  end;
  result:=cvdFileSize;
end;

end.

⌨️ 快捷键说明

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