📄 unitmain.~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;
//生成加载点
ShowMessage(MountPoint);
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 + -