mirror of
https://github.com/LBPUnion/UnionPatcher.git
synced 2025-08-04 15:18:49 +00:00
Merge edfe30154e
into 7b88e27843
This commit is contained in:
commit
11d32d0cd6
5 changed files with 203 additions and 211 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -9,6 +9,7 @@
|
||||||
*.user
|
*.user
|
||||||
*.userosscache
|
*.userosscache
|
||||||
*.sln.docstates
|
*.sln.docstates
|
||||||
|
.vscode
|
||||||
|
|
||||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||||
*.userprefs
|
*.userprefs
|
||||||
|
|
|
@ -24,25 +24,8 @@ public class FilePatchForm : Form {
|
||||||
return control;
|
return control;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Control CreateHelpButton(int tabIndex = 0) {
|
|
||||||
Button control = new() {
|
|
||||||
Text = "Help",
|
|
||||||
TabIndex = tabIndex,
|
|
||||||
};
|
|
||||||
|
|
||||||
control.Click += delegate {
|
|
||||||
Process process = new();
|
|
||||||
|
|
||||||
process.StartInfo.UseShellExecute = true;
|
|
||||||
process.StartInfo.FileName = "https://www.lbpunion.com";
|
|
||||||
process.Start();
|
|
||||||
};
|
|
||||||
|
|
||||||
return control;
|
|
||||||
}
|
|
||||||
|
|
||||||
public FilePatchForm() {
|
public FilePatchForm() {
|
||||||
this.Title = "UnionPatcher - File Patch";
|
this.Title = "File Patch";
|
||||||
this.ClientSize = new Size(500, -1);
|
this.ClientSize = new Size(500, -1);
|
||||||
this.Content = new TableLayout {
|
this.Content = new TableLayout {
|
||||||
Spacing = new Size(5,5),
|
Spacing = new Size(5,5),
|
||||||
|
@ -61,7 +44,7 @@ public class FilePatchForm : Form {
|
||||||
new TableCell(this.outputFileName = new FilePicker { TabIndex = 2, FileAction = FileAction.SaveFile, Filters = { new FileFilter("ELF files", "*.elf", "*.ELF"), new FileFilter("All Files", "*.*") }})
|
new TableCell(this.outputFileName = new FilePicker { TabIndex = 2, FileAction = FileAction.SaveFile, Filters = { new FileFilter("ELF files", "*.elf", "*.ELF"), new FileFilter("All Files", "*.*") }})
|
||||||
),
|
),
|
||||||
new TableRow(
|
new TableRow(
|
||||||
new TableCell(this.CreateHelpButton(4)),
|
new TableCell(),
|
||||||
new TableCell(this.CreatePatchButton(3))
|
new TableCell(this.CreatePatchButton(3))
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
|
@ -8,8 +8,8 @@ namespace LBPUnion.UnionPatcher.Gui.Forms;
|
||||||
public class ModeSelectionForm : Form {
|
public class ModeSelectionForm : Form {
|
||||||
#region UI
|
#region UI
|
||||||
public ModeSelectionForm() {
|
public ModeSelectionForm() {
|
||||||
this.Title = "Welcome to UnionPatcher";
|
this.Title = "UnionPatcher";
|
||||||
this.ClientSize = new Size(500, -1);
|
this.ClientSize = new Size(200, -1);
|
||||||
this.Content = new TableLayout {
|
this.Content = new TableLayout {
|
||||||
Spacing = new Size(5, 5),
|
Spacing = new Size(5, 5),
|
||||||
Padding = new Padding(10, 10, 10, 10),
|
Padding = new Padding(10, 10, 10, 10),
|
||||||
|
@ -17,9 +17,6 @@ public class ModeSelectionForm : Form {
|
||||||
new TableRow(
|
new TableRow(
|
||||||
new TableCell(new Button(openRemotePatcher) { Text = "Remote Patcher (PS3)" })
|
new TableCell(new Button(openRemotePatcher) { Text = "Remote Patcher (PS3)" })
|
||||||
),
|
),
|
||||||
new TableRow(
|
|
||||||
new TableCell(new Button(openLocalPatcher) { Text = "Local Patch (RPCS3)", Enabled = false })
|
|
||||||
),
|
|
||||||
new TableRow(
|
new TableRow(
|
||||||
new TableCell(new Button(openFilePatcher) { Text = "File Patch (PS3/RPCS3)" })
|
new TableCell(new Button(openFilePatcher) { Text = "File Patch (PS3/RPCS3)" })
|
||||||
),
|
),
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using Eto.Drawing;
|
using Eto.Drawing;
|
||||||
using Eto.Forms;
|
using Eto.Forms;
|
||||||
|
|
||||||
|
@ -31,7 +32,7 @@ public class RemotePatchForm : Form
|
||||||
Width = 200,
|
Width = 200,
|
||||||
};
|
};
|
||||||
|
|
||||||
control.Click += delegate {
|
control.Click += async delegate {
|
||||||
if (string.IsNullOrEmpty(this.ps3LocalIP.Text))
|
if (string.IsNullOrEmpty(this.ps3LocalIP.Text))
|
||||||
{
|
{
|
||||||
Gui.CreateOkDialog("Error", "No PS3 IP address specified!");
|
Gui.CreateOkDialog("Error", "No PS3 IP address specified!");
|
||||||
|
@ -56,24 +57,33 @@ public class RemotePatchForm : Form
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
Task patchTask = null;
|
||||||
{
|
|
||||||
if (this.lbpGameID.Text.ToUpper().StartsWith('B'))
|
if (this.lbpGameID.Text.ToUpper().StartsWith('B'))
|
||||||
{
|
{
|
||||||
this.RemotePatcher.DiscEBOOTRemotePatch(this.ps3LocalIP.Text, this.lbpGameID.Text, this.serverUrl.Text, this.ftpUser.Text, this.ftpPass.Text);
|
patchTask = this.RemotePatcher.DiscEBOOTRemotePatch(this.ps3LocalIP.Text, this.lbpGameID.Text, this.serverUrl.Text, this.ftpUser.Text, this.ftpPass.Text);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.RemotePatcher.PSNEBOOTRemotePatch(this.ps3LocalIP.Text, this.lbpGameID.Text, this.serverUrl.Text, this.ftpUser.Text, this.ftpPass.Text);
|
patchTask = this.RemotePatcher.PSNEBOOTRemotePatch(this.ps3LocalIP.Text, this.lbpGameID.Text, this.serverUrl.Text, this.ftpUser.Text, this.ftpPass.Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Something went horribly wrong, this should be impossible to encounter.
|
||||||
|
if (patchTask == null) return;
|
||||||
|
|
||||||
|
Control revertButton = this.FindChild("revert");
|
||||||
|
foreach (Control control in this.Controls) control.Enabled = false;
|
||||||
|
Gui.CreateOkDialog("Sit Tight!", $"We're patching your title for {this.ps3LocalIP.Text}! Maybe grab some tea?");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await patchTask;
|
||||||
|
Gui.CreateOkDialog("Have fun!", $"The Server URL for {this.lbpGameID.Text} on the PS3 at {this.ps3LocalIP.Text} has been patched to {this.serverUrl.Text}");
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Gui.CreateOkDialog("Error occurred while patching", "An error occured while patching:\n" + e);
|
Gui.CreateOkDialog("Error occurred while patching", "An error occured while patching:\n" + e.Message);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
foreach (Control control in this.Controls) control.Enabled = true;
|
||||||
Gui.CreateOkDialog("Success!", $"The Server URL for {this.lbpGameID.Text} on the PS3 at {this.ps3LocalIP.Text} has been patched to {this.serverUrl.Text}");
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return control;
|
return control;
|
||||||
|
@ -85,10 +95,10 @@ public class RemotePatchForm : Form
|
||||||
{
|
{
|
||||||
Text = "Revert EBOOT",
|
Text = "Revert EBOOT",
|
||||||
TabIndex = tabIndex,
|
TabIndex = tabIndex,
|
||||||
Width = 200,
|
Width = 50,
|
||||||
};
|
};
|
||||||
|
|
||||||
control.Click += delegate {
|
control.Click += async delegate {
|
||||||
if (string.IsNullOrEmpty(this.ps3LocalIP.Text))
|
if (string.IsNullOrEmpty(this.ps3LocalIP.Text))
|
||||||
{
|
{
|
||||||
Gui.CreateOkDialog("Form Error", "No PS3 IP address specified!");
|
Gui.CreateOkDialog("Form Error", "No PS3 IP address specified!");
|
||||||
|
@ -101,36 +111,19 @@ public class RemotePatchForm : Form
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (Control control in this.Controls) control.Enabled = false;
|
||||||
|
Task revertTask = this.RemotePatcher.RevertEBOOT(this.ps3LocalIP.Text, this.lbpGameID.Text, this.serverUrl.Text, this.ftpUser.Text, this.ftpPass.Text);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.RemotePatcher.RevertEBOOT(this.ps3LocalIP.Text, this.lbpGameID.Text, this.serverUrl.Text, this.ftpUser.Text, this.ftpPass.Text);
|
await revertTask;
|
||||||
|
Gui.CreateOkDialog("Success!", $"UnionPatcher reverted your the EBOOT for {this.lbpGameID.Text} to stock. You're ready to patch your EBOOT again.");
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Gui.CreateOkDialog("Error occurred while reverting EBOOT", "An error occured while patching:\n" + e);
|
Gui.CreateOkDialog("Error occurred while reverting EBOOT", "An error occured while patching:\n" + e.Message);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
foreach (Control control in this.Controls) control.Enabled = true;
|
||||||
Gui.CreateOkDialog("Success!", $"UnionRemotePatcher reverted your the EBOOT for {this.lbpGameID.Text} to stock. You're ready to patch your EBOOT again.");
|
|
||||||
};
|
|
||||||
|
|
||||||
return control;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Control CreateHelpButton(int tabIndex = 0)
|
|
||||||
{
|
|
||||||
Button control = new()
|
|
||||||
{
|
|
||||||
Text = "Help",
|
|
||||||
TabIndex = tabIndex,
|
|
||||||
};
|
|
||||||
|
|
||||||
control.Click += delegate {
|
|
||||||
Process process = new();
|
|
||||||
|
|
||||||
process.StartInfo.UseShellExecute = true;
|
|
||||||
process.StartInfo.FileName = "https://www.lbpunion.com";
|
|
||||||
process.Start();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return control;
|
return control;
|
||||||
|
@ -138,7 +131,7 @@ public class RemotePatchForm : Form
|
||||||
|
|
||||||
void InitializeComponent()
|
void InitializeComponent()
|
||||||
{
|
{
|
||||||
this.Title = "UnionPatcher - Remote Patch";
|
this.Title = "Remote Patcher";
|
||||||
this.MinimumSize = new Size(450, 200);
|
this.MinimumSize = new Size(450, 200);
|
||||||
this.Resizable = false;
|
this.Resizable = false;
|
||||||
this.Padding = 10;
|
this.Padding = 10;
|
||||||
|
@ -169,11 +162,8 @@ public class RemotePatchForm : Form
|
||||||
new TableCell(this.ftpPass = new TextBox { TabIndex = 4 })
|
new TableCell(this.ftpPass = new TextBox { TabIndex = 4 })
|
||||||
),
|
),
|
||||||
new TableRow(
|
new TableRow(
|
||||||
new TableCell(this.CreateHelpButton(7)),
|
new TableCell(this.CreateRevertEBOOTButton(6)),
|
||||||
new TableRow(
|
new TableCell(this.CreatePatchButton(5))
|
||||||
new TableCell(this.CreatePatchButton(5)),
|
|
||||||
new TableCell(this.CreateRevertEBOOTButton(6))
|
|
||||||
)
|
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,6 +5,7 @@ using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using LBPUnion.UnionPatcher.Communication;
|
using LBPUnion.UnionPatcher.Communication;
|
||||||
|
|
||||||
namespace LBPUnion.UnionPatcher;
|
namespace LBPUnion.UnionPatcher;
|
||||||
|
@ -17,6 +18,8 @@ public class RemotePatch
|
||||||
{
|
{
|
||||||
Console.WriteLine("Getting users...");
|
Console.WriteLine("Getting users...");
|
||||||
|
|
||||||
|
Task<Dictionary<string, string>> users = Task.Run(() =>
|
||||||
|
{
|
||||||
Dictionary<string, string> users = new();
|
Dictionary<string, string> users = new();
|
||||||
|
|
||||||
string[] userFolders = FTP.ListDirectory($"ftp://{ps3Ip}/dev_hdd0/home/", user, pass);
|
string[] userFolders = FTP.ListDirectory($"ftp://{ps3Ip}/dev_hdd0/home/", user, pass);
|
||||||
|
@ -33,6 +36,9 @@ public class RemotePatch
|
||||||
}
|
}
|
||||||
|
|
||||||
return users;
|
return users;
|
||||||
|
});
|
||||||
|
|
||||||
|
return users.Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void LaunchSCETool(string args)
|
public static void LaunchSCETool(string args)
|
||||||
|
@ -47,10 +53,12 @@ public class RemotePatch
|
||||||
if (RuntimeInformation.ProcessArchitecture == Architecture.X64)
|
if (RuntimeInformation.ProcessArchitecture == Architecture.X64)
|
||||||
{
|
{
|
||||||
platformExecutable = "scetool/linux64/scetool";
|
platformExecutable = "scetool/linux64/scetool";
|
||||||
} else if (RuntimeInformation.ProcessArchitecture == Architecture.Arm)
|
}
|
||||||
|
else if (RuntimeInformation.ProcessArchitecture == Architecture.Arm)
|
||||||
{
|
{
|
||||||
platformExecutable = "scetool/linuxarm/scetool";
|
platformExecutable = "scetool/linuxarm/scetool";
|
||||||
} else if (RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
|
}
|
||||||
|
else if (RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
|
||||||
{
|
{
|
||||||
platformExecutable = "scetool/linuxarm64/scetool";
|
platformExecutable = "scetool/linuxarm64/scetool";
|
||||||
}
|
}
|
||||||
|
@ -87,10 +95,12 @@ public class RemotePatch
|
||||||
Console.WriteLine("\n===== END SCETOOL =====\n\n");
|
Console.WriteLine("\n===== END SCETOOL =====\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RevertEBOOT(string ps3ip, string gameID, string serverURL, string user, string pass)
|
public Task RevertEBOOT(string ps3ip, string gameID, string serverURL, string user, string pass)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Restoring original EBOOT.BIN from EBOOT.BIN.BAK");
|
Console.WriteLine("Restoring original EBOOT.BIN from EBOOT.BIN.BAK");
|
||||||
|
|
||||||
|
return Task.Run(() =>
|
||||||
|
{
|
||||||
// Create a simple directory structure
|
// Create a simple directory structure
|
||||||
Directory.CreateDirectory(@"eboot");
|
Directory.CreateDirectory(@"eboot");
|
||||||
Directory.CreateDirectory($@"eboot/{gameID}");
|
Directory.CreateDirectory($@"eboot/{gameID}");
|
||||||
|
@ -99,19 +109,25 @@ public class RemotePatch
|
||||||
// Now we'll check and see if a backup exists on the server, if so download it and then upload it back as EBOOT.BIN
|
// Now we'll check and see if a backup exists on the server, if so download it and then upload it back as EBOOT.BIN
|
||||||
if (FTP.FileExists($"ftp://{ps3ip}/dev_hdd0/game/{gameID}/USRDIR/EBOOT.BIN.BAK", user, pass))
|
if (FTP.FileExists($"ftp://{ps3ip}/dev_hdd0/game/{gameID}/USRDIR/EBOOT.BIN.BAK", user, pass))
|
||||||
{
|
{
|
||||||
|
|
||||||
FTP.DownloadFile($"ftp://{ps3ip}/dev_hdd0/game/{gameID}/USRDIR/EBOOT.BIN.BAK", @$"eboot/{gameID}/original/EBOOT.BIN.BAK", user, pass);
|
FTP.DownloadFile($"ftp://{ps3ip}/dev_hdd0/game/{gameID}/USRDIR/EBOOT.BIN.BAK", @$"eboot/{gameID}/original/EBOOT.BIN.BAK", user, pass);
|
||||||
FTP.UploadFile(@$"eboot/{gameID}/original/EBOOT.BIN.BAK", $"ftp://{ps3ip}/dev_hdd0/game/{gameID}/USRDIR/EBOOT.BIN", user, pass);
|
FTP.UploadFile(@$"eboot/{gameID}/original/EBOOT.BIN.BAK", $"ftp://{ps3ip}/dev_hdd0/game/{gameID}/USRDIR/EBOOT.BIN", user, pass);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new WebException("Could not find EBOOT.BIN.BAK on server.");
|
throw new WebException("Could not find EBOOT.BIN.BAK on server.");
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PSNEBOOTRemotePatch(string ps3ip, string gameID, string serverURL, string user, string pass)
|
public Task PSNEBOOTRemotePatch(string ps3ip, string gameID, string serverURL, string user, string pass)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Detected Digital Copy - Running in Full Mode");
|
Console.WriteLine("Detected Digital Copy - Running in Full Mode");
|
||||||
|
|
||||||
|
// Create a new thread so we don't occupy the UI thread.
|
||||||
|
return Task.Run(() =>
|
||||||
|
{
|
||||||
string idps = "";
|
string idps = "";
|
||||||
string contentID = "";
|
string contentID = "";
|
||||||
Dictionary<string, string> users;
|
Dictionary<string, string> users;
|
||||||
|
@ -196,13 +212,17 @@ public class RemotePatch
|
||||||
// And upload the encrypted, patched EBOOT to the system.
|
// And upload the encrypted, patched EBOOT to the system.
|
||||||
FTP.UploadFile(@$"eboot/{gameID}/patched/EBOOT.BIN",
|
FTP.UploadFile(@$"eboot/{gameID}/patched/EBOOT.BIN",
|
||||||
$"ftp://{ps3ip}/dev_hdd0/game/{gameID}/USRDIR/EBOOT.BIN", user, pass);
|
$"ftp://{ps3ip}/dev_hdd0/game/{gameID}/USRDIR/EBOOT.BIN", user, pass);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cut-down version that only patches disc copies
|
// Cut-down version that only patches disc copies
|
||||||
public void DiscEBOOTRemotePatch(string ps3ip, string gameID, string serverURL, string user, string pass)
|
public Task DiscEBOOTRemotePatch(string ps3ip, string gameID, string serverURL, string user, string pass)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Detected Disc Copy - Running in Simplified Mode");
|
Console.WriteLine("Detected Disc Copy - Running in Simplified Mode");
|
||||||
|
|
||||||
|
// Create a new thread so we don't occupy the UI thread.
|
||||||
|
return Task.Run(() =>
|
||||||
|
{
|
||||||
// Create a simple directory structure
|
// Create a simple directory structure
|
||||||
Directory.CreateDirectory(@"eboot");
|
Directory.CreateDirectory(@"eboot");
|
||||||
Directory.CreateDirectory($@"eboot/{gameID}");
|
Directory.CreateDirectory($@"eboot/{gameID}");
|
||||||
|
@ -236,5 +256,6 @@ public class RemotePatch
|
||||||
// And upload the encrypted, patched EBOOT to the system.
|
// And upload the encrypted, patched EBOOT to the system.
|
||||||
FTP.UploadFile(@$"eboot/{gameID}/patched/EBOOT.BIN",
|
FTP.UploadFile(@$"eboot/{gameID}/patched/EBOOT.BIN",
|
||||||
$"ftp://{ps3ip}/dev_hdd0/game/{gameID}/USRDIR/EBOOT.BIN", user, pass);
|
$"ftp://{ps3ip}/dev_hdd0/game/{gameID}/USRDIR/EBOOT.BIN", user, pass);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue