442 lines
17 KiB
C#
442 lines
17 KiB
C#
using CHOVY.Properties;
|
|
using DiscUtils.Iso9660;
|
|
using Microsoft.Win32;
|
|
using Param_SFO;
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Media;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
|
|
namespace CHOVY
|
|
{
|
|
|
|
|
|
public partial class CHOVY : Form
|
|
{
|
|
bool MutedAudio = false;
|
|
public byte[] GetSfo(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);
|
|
|
|
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;
|
|
}
|
|
public string ReadSetting(string Setting)
|
|
{
|
|
string Value = "";
|
|
try
|
|
{
|
|
|
|
RegistryKey key;
|
|
key = Registry.CurrentUser.CreateSubKey(@"Software\CHOVY");
|
|
Value = key.GetValue(Setting).ToString();
|
|
key.Close();
|
|
}
|
|
catch (Exception) { return ""; }
|
|
return Value;
|
|
}
|
|
|
|
public void WriteSetting(string Setting,string Value)
|
|
{
|
|
try
|
|
{
|
|
|
|
RegistryKey key;
|
|
key = Registry.CurrentUser.CreateSubKey(@"Software\CHOVY");
|
|
key.SetValue(Setting, Value);
|
|
key.Close();
|
|
}
|
|
catch (Exception) { }
|
|
}
|
|
|
|
public CHOVY()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
private void CHOVY_Load(object sender, EventArgs e)
|
|
{
|
|
|
|
if(ReadSetting("MuteAudio") == "1")
|
|
{
|
|
MutedAudio = true;
|
|
}
|
|
|
|
Versionkey.Text = ReadSetting("VersionKey");
|
|
RifPath.Text = ReadSetting("RifPath");
|
|
}
|
|
|
|
private void FREEDOM_Click(object sender, EventArgs e)
|
|
{
|
|
if(RifPath.Text == "" || !File.Exists(RifPath.Text))
|
|
{
|
|
MessageBox.Show("INVALID RIF PATH!", "RIF ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
if(Versionkey.Text.Length != 32)
|
|
{
|
|
MessageBox.Show("INVALID VERSION KEY!", "VERKEY ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
if(ISOPath.Text == "" || !File.Exists(ISOPath.Text))
|
|
{
|
|
MessageBox.Show("INVALID ISO PATH!", "ISO ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
|
|
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");
|
|
string GameWorkDir = Path.Combine(TmpDir, "ux0_pspemu_temp_game_PSP_GAME_"+ TitleID);
|
|
// string GameWorkDir = Path.Combine(TmpDir, TitleID);
|
|
string LicenseWorkDir = Path.Combine(TmpDir, "ux0_pspemu_temp_game_PSP_LICENSE");
|
|
string EbootFile = Path.Combine(GameWorkDir, "EBOOT.PBP");
|
|
string EbootSignature = Path.Combine(GameWorkDir, "__sce_ebootpbp");
|
|
string GamePathFile = Path.Combine(GameWorkDir, "VITA_PATH.TXT");
|
|
string LicensePathFile = Path.Combine(LicenseWorkDir, "VITA_PATH.TXT");
|
|
|
|
|
|
try
|
|
{
|
|
Directory.Delete(TmpDir, true);
|
|
}
|
|
catch (Exception) { };
|
|
Directory.CreateDirectory(TmpDir);
|
|
Directory.CreateDirectory(GameWorkDir);
|
|
|
|
|
|
//Read RIF data
|
|
byte[] ContentId = new byte[0x24];
|
|
byte[] RifAid = new byte[0x08];
|
|
FileStream rif = File.OpenRead(RifPath.Text);
|
|
rif.Seek(0x10, SeekOrigin.Begin);
|
|
rif.Read(ContentId, 0x00, 0x24);
|
|
rif.Seek(0x08, SeekOrigin.Begin);
|
|
rif.Read(RifAid, 0x00, 0x08);
|
|
rif.Close();
|
|
|
|
string ContentID = Encoding.UTF8.GetString(ContentId);
|
|
string Aid = BitConverter.ToString(RifAid).Replace("-", "").ToLower();
|
|
string BackupWorkDir = Path.Combine(CmaDir, "PGAME", Aid, TitleID);
|
|
|
|
|
|
TotalProgress.Style = ProgressBarStyle.Continuous;
|
|
Status.Text = "Overthrowing The PSPEMU Monarchy 00%";
|
|
Process signnp = pbp.GenPbpFromIso(ISOPath.Text, EbootFile, ContentID, Versionkey.Text, CompressPBP.Checked);
|
|
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;
|
|
Status.Text = "Overthrowing The PSPEMU Monarchy " + Progress;
|
|
}
|
|
Application.DoEvents();
|
|
}
|
|
TotalProgress.Value = 100;
|
|
Status.Text = "Progress % ";
|
|
|
|
File.WriteAllText(GamePathFile, "ux0:pspemu/temp/game/PSP/GAME/" + TitleID + "\x00");
|
|
|
|
TotalProgress.Style = ProgressBarStyle.Marquee;
|
|
Status.Text = "Signing the Declaration of Independance";
|
|
Process ChovyGen = pbp.gen__sce_ebootpbp(EbootFile, Aid);
|
|
while(!ChovyGen.HasExited)
|
|
{
|
|
Application.DoEvents();
|
|
}
|
|
if (!File.Exists(EbootSignature) || ChovyGen.ExitCode != 0)
|
|
{
|
|
MessageBox.Show("CHOVY-GEN.EXE FAILED!\nArguments:\n" + ChovyGen.StartInfo.Arguments + "\nStdOut:\n" + ChovyGen.StandardOutput.ReadToEnd() + "\nStdErr:\n" + ChovyGen.StandardError.ReadToEnd());
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* BUILD PSVIMG FILE
|
|
*/
|
|
|
|
// Pacakge GAME
|
|
|
|
|
|
string BackupGameDir = Path.Combine(BackupWorkDir, "game");
|
|
Directory.CreateDirectory(BackupGameDir);
|
|
Process psvimg_create = psvimgtools.PSVIMG_CREATE(Aid, "game" ,TmpDir, Path.Combine(BackupWorkDir,"game"));
|
|
while(!psvimg_create.HasExited)
|
|
{
|
|
Application.DoEvents();
|
|
}
|
|
if (psvimg_create.ExitCode != 0)
|
|
{
|
|
MessageBox.Show("PSVIMG-CREATE.EXE FAILED!\nArguments:\n" + psvimg_create.StartInfo.Arguments + "\nStdOut:\n" + psvimg_create.StandardOutput.ReadToEnd() + "\nStdErr:\n" + psvimg_create.StandardError.ReadToEnd());
|
|
return;
|
|
}
|
|
|
|
// Package LICENSE
|
|
try
|
|
{
|
|
Directory.Delete(TmpDir, true);
|
|
}
|
|
catch (Exception) { };
|
|
Directory.CreateDirectory(TmpDir);
|
|
Directory.CreateDirectory(LicenseWorkDir);
|
|
File.Copy(RifPath.Text, Path.Combine(LicenseWorkDir, ContentID + ".rif"), true);
|
|
File.WriteAllText(LicensePathFile, "ux0:pspemu/temp/game/PSP/LICENSE\x00");
|
|
Directory.CreateDirectory(BackupGameDir);
|
|
psvimg_create = psvimgtools.PSVIMG_CREATE(Aid, "license", TmpDir, Path.Combine(BackupWorkDir, "license"));
|
|
while (!psvimg_create.HasExited)
|
|
{
|
|
Application.DoEvents();
|
|
}
|
|
if(psvimg_create.ExitCode != 0)
|
|
{
|
|
MessageBox.Show("PSVIMG-CREATE.EXE FAILED!\nArguments:\n" + psvimg_create.StartInfo.Arguments + "\nStdOut:\n" + psvimg_create.StandardOutput.ReadToEnd() + "\nStdErr:\n" + psvimg_create.StandardError.ReadToEnd());
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
Directory.Delete(TmpDir, true);
|
|
}
|
|
catch (Exception) { };
|
|
|
|
// 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;
|
|
TotalProgress.Style = ProgressBarStyle.Continuous;
|
|
|
|
if(!MutedAudio)
|
|
{
|
|
Stream str = Resources.Murica;
|
|
SoundPlayer snd = new SoundPlayer(str);
|
|
snd.Play();
|
|
}
|
|
|
|
|
|
MessageBox.Show("YOU HAVE MADE A SOCIAL CONTRACT WITH FREEDOM!", "FREEDOM!", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
}
|
|
|
|
private void FindFromCMA_Click(object sender, EventArgs e)
|
|
{
|
|
/* Ccs_FormClosing(null, null);
|
|
return;*/
|
|
|
|
this.Hide();
|
|
string cmaDir = "";
|
|
string accountId = "0000000000000000";
|
|
try
|
|
{
|
|
//try qcma
|
|
cmaDir = Registry.CurrentUser.OpenSubKey(@"Software\codestation\qcma").GetValue("appsPath").ToString();
|
|
accountId = Registry.CurrentUser.OpenSubKey(@"Software\codestation\qcma").GetValue("lastAccountId").ToString();
|
|
}
|
|
catch (Exception)
|
|
{
|
|
try
|
|
{
|
|
//try sony cma
|
|
cmaDir = Registry.CurrentUser.OpenSubKey(@"Software\Sony Corporation\Content Manager Assistant\Settings").GetValue("ApplicationHomePath").ToString();
|
|
}
|
|
catch (Exception)
|
|
{
|
|
try
|
|
{
|
|
//try devkit cma
|
|
cmaDir = Registry.CurrentUser.OpenSubKey(@"Software\SCE\PSP2\Services\Content Manager Assistant for PlayStation(R)Vita DevKit\Settings").GetValue("ApplicationHomePath").ToString();
|
|
}
|
|
catch (Exception)
|
|
{
|
|
try
|
|
{
|
|
string DefaultDir = Path.Combine(Environment.GetEnvironmentVariable("HOMEDRIVE"), Environment.GetEnvironmentVariable("HOMEPATH"), "Documents", "PS Vita");
|
|
if (Directory.Exists(DefaultDir))
|
|
{
|
|
cmaDir = DefaultDir;
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
//Do nothing
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
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();
|
|
|
|
ccs.Hide();
|
|
this.Show();
|
|
this.Focus();
|
|
|
|
if (Backup == "")
|
|
{
|
|
return;
|
|
}
|
|
|
|
string output = Path.Combine(Application.StartupPath, "_tmp");
|
|
Directory.CreateDirectory(output);
|
|
|
|
string OutputPbp = Path.Combine(output, "ux0_pspemu_temp_game_PSP_GAME_" + Backup, "EBOOT.PBP");
|
|
string GameFolder = Path.Combine(output, "ux0_pspemu_temp_game_PSP_GAME_" + Backup);
|
|
string LicenseFolder = Path.Combine(output, "ux0_pspemu_temp_game_PSP_LICENSE");
|
|
|
|
Status.Text = "Declaring Independance from the GAME.PSVIMG";
|
|
string BackupPath = Path.Combine(CmaDir, "PGAME", CmaAid, Backup, "game", "game.psvimg");
|
|
if(!File.Exists(BackupPath))
|
|
{
|
|
return;
|
|
}
|
|
TotalProgress.Style = ProgressBarStyle.Marquee;
|
|
Process psvimg = psvimgtools.PSVIMG_EXTRACT(CmaAid, BackupPath, output);
|
|
while (!psvimg.HasExited)
|
|
{
|
|
Application.DoEvents();
|
|
}
|
|
if(!Directory.Exists(GameFolder) || psvimg.ExitCode != 0)
|
|
{
|
|
MessageBox.Show("PSVIMG-EXTRACT.EXE FAILED!\nArguments:\n" + psvimg.StartInfo.Arguments + "\nStdOut:\n" + psvimg.StandardOutput.ReadToEnd() + "\nStdErr:\n" + psvimg.StandardError.ReadToEnd());
|
|
return;
|
|
}
|
|
|
|
Status.Text = "Declaring Independance from the LICENSE.PSVIMG";
|
|
BackupPath = Path.Combine(CmaDir, "PGAME", CmaAid, Backup, "license", "license.psvimg");
|
|
psvimg = psvimgtools.PSVIMG_EXTRACT(CmaAid, BackupPath, output);
|
|
while(!psvimg.HasExited)
|
|
{
|
|
Application.DoEvents();
|
|
}
|
|
if (!Directory.Exists(LicenseFolder) || psvimg.ExitCode != 0)
|
|
{
|
|
MessageBox.Show("PSVIMG-EXTRACT.EXE FAILED!\nArguments:\n" + psvimg.StartInfo.Arguments + "\nStdOut:\n" + psvimg.StandardOutput.ReadToEnd() + "\nStdErr:\n" + psvimg.StandardError.ReadToEnd());
|
|
return;
|
|
}
|
|
|
|
/* -- This was some debug stuff
|
|
OpenFileDialog Openpbp = new OpenFileDialog();
|
|
Openpbp.ShowDialog();
|
|
string OutputPbp = Openpbp.FileName;
|
|
|
|
OpenFileDialog OpenRif = new OpenFileDialog();
|
|
OpenRif.ShowDialog();
|
|
string Rif = OpenRif.FileName;
|
|
*/
|
|
byte[] VersionKey = pbp.GetVersionKey(OutputPbp);
|
|
string VerKey = BitConverter.ToString(VersionKey).Replace("-", "");
|
|
WriteSetting("VersionKey", VerKey);
|
|
|
|
string ContentID = pbp.GetContentId(OutputPbp);
|
|
string Rif = Path.Combine(Application.StartupPath, "GAME.RIF");
|
|
string LicensePath = Path.Combine(output, "ux0_pspemu_temp_game_PSP_LICENSE", ContentID + ".rif");
|
|
|
|
File.Copy(LicensePath, Rif, true);
|
|
WriteSetting("RifPath", Rif);
|
|
WriteSetting("CmaDir", CmaDir);
|
|
|
|
Versionkey.Text = VerKey;
|
|
RifPath.Text = Rif;
|
|
|
|
if (Directory.Exists(output))
|
|
{
|
|
try
|
|
{
|
|
Directory.Delete(output, true);
|
|
}
|
|
catch (Exception) { }
|
|
|
|
}
|
|
|
|
Status.Text = "Progress %";
|
|
TotalProgress.Style = ProgressBarStyle.Continuous;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
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");
|
|
}
|
|
}
|
|
}
|
|
}
|