chovy-sign/CHOVY/CHOVY.cs

586 lines
21 KiB
C#
Raw Normal View History

2019-08-17 15:34:08 +00:00
using CHOVY.Properties;
using DiscUtils.Iso9660;
2020-08-23 16:29:07 +00:00
using Ionic.Zlib;
2019-08-17 15:34:08 +00:00
using Microsoft.Win32;
using Param_SFO;
2019-10-06 16:55:42 +00:00
using PSVIMGTOOLS;
2019-08-17 15:34:08 +00:00
using System;
using System.Diagnostics;
2019-08-22 05:26:37 +00:00
using System.Drawing;
2019-08-17 15:34:08 +00:00
using System.IO;
using System.Media;
using System.Text;
2019-10-10 07:17:29 +00:00
using System.Threading;
2019-08-17 15:34:08 +00:00
using System.Windows.Forms;
namespace CHOVY
{
public partial class CHOVY : Form
{
2019-08-18 07:48:44 +00:00
bool MutedAudio = false;
2019-08-17 15:34:08 +00:00
public byte[] GetSfo(string ISOFile)
{
FileStream ISO = File.OpenRead(ISOFile);
2019-08-18 07:48:44 +00:00
2019-08-17 15:34:08 +00:00
CDReader cdr = new CDReader(ISO, false);
Stream ParamSfo = cdr.OpenFile(@"PSP_GAME\PARAM.SFO", FileMode.Open,FileAccess.Read);
byte[] Sfo = new byte[ParamSfo.Length];
ParamSfo.Read(Sfo, 0x00, (int)ParamSfo.Length);
ISO.Close();
return Sfo;
}
public byte[] GetIcon(string ISOFile)
{
FileStream ISO = File.OpenRead(ISOFile);
CDReader cdr = new CDReader(ISO, false);
Stream ParamSfo = cdr.OpenFile(@"PSP_GAME\ICON0.PNG", FileMode.Open, FileAccess.Read);
byte[] Icon0 = new byte[ParamSfo.Length];
ParamSfo.Read(Icon0, 0x00, (int)ParamSfo.Length);
ISO.Close();
return Icon0;
}
public static string GetTitleID(string ISOFile)
{
FileStream ISO = File.OpenRead(ISOFile);
CDReader cdr = new CDReader(ISO, false);
Stream ParamSfo = cdr.OpenFile(@"PSP_GAME\PARAM.SFO", FileMode.Open, FileAccess.Read);
PARAM_SFO sfo = new PARAM_SFO(ParamSfo);
string TitleID = sfo.GetValue("DISC_ID");
ISO.Close();
return TitleID;
}
2019-08-22 05:26:37 +00:00
public static bool isMini(string ISOFile)
{
FileStream ISO = File.OpenRead(ISOFile);
CDReader cdr = new CDReader(ISO, false);
Stream Icon0 = cdr.OpenFile(@"PSP_GAME\ICON0.PNG", FileMode.Open, FileAccess.Read);
Bitmap bmp = new Bitmap(Icon0);
bool isMini = (bmp.Width == 80 && bmp.Height == 80);
bmp.Dispose();
ISO.Close();
return isMini;
}
2019-08-17 15:34:08 +00:00
public string ReadSetting(string Setting)
{
string Value = "";
try
{
RegistryKey key;
2019-10-08 06:10:57 +00:00
key = Registry.CurrentUser.CreateSubKey(@"Software\CHOVYProject\Chovy-Sign");
2019-08-17 15:34:08 +00:00
Value = key.GetValue(Setting).ToString();
key.Close();
}
catch (Exception) { return ""; }
return Value;
}
public void WriteSetting(string Setting,string Value)
{
try
{
RegistryKey key;
2019-10-08 06:10:57 +00:00
key = Registry.CurrentUser.CreateSubKey(@"Software\CHOVYProject\Chovy-Sign");
2019-08-17 15:34:08 +00:00
key.SetValue(Setting, Value);
key.Close();
}
catch (Exception) { }
}
2020-08-12 00:08:58 +00:00
public bool IsDexAidSet()
{
string isDex = ReadSetting("DexAid");
if (isDex == "0")
{
return false;
}
else if(isDex == "1")
{
return true;
}
else
{
return false;
}
}
2019-08-17 15:34:08 +00:00
public CHOVY()
{
InitializeComponent();
}
private void CHOVY_Load(object sender, EventArgs e)
{
2020-08-23 16:29:07 +00:00
if (ReadSetting("MuteAudio") == "1")
2019-08-18 07:48:44 +00:00
{
MutedAudio = true;
}
2019-08-17 15:34:08 +00:00
Versionkey.Text = ReadSetting("VersionKey");
RifPath.Text = ReadSetting("RifPath");
}
private void FREEDOM_EnabledChanged(object sender, EventArgs e)
{
Color red = Color.FromArgb(192, 0, 0);
Color black = Color.Black;
bool enabled = this.FREEDOM.Enabled;
this.FREEDOM.ForeColor = enabled ? red : black;
this.FREEDOM.BackColor = enabled ? black : red;
}
2019-08-17 15:34:08 +00:00
private void FREEDOM_Click(object sender, EventArgs e)
{
Action enable = () => {
this.FREEDOM.Enabled = true;
};
2020-08-23 16:29:07 +00:00
bool isZrif = false;
2019-08-17 15:34:08 +00:00
if(RifPath.Text == "" || !File.Exists(RifPath.Text))
{
2020-08-23 16:29:07 +00:00
// Check if valid 'zRIF'
try
{
ZlibStream.UncompressBuffer(Convert.FromBase64String(RifPath.Text));
isZrif = true;
}
catch(Exception)
{
MessageBox.Show("INVALID RIF!\nPlease try \"Find from CMA\"", "RIF ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
2019-08-17 15:34:08 +00:00
}
if(Versionkey.Text.Length != 32)
{
2019-08-22 05:26:37 +00:00
MessageBox.Show("INVALID VERSION KEY!\nPlease try \"Find from CMA\"", "VERKEY ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
2019-08-17 15:34:08 +00:00
return;
}
if(ISOPath.Text == "" || !File.Exists(ISOPath.Text))
{
MessageBox.Show("INVALID ISO PATH!", "ISO ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
this.FREEDOM.Enabled = false;
2019-08-17 15:34:08 +00:00
string CmaDir = ReadSetting("CmaDir");
if(CmaDir == "")
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.Description = "Select CMA Backups Directory";
fbd.ShowDialog();
CmaDir = fbd.SelectedPath;
}
string TitleID = GetTitleID(ISOPath.Text);
string TmpDir = Path.Combine(Application.StartupPath, "_tmp");
2019-10-10 07:17:29 +00:00
string GameWorkDir = Path.Combine(TmpDir, TitleID);
2019-08-17 15:34:08 +00:00
string EbootFile = Path.Combine(GameWorkDir, "EBOOT.PBP");
2019-08-18 07:48:44 +00:00
string EbootSignature = Path.Combine(GameWorkDir, "__sce_ebootpbp");
2019-08-17 15:34:08 +00:00
Directory.CreateDirectory(TmpDir);
Directory.CreateDirectory(GameWorkDir);
//Read RIF data
byte[] ContentId = new byte[0x24];
byte[] RifAid = new byte[0x08];
2020-08-23 16:29:07 +00:00
Stream rif = null;
if (!isZrif)
rif = File.OpenRead(RifPath.Text);
else
rif = new MemoryStream(ZlibStream.UncompressBuffer(Convert.FromBase64String(RifPath.Text)));
2019-08-17 15:34:08 +00:00
rif.Seek(0x10, SeekOrigin.Begin);
rif.Read(ContentId, 0x00, 0x24);
rif.Seek(0x08, SeekOrigin.Begin);
rif.Read(RifAid, 0x00, 0x08);
2020-08-12 00:08:58 +00:00
2019-08-17 15:34:08 +00:00
string ContentID = Encoding.UTF8.GetString(ContentId);
2020-08-12 00:08:58 +00:00
string AidStr = BitConverter.ToString(RifAid).Replace("-", "").ToLower();
if(IsDexAidSet())
{
AidStr = "0000000000000000";
}
string BackupWorkDir = Path.Combine(CmaDir, "PGAME", AidStr, TitleID);
2019-08-17 15:34:08 +00:00
2019-10-10 07:17:29 +00:00
TotalProgress.Maximum = 100;
Status.Text = "Overthrowing The PSPEMU Monarchy 0%";
2019-08-22 05:26:37 +00:00
string BootupImage = "";
if (isMini(ISOPath.Text))
{
BootupImage = Path.Combine(Application.StartupPath, "_tmp", "minis.png");
Resources.MINIS.Save(BootupImage);
}
2019-10-10 07:17:29 +00:00
else
{
BootupImage = Path.Combine(Application.StartupPath, "_tmp", "chovy.png");
Resources.ChovyLogo.Save(BootupImage);
}
2019-08-22 05:26:37 +00:00
Process signnp = pbp.GenPbpFromIso(ISOPath.Text, EbootFile, ContentID, Versionkey.Text, CompressPBP.Checked, BootupImage);
2019-08-17 15:34:08 +00:00
while (!signnp.HasExited)
{
string Progress = signnp.StandardOutput.ReadLine();
if(Progress.StartsWith("Writing ISO blocks: "))
{
Progress = Progress.Remove(0,19);
int ProgressInt = int.Parse(Progress.Substring(0,3));
TotalProgress.Value = ProgressInt;
2019-10-10 07:17:29 +00:00
Status.Text = "Overthrowing The PSPEMU Monarchy " + ProgressInt.ToString() + "%";
2019-08-17 15:34:08 +00:00
}
Application.DoEvents();
}
2019-10-10 07:17:29 +00:00
TotalProgress.Value = 0;
2019-08-22 05:26:37 +00:00
2019-10-10 07:17:29 +00:00
Status.Text = "Signing the Declaration of Independance 0%";
UInt64 IntAid = BitConverter.ToUInt64(RifAid,0x00);
Thread thrd = new Thread(() =>
2019-08-22 05:26:37 +00:00
{
2019-10-10 07:17:29 +00:00
int ChovyGenRes = pbp.gen__sce_ebootpbp(EbootFile, IntAid, EbootSignature);
if (!File.Exists(EbootSignature) || ChovyGenRes != 0)
2019-08-22 05:26:37 +00:00
{
2019-10-10 07:17:29 +00:00
MessageBox.Show("CHOVY-GEN Failed! Please check CHOVY.DLL exists\nand that the Microsoft Visual C++ 2015 Redistributable Update 3 RC is installed");
enable();
return;
2019-08-22 05:26:37 +00:00
}
2019-10-10 07:17:29 +00:00
});
thrd.Start();
while(thrd.IsAlive)
{
Application.DoEvents();
2019-08-18 07:48:44 +00:00
}
2019-08-17 15:34:08 +00:00
/*
* BUILD PSVIMG FILE
*/
// Pacakge GAME
2020-08-12 00:08:58 +00:00
byte[] CmaKey;
if (IsDexAidSet())
{
CmaKey = CmaKeys.GenerateKey(new byte[0x8] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });
}
else
{
CmaKey = CmaKeys.GenerateKey(RifAid);
}
2019-08-17 15:34:08 +00:00
2020-08-12 00:08:58 +00:00
2019-10-09 16:11:55 +00:00
string[] entrys = Directory.GetFileSystemEntries(GameWorkDir, "*", SearchOption.AllDirectories);
long noEntrys = entrys.LongLength;
string parentPath = "ux0:pspemu/temp/game/PSP/GAME/" + TitleID;
int noBlocks = 0;
foreach (string fileName in Directory.GetFiles(GameWorkDir,"*",SearchOption.AllDirectories))
{
noBlocks += Convert.ToInt32(new FileInfo(fileName).Length / PSVIMGConstants.PSVIMG_BLOCK_SIZE);
}
TotalProgress.Maximum = noBlocks;
string BackupDir = Path.Combine(BackupWorkDir, "game");
Directory.CreateDirectory(BackupDir);
2019-10-10 07:17:29 +00:00
string psvimgFilepath = Path.Combine(BackupDir, "game.psvimg");
FileStream gamePsvimg = File.OpenWrite(psvimgFilepath);
gamePsvimg.SetLength(0);
PSVIMGBuilder builder = new PSVIMGBuilder(gamePsvimg, CmaKey);
2019-10-09 16:11:55 +00:00
foreach (string entry in entrys)
{
string relativePath = entry.Remove(0, GameWorkDir.Length);
2019-10-10 07:17:29 +00:00
relativePath = relativePath.Replace('\\', '/');
2019-10-09 16:11:55 +00:00
bool isDir = File.GetAttributes(entry).HasFlag(FileAttributes.Directory);
if (isDir)
{
builder.AddDir(entry, parentPath, relativePath);
}
else
{
builder.AddFileAsync(entry, parentPath, relativePath);
while(!builder.HasFinished)
{
try
{
int tBlocks = builder.BlocksWritten;
TotalProgress.Value = tBlocks;
decimal progress = Math.Floor(((decimal)tBlocks / (decimal)noBlocks) * 100);
Status.Text = "Signing the Declaration of Independance " + progress.ToString() + "%";
}
catch (Exception) { }
Application.DoEvents();
}
}
}
long ContentSize = builder.Finish();
2019-10-10 07:17:29 +00:00
gamePsvimg = File.OpenRead(psvimgFilepath);
FileStream gamePsvmd = File.OpenWrite(Path.Combine(BackupDir, "game.psvmd"));
PSVMDBuilder.CreatePsvmd(gamePsvmd, gamePsvimg, ContentSize, "game", CmaKey);
gamePsvmd.Close();
gamePsvimg.Close();
2019-10-09 16:11:55 +00:00
2019-08-17 15:34:08 +00:00
// Package LICENSE
2019-10-10 07:17:29 +00:00
BackupDir = Path.Combine(BackupWorkDir, "license");
psvimgFilepath = Path.Combine(BackupDir, "license.psvimg");
Directory.CreateDirectory(BackupDir);
FileStream licensePsvimg = File.OpenWrite(psvimgFilepath);
licensePsvimg.SetLength(0);
2020-08-23 16:29:07 +00:00
2019-10-10 07:17:29 +00:00
builder = new PSVIMGBuilder(licensePsvimg, CmaKey);
2020-08-23 16:29:07 +00:00
if (!isZrif)
{
builder.AddFile(RifPath.Text, "ux0:pspemu/temp/game/PSP/LICENSE", "/" + ContentID + ".rif");
}
else
{
rif.Seek(0x00, SeekOrigin.Begin);
builder.AddFileFromStream(rif, "ux0:pspemu/temp/game/PSP/LICENSE", "/" + ContentID + ".rif");
}
rif.Close();
2019-10-10 07:17:29 +00:00
ContentSize = builder.Finish();
licensePsvimg = File.OpenRead(psvimgFilepath);
FileStream licensePsvmd = File.OpenWrite(Path.Combine(BackupDir, "license.psvmd"));
PSVMDBuilder.CreatePsvmd(licensePsvmd, licensePsvimg, ContentSize, "license", CmaKey);
licensePsvmd.Close();
licensePsvimg.Close();
2019-08-17 15:34:08 +00:00
// Write PARAM.SFO & ICON0.PNG
string SceSysWorkDir = Path.Combine(BackupWorkDir, "sce_sys");
Directory.CreateDirectory(SceSysWorkDir);
byte[] ParamSfo = GetSfo(ISOPath.Text);
byte[] Icon0 = GetIcon(ISOPath.Text);
File.WriteAllBytes(Path.Combine(SceSysWorkDir, "param.sfo"), ParamSfo);
File.WriteAllBytes(Path.Combine(SceSysWorkDir, "icon0.png"), Icon0);
Status.Text = "YOU HAVE MADE A SOCIAL CONTRACT WITH FREEDOM!";
TotalProgress.Value = 0;
2019-10-10 07:17:29 +00:00
try
{
Directory.Delete(TmpDir, true);
}
catch (Exception) { };
if (!MutedAudio)
2019-08-18 07:48:44 +00:00
{
Stream str = Resources.Murica;
SoundPlayer snd = new SoundPlayer(str);
snd.Play();
}
enable();
2019-08-17 15:34:08 +00:00
MessageBox.Show("YOU HAVE MADE A SOCIAL CONTRACT WITH FREEDOM!", "FREEDOM!", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void FindFromCMA_Click(object sender, EventArgs e)
{
this.Hide();
string cmaDir = "";
string accountId = "0000000000000000";
2019-10-08 06:10:57 +00:00
2019-08-17 15:34:08 +00:00
try
{
2019-10-08 06:10:57 +00:00
//try qcma
cmaDir = Registry.CurrentUser.OpenSubKey(@"Software\codestation\qcma").GetValue("appsPath").ToString();
accountId = Registry.CurrentUser.OpenSubKey(@"Software\codestation\qcma").GetValue("lastAccountId").ToString();
2019-08-17 15:34:08 +00:00
}
2019-10-08 06:10:57 +00:00
catch (Exception)
2019-08-17 15:34:08 +00:00
{
try
{
2019-10-08 06:10:57 +00:00
//try sony cma
cmaDir = Registry.CurrentUser.OpenSubKey(@"Software\Sony Corporation\Content Manager Assistant\Settings").GetValue("ApplicationHomePath").ToString();
2019-08-17 15:34:08 +00:00
}
catch (Exception)
{
try
{
2019-10-08 06:10:57 +00:00
//try devkit cma
cmaDir = Registry.CurrentUser.OpenSubKey(@"Software\SCE\PSP2\Services\Content Manager Assistant for PlayStation(R)Vita DevKit\Settings").GetValue("ApplicationHomePath").ToString();
2019-08-17 15:34:08 +00:00
}
catch (Exception)
{
try
{
2019-10-08 06:10:57 +00:00
string DefaultDir = Path.Combine(Environment.GetEnvironmentVariable("HOMEDRIVE"), Environment.GetEnvironmentVariable("HOMEPATH"), "Documents", "PS Vita");
if (Directory.Exists(DefaultDir))
{
cmaDir = DefaultDir;
}
2019-08-17 15:34:08 +00:00
}
catch (Exception)
{
2019-10-08 06:10:57 +00:00
//Do nothing
2019-08-17 15:34:08 +00:00
}
}
}
2019-10-08 06:10:57 +00:00
2019-08-17 15:34:08 +00:00
}
2019-08-22 05:26:37 +00:00
2019-08-17 15:34:08 +00:00
CHOVYCmaSelector ccs = new CHOVYCmaSelector(cmaDir, accountId);
ccs.FormClosing += Ccs_FormClosing;
ccs.ShowDialog();
}
private void Ccs_FormClosing(object sender, FormClosingEventArgs e)
{
CHOVYCmaSelector ccs = (CHOVYCmaSelector)sender;
string CmaDir = ccs.GetCmaDir();
string CmaAid = ccs.GetCmaAid();
string Backup = ccs.GetSelectedBackup();
2019-10-09 16:11:55 +00:00
2019-10-08 06:10:57 +00:00
WriteSetting("CmaDir", CmaDir);
2019-08-17 15:34:08 +00:00
if (Backup == "")
{
return;
}
2019-10-06 16:55:42 +00:00
2019-08-17 15:34:08 +00:00
string BackupPath = Path.Combine(CmaDir, "PGAME", CmaAid, Backup, "game", "game.psvimg");
if(!File.Exists(BackupPath))
{
2019-10-09 16:11:55 +00:00
MessageBox.Show("Could not find \n" + BackupPath + "\n Perhaps backup failed?", "License Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
ccs.Hide();
this.Show();
this.Focus();
2019-08-17 15:34:08 +00:00
return;
}
2019-10-06 16:55:42 +00:00
byte[] AID = BitConverter.GetBytes(Convert.ToInt64(CmaAid, 16));
Array.Reverse(AID);
byte[] Key = CmaKeys.GenerateKey(AID);
PSVIMGStream GamePsvimg = new PSVIMGStream(File.OpenRead(BackupPath), Key);
2019-08-17 15:34:08 +00:00
BackupPath = Path.Combine(CmaDir, "PGAME", CmaAid, Backup, "license", "license.psvimg");
2019-10-06 16:55:42 +00:00
if (!File.Exists(BackupPath))
2019-08-18 07:48:44 +00:00
{
2019-10-09 16:11:55 +00:00
MessageBox.Show("Could not find \n"+BackupPath+"\n Perhaps backup failed?","License Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
ccs.Hide();
this.Show();
this.Focus();
2019-08-18 07:48:44 +00:00
return;
}
2019-08-17 15:34:08 +00:00
2019-10-06 16:55:42 +00:00
PSVIMGStream LicensePsvimg = new PSVIMGStream(File.OpenRead(BackupPath), Key);
2019-08-17 15:34:08 +00:00
2019-10-06 16:55:42 +00:00
string Rif = Path.Combine(Application.StartupPath, "GAME.RIF");
2019-08-22 05:26:37 +00:00
2019-10-06 16:55:42 +00:00
PSVIMGFileStream EbootPbp = new PSVIMGFileStream(GamePsvimg, "/EBOOT.PBP");
byte[] VersionKey = pbp.GetVersionKey(EbootPbp);
2019-08-17 15:34:08 +00:00
string VerKey = BitConverter.ToString(VersionKey).Replace("-", "");
WriteSetting("VersionKey", VerKey);
2019-10-06 16:55:42 +00:00
string ContentID = pbp.GetContentId(EbootPbp);
PSVIMGFileStream LicenseRif = new PSVIMGFileStream(LicensePsvimg, "/"+ ContentID+ ".rif");
2020-08-23 16:29:07 +00:00
byte[] LicenseRifBytes = new byte[LicenseRif.Length];
LicenseRif.Read(LicenseRifBytes, 0x00, LicenseRifBytes.Length);
2019-10-06 16:55:42 +00:00
LicenseRif.Close();
LicensePsvimg.Close();
EbootPbp.Close();
GamePsvimg.Close();
2020-08-23 16:29:07 +00:00
byte[] zRifBytes = ZlibStream.CompressBuffer(LicenseRifBytes);
Rif = Convert.ToBase64String(zRifBytes);
2019-08-17 15:34:08 +00:00
WriteSetting("RifPath", Rif);
Versionkey.Text = VerKey;
RifPath.Text = Rif;
2019-10-09 16:11:55 +00:00
ccs.Hide();
this.Show();
this.Focus();
2019-10-06 16:55:42 +00:00
MessageBox.Show("KEYS HAVE BEEN EXTRACTED FROM CMA, YOU MAY NOW LIBERATE YOURSELF", "SUCCESS", MessageBoxButtons.OK, MessageBoxIcon.Information);
2019-08-17 15:34:08 +00:00
}
private void BrowseButton_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Title = "Select PSP UMD image *.iso";
ofd.Filter = "ISO9660 Image Files (*.iso)|*.iso";
ofd.ShowDialog();
ISOPath.Text = ofd.FileName;
}
2019-08-18 07:48:44 +00:00
private void CHOVY_FormClosing(object sender, FormClosingEventArgs e)
{
Environment.Exit(0);
}
private void PsmChan_Click(object sender, EventArgs e)
{
if(!MutedAudio)
{
MutedAudio = true;
WriteSetting("MuteAudio", "1");
}
else
{
MutedAudio = false;
WriteSetting("MuteAudio", "0");
}
}
2020-08-12 00:08:58 +00:00
private void DexAidEnabler_Click(object sender, EventArgs e)
{
if (!IsDexAidSet())
{
WriteSetting("DexAid", "1");
MessageBox.Show("Enabled DEX Aid\n(0x0000000000000000) will be used for CMA Backups.", "Dex Aid", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
WriteSetting("DexAid", "0");
MessageBox.Show("Enabled Retail Aid,\nAid From RIF Will be used for CMA Backups.", "Dex Aid", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
2020-08-23 16:29:07 +00:00
private void Ps1Menu_Click(object sender, EventArgs e)
{
if (!MutedAudio)
{
Stream str = Resources.POPS;
SoundPlayer snd = new SoundPlayer(str);
snd.Play();
}
CHOVYPopsBuilder pops = new CHOVYPopsBuilder();
this.Hide();
pops.Show();
pops.FormClosing += Pops_FormClosing;
}
private void Pops_FormClosing(object sender, FormClosingEventArgs e)
{
this.Show();
}
2019-08-17 15:34:08 +00:00
}
}