From 47b787b9e8d853769c02081de359cb0511175e75 Mon Sep 17 00:00:00 2001 From: "mzolob@gmail.com" Date: Tue, 27 Sep 2011 03:19:01 +0000 Subject: [PATCH] Initial Release, yay! ^_^ --- Sharpii.sln | 20 + Sharpii/BNS.cs | 203 ++++++++++ Sharpii/HBC.cs | 134 +++++++ Sharpii/IOS.cs | 226 +++++++++++ Sharpii/Program.cs | 146 +++++++ Sharpii/Properties/AssemblyInfo.cs | 36 ++ Sharpii/Sharpii.csproj | 100 +++++ Sharpii/Sharpii.csproj.user | 25 ++ Sharpii/TPL.cs | 236 ++++++++++++ Sharpii/U8.cs | 227 +++++++++++ Sharpii/WAD.cs | 595 +++++++++++++++++++++++++++++ Sharpii/app.config | 3 + Sharpii/libWiiSharp.dll | Bin 0 -> 160256 bytes 13 files changed, 1951 insertions(+) create mode 100644 Sharpii.sln create mode 100644 Sharpii/BNS.cs create mode 100644 Sharpii/HBC.cs create mode 100644 Sharpii/IOS.cs create mode 100644 Sharpii/Program.cs create mode 100644 Sharpii/Properties/AssemblyInfo.cs create mode 100644 Sharpii/Sharpii.csproj create mode 100644 Sharpii/Sharpii.csproj.user create mode 100644 Sharpii/TPL.cs create mode 100644 Sharpii/U8.cs create mode 100644 Sharpii/WAD.cs create mode 100644 Sharpii/app.config create mode 100644 Sharpii/libWiiSharp.dll diff --git a/Sharpii.sln b/Sharpii.sln new file mode 100644 index 0000000..1fb0189 --- /dev/null +++ b/Sharpii.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual C# Express 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sharpii", "Sharpii\Sharpii.csproj", "{AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}.Debug|x86.ActiveCfg = Debug|x86 + {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}.Debug|x86.Build.0 = Debug|x86 + {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}.Release|x86.ActiveCfg = Release|x86 + {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sharpii/BNS.cs b/Sharpii/BNS.cs new file mode 100644 index 0000000..829f83f --- /dev/null +++ b/Sharpii/BNS.cs @@ -0,0 +1,203 @@ +/* This file is part of Sharpii. + * Copyright (C) 2011 Person66 + * + * Sharpii is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Sharpii is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Sharpii. If not, see . + */ + +using System; +using System.IO; +using libWiiSharp; + +namespace Sharpii +{ + partial class BNS_Stuff + { + public static void BNS(string[] args) + { + if (args.Length < 4) + { + Wav2BNS_help(); + return; + } + + //********************* To BNS ********************* + if (args[1] == "-to") + { + To(args); + return; + } + + if (args[1] == "-from") + { + From(args); + return; + } + + return; + } + + private static void From(string[] args) + { + string input = args[2]; + string output = args[3]; + + //Check if file exists + if (File.Exists(input) == false) + { + System.Console.WriteLine("ERROR: Unable to open file: {0}", input); + return; + } + + //Run main part, and check for exceptions + try + { + //Now convert it + if (Quiet.quiet > 2) + System.Console.Write("Loading file..."); + + Wave WavFile = libWiiSharp.BNS.BnsToWave(input); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 2) + System.Console.Write("Saving wav..."); + + if (output.Substring(output.Length - 4, 4).ToUpper() != ".WAV") + output = output + ".wav"; + + WavFile.Save(output); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 1) + System.Console.WriteLine("Operation completed succesfully!"); + } + catch (Exception ex) + { + System.Console.WriteLine("An unknown error occured, please try again"); + System.Console.WriteLine(""); + System.Console.WriteLine("ERROR DETAILS: {0}", ex.Message); + return; + } + } + + private static void To(string[] args) + { + string input = args[2]; + string output = args[3]; + bool loop = false; + bool mono = false; + + //Check if file exists + if (File.Exists(input) == false) + { + System.Console.WriteLine("ERROR: Unable to open file: {0}", input); + return; + } + + for (int i = 1; i < args.Length; i++) + { + switch (args[i].ToUpper()) + { + case "-L": + loop = true; + break; + case "-LOOP": + loop = true; + break; + case "-M": + mono = true; + break; + case "-MONO": + mono = true; + break; + } + } + + //Run main part, and check for exceptions + try + { + if (Quiet.quiet > 2) + System.Console.Write("Loading file..."); + + BNS WavFile = new BNS(input); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (loop == true) + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Applying loop"); + WavFile.SetLoop(1); + } + if (mono == true) + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Converting to mono"); + WavFile.StereoToMono = true; + } + + if (Quiet.quiet > 2) + System.Console.Write("Saving BNS..."); + + WavFile.Convert(); + + if (output.Substring(output.Length - 4, 4).ToUpper() != ".BNS") + output = output + ".bns"; + + WavFile.Save(output); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 1) + System.Console.WriteLine("Operation completed succesfully!"); + } + catch (Exception ex) + { + System.Console.WriteLine("An unknown error occured, please try again"); + System.Console.WriteLine(""); + System.Console.WriteLine("ERROR DETAILS: {0}", ex.Message); + return; + } + } + + public static void Wav2BNS_help() + { + System.Console.WriteLine(""); + System.Console.WriteLine("Sharpii {0} - BNS - A tool by person66, using libWiiSharp.dll by leathl", Version.version); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Usage:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Sharpii BNS [-to | -from] input.wav output.bns [-l/-loop] [-m/-mono]"); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Arguments:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" -to Convert wav to bns"); + System.Console.WriteLine(" -from Create wav from bns"); + System.Console.WriteLine(" input.wav The input wave sound file"); + System.Console.WriteLine(" output.bns The output BNS sound file"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Arguments for converting to BNS:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" -l | -loop Creates a looping BNS"); + System.Console.WriteLine(" -m | -mono Convert stereo sound to mono BNS"); + } + } +} diff --git a/Sharpii/HBC.cs b/Sharpii/HBC.cs new file mode 100644 index 0000000..a94eadf --- /dev/null +++ b/Sharpii/HBC.cs @@ -0,0 +1,134 @@ +/* This file is part of Sharpii. + * Copyright (C) 2011 Person66 + * + * Sharpii is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Sharpii is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Sharpii. If not, see . + */ + +using System; +using System.IO; +using libWiiSharp; + +namespace Sharpii +{ + partial class HBC_Stuff + { + public static void SendDol(string[] args) + { + if (args.Length < 3) + { + SendDol_help(); + return; + } + string input = args[1]; + string ip = ""; + string protocol = "JODI"; + bool compress = true; + + //Check if file exists + if (File.Exists(input) == false) + { + System.Console.WriteLine("ERROR: Unable to open file: {0}", input); + return; + } + + //Get parameters + for (int i = 1; i < args.Length; i++) + { + switch (args[i].ToUpper()) + { + case "-IP": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No ip set"); + return; + } + ip = args[i + 1]; + break; + case "-NOCOMP": + compress = false; + break; + case "-OLD": + protocol = "HAXX"; + break; + } + } + + //Run main part, and check for exceptions + try + { + libWiiSharp.Protocol proto = Protocol.JODI; + + if (Quiet.quiet > 2 && protocol == "HAXX") + System.Console.WriteLine("Using old protocol"); + + if (protocol == "HAXX") + proto = Protocol.HAXX; + + if (Quiet.quiet > 2) + System.Console.Write("Loading File..."); + + HbcTransmitter file = new HbcTransmitter(proto, ip); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + + if (Quiet.quiet > 2 && compress == true) + System.Console.Write("Compressing File..."); + + file.Compress = compress; + + if (Quiet.quiet > 2 && compress == true) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 1) + System.Console.Write("Sending file..."); + + file.TransmitFile(input); + + if (Quiet.quiet > 1) + System.Console.Write("Done!\n"); + } + catch (Exception ex) + { + System.Console.WriteLine("An unknown error occured, please try again"); + System.Console.WriteLine(""); + System.Console.WriteLine("ERROR DETAILS: {0}", ex.Message); + return; + } + + return; + + } + + public static void SendDol_help() + { + System.Console.WriteLine(""); + System.Console.WriteLine("Sharpii {0} - SendDol - A tool by person66, using libWiiSharp.dll by leathl", Version.version); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Usage:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Sharpii.exe SendDol file -ip ip_adress [-old] [-nocomp]"); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Arguments:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" file The dol file to send"); + System.Console.WriteLine(" -ip ip_adress The IP address of your wii"); + System.Console.WriteLine(" -old Use for the old (1.0.4 and below) HBC"); + System.Console.WriteLine(" -nocomp Disable compression"); + } + } +} \ No newline at end of file diff --git a/Sharpii/IOS.cs b/Sharpii/IOS.cs new file mode 100644 index 0000000..eb295f6 --- /dev/null +++ b/Sharpii/IOS.cs @@ -0,0 +1,226 @@ +/* This file is part of Sharpii. + * Copyright (C) 2011 Person66 + * + * Sharpii is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Sharpii is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Sharpii. If not, see . + */ + +using System; +using System.IO; +using libWiiSharp; + +namespace Sharpii +{ + partial class IOS_Stuff + { + public static void IOS(string[] args) + { + if (args.Length < 3) + { + IOS_help(); + return; + } + string input = args[1]; + string output = ""; + bool fs = false; + bool es = false; + bool np = false; + int slot = -1; + int version = -1; + + //Check if file exists + if (File.Exists(input) == false) + { + System.Console.WriteLine("ERROR: Unable to open file: {0}", input); + return; + } + + //Get parameters + for (int i = 1; i < args.Length; i++) + { + switch (args[i].ToUpper()) + { + case "-FS": + fs = true; + break; + case "-ES": + es = true; + break; + case "-NP": + np = true; + break; + case "-SLOT": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No slot set"); + return; + } + if (!int.TryParse(args[i + 1], out slot)) + { + Console.WriteLine("Invalid slot {0}...", args[i + 1]); + return; + } + if (slot < 3 || slot > 255) + { + Console.WriteLine("Invalid slot {0}...", slot); + return; + } + break; + case "-V": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No version set"); + return; + } + if (!int.TryParse(args[i + 1], out version)) + { + Console.WriteLine("Invalid version {0}...", args[i + 1]); + return; + } + if (version < 0 || version > 65535) + { + Console.WriteLine("Invalid version {0}...", version); + return; + } + break; + case "-O": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No output set"); + return; + } + output = args[i + 1]; + break; + } + } + + //Main part (most of it was borrowed from PatchIOS) + try + { + WAD ios = new WAD(); + ios.KeepOriginalFooter = true; + + if (Quiet.quiet > 2) + System.Console.Write("Loading File..."); + + ios.LoadFile(input); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + //Check if WAD is an IOS + if ((ios.TitleID >> 32) != 1 || (ios.TitleID & 0xffffffff) > 255 || (ios.TitleID & 0xffffffff) < 3) + { + Console.WriteLine("Only IOS WADs can be patched..."); + return; + } + + IosPatcher patcher = new IosPatcher(); + + patcher.LoadIOS(ref ios); + + //apply patches + if (fs == true) + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Applying Fakesigning patch"); + patcher.PatchFakeSigning(); + } + + if (es == true) + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Applying ES_Identify patch"); + patcher.PatchEsIdentify(); + } + + if (np == true) + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Applying NAND permissions patch"); + patcher.PatchNandPermissions(); + } + + if (slot > -1 || version > -1) + ios.FakeSign = true; + + if (slot > -1) + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Changing IOS slot to: {0}", slot); + ios.TitleID = (ulong)((1UL << 32) | (uint)slot); + } + + if (version > -1) + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Changing title version to: {0}", version); + ios.TitleVersion = (ushort)version; + } + + //check if output was set + if (output != "") + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Saving to file: {0}", output); + ios.Save(output); + } + else + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Saving file"); + + if (output.Substring(output.Length - 4, 4).ToUpper() != ".WAD") + output = output + ".wad"; + + ios.Save(input); + } + if (Quiet.quiet > 1) + System.Console.WriteLine("Operation completed succesfully!"); + } + catch (Exception ex) + { + System.Console.WriteLine("An unknown error occured, please try again"); + System.Console.WriteLine(""); + System.Console.WriteLine("ERROR DETAILS: {0}", ex.Message); + return; + } + + return; + + } + + public static void IOS_help() + { + System.Console.WriteLine(""); + System.Console.WriteLine("Sharpii {0} - IOS - A tool by person66, using libWiiSharp.dll by leathl", Version.version); + System.Console.WriteLine(" Code based off PatchIOS by leathl"); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Usage:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Sharpii.exe IOS input [-o output] [-fs] [-es] [-np] [-s slot] [-v version]"); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Arguments:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" input The input file/folder"); + System.Console.WriteLine(" -o output The output file/folder"); + System.Console.WriteLine(" -fs Patch Fakesigning"); + System.Console.WriteLine(" -es Patch ES_Identify"); + System.Console.WriteLine(" -np Patch NAND Permissions"); + System.Console.WriteLine(" -slot # Change IOS slot to #"); + System.Console.WriteLine(" -v # Change IOS version to #"); + } + } +} \ No newline at end of file diff --git a/Sharpii/Program.cs b/Sharpii/Program.cs new file mode 100644 index 0000000..0dd2ab3 --- /dev/null +++ b/Sharpii/Program.cs @@ -0,0 +1,146 @@ +/* This file is part of Sharpii. + * Copyright (C) 2011 Person66 + * + * Sharpii is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Sharpii is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Sharpii. If not, see . + */ + +using System; +using System.IO; +using libWiiSharp; + +namespace Sharpii +{ + class MainApp + { + static void Main(string[] args) + { + if (args.Length < 1) + { + help(); + return; + } + + for (int i = 1; i < args.Length; i++) + { + switch (args[i].ToUpper()) + { + case "-QUIET": + Quiet.quiet = 1; + break; + case "-Q": + Quiet.quiet = 1; + break; + case "-LOTS": + Quiet.quiet = 3; + break; + } + } + + string Function = args[0]; + + if (Function.ToUpper() == "-H" || Function.ToUpper() == "-HELP" || Function.ToUpper() == "H" || Function.ToUpper() == "HELP") + { + help(); + Environment.Exit(0); + } + + if (Function.ToUpper() == "BNS") + { + BNS_Stuff.BNS(args); + Environment.Exit(0); + } + + if (Function.ToUpper() == "WAD") + { + WAD_Stuff.WAD(args); + Environment.Exit(0); + } + + if (Function.ToUpper() == "TPL") + { + TPL_Stuff.TPL(args); + Environment.Exit(0); + } + + if (Function.ToUpper() == "U8") + { + U8_Stuff.U8(args); + Environment.Exit(0); + } + + if (Function.ToUpper() == "IOS") + { + IOS_Stuff.IOS(args); + Environment.Exit(0); + } + + if (Function.ToUpper() == "SENDDOL" || Function.ToUpper() == "SENDOL") + { + HBC_Stuff.SendDol(args); + Environment.Exit(0); + } + + + + //If tuser gets here, they entered something wrong + System.Console.WriteLine("ERROR: The argument {0} is invalid", args[0]); + + Environment.Exit(0); + } + + private static void help() + { + System.Console.WriteLine(""); + System.Console.WriteLine("Sharpii {0} - A tool by person66, using libWiiSharp.dll by leathl", Version.version); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Usage:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Sharpii [function] [parameters] [-quiet | -q | -lots]"); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Functions:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" BNS Convert a wav to bns, or vice versa"); + System.Console.WriteLine(" WAD Pack/Unpack/Edit a wad file"); + System.Console.WriteLine(" TPL Convert a image to a tpl, or vice versa"); + System.Console.WriteLine(" U8 Pack/Unpack a U8 archive"); + System.Console.WriteLine(" IOS Apply various patches to an IOS"); + System.Console.WriteLine(" SendDol Send a dol to the HBC over wifi"); + System.Console.WriteLine(""); + System.Console.WriteLine(" NOTE: Too see more detailed descriptions of any of the above,"); + System.Console.WriteLine(" use 'Sharpii [function] -h'"); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Global Arguments:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" -quiet | -q Try not to display any output"); + System.Console.WriteLine(" -lots Display lots of output"); + System.Console.WriteLine(""); + + + } + + } + } + public class Quiet { + //1 = little + //2 = normal + //3 = lots + public static int quiet = 2; + } + public class Version + { + public static string version = "1.0"; + } \ No newline at end of file diff --git a/Sharpii/Properties/AssemblyInfo.cs b/Sharpii/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..7bfb214 --- /dev/null +++ b/Sharpii/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Sharpii")] +[assembly: AssemblyDescription("A command line app for libWiiSharp.dll")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Sharpii")] +[assembly: AssemblyCopyright("2011 Person66")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("88c17956-a329-4c36-8919-97334e6b6e4d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Sharpii/Sharpii.csproj b/Sharpii/Sharpii.csproj new file mode 100644 index 0000000..b9e9382 --- /dev/null +++ b/Sharpii/Sharpii.csproj @@ -0,0 +1,100 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827} + Exe + Properties + Sharpii + Sharpii + v2.0 + + + 512 + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + true + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + true + + + + .\libWiiSharp.dll + + + + + + + + + + + + + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + \ No newline at end of file diff --git a/Sharpii/Sharpii.csproj.user b/Sharpii/Sharpii.csproj.user new file mode 100644 index 0000000..f3f09e3 --- /dev/null +++ b/Sharpii/Sharpii.csproj.user @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + publish\ + + + + + + en-US + false + + \ No newline at end of file diff --git a/Sharpii/TPL.cs b/Sharpii/TPL.cs new file mode 100644 index 0000000..22bdc0d --- /dev/null +++ b/Sharpii/TPL.cs @@ -0,0 +1,236 @@ +/* This file is part of Sharpii. + * Copyright (C) 2011 Person66 + * + * Sharpii is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Sharpii is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Sharpii. If not, see . + */ + +using System; +using System.IO; +using libWiiSharp; + +namespace Sharpii +{ + partial class TPL_Stuff + { + public static void TPL(string[] args) + { + if (args.Length < 4) + { + TPL_help(); + return; + } + + //********************* To TPL ********************* + if (args[1] == "-to") + { + To(args); + return; + } + + //********************* From TPL ********************* + if (args[1] == "-from") + { + From(args); + return; + } + + //If tuser gets here, they entered something wrong + System.Console.WriteLine("ERROR: The argument {0} is invalid", args[1]); + return; + + } + + private static void From(string[] args) + { + string input = args[2]; + string output = args[3]; + + //Check if file exists + if (File.Exists(input) == false) + { + System.Console.WriteLine("ERROR: Unable to open file: {0}", input); + return; + } + + //Run main part, and check for exceptions + try + { + //Load tpl + if (Quiet.quiet > 2) + System.Console.Write("Loading file..."); + + TPL tplfile = libWiiSharp.TPL.Load(input); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + //save image + if (Quiet.quiet > 2) + System.Console.Write("Extracting texture..."); + + tplfile.ExtractTexture(output); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 1) + System.Console.WriteLine("Operation completed succesfully!"); + } + catch (Exception ex) + { + System.Console.WriteLine("An unknown error occured, please try again"); + System.Console.WriteLine(""); + System.Console.WriteLine("ERROR DETAILS: {0}", ex.Message); + return; + } + } + + private static void To(string[] args) + { + //Setting up variables + string input = args[2]; + string output = args[3]; + string tplFormat = "RGB565"; + + //Check if file exists + if (File.Exists(input) == false) + { + System.Console.WriteLine("ERROR: Unable to open file: {0}", input); + return; + } + + //Check for arguments + for (int i = 1; i < args.Length; i++) + { + switch (args[i].ToUpper()) + { + case "-FORMAT": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No format set"); + return; + } + tplFormat = args[i + 1]; + break; + case "-F": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No format set"); + return; + } + tplFormat = args[i + 1]; + break; + } + } + + //Check if valid format was entered + if (tplFormat != "I4" & tplFormat != "I8" & tplFormat != "IA4" & tplFormat != "IA8" & tplFormat != "RGB565" & tplFormat != "RGB5A3" & tplFormat != "RGBA8") + { + System.Console.WriteLine("ERROR: Unknown format type: {0}", tplFormat); + return; + } + + + //Run main part, and check for exceptions + try + { + //Set format + TPL_TextureFormat format = TPL_TextureFormat.RGB565; + if (tplFormat == "I4") + format = TPL_TextureFormat.I4; + if (tplFormat == "I8") + format = TPL_TextureFormat.I8; + if (tplFormat == "IA4") + format = TPL_TextureFormat.IA4; + if (tplFormat == "IA8") + format = TPL_TextureFormat.IA8; + if (tplFormat == "RGB565") + format = TPL_TextureFormat.RGB565; + if (tplFormat == "RGB5A3") + format = TPL_TextureFormat.RGB5A3; + if (tplFormat == "RGBA8") + format = TPL_TextureFormat.RGBA8; + + if (Quiet.quiet > 2) + System.Console.WriteLine("Format set to: {0}", tplFormat); + + //Make tpl + if (Quiet.quiet > 2) + System.Console.Write("Creating tpl file..."); + + TPL tplfile = libWiiSharp.TPL.FromImage(input, format); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + //save + if (Quiet.quiet > 2) + System.Console.Write("Saving tpl file..."); + + if (output.Substring(output.Length - 4, 4).ToUpper() != ".TPL") + output = output + ".tpl"; + + tplfile.Save(output); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 1) + System.Console.WriteLine("Operation completed succesfully!"); + } + catch (Exception ex) + { + System.Console.WriteLine("An unknown error occured, please try again"); + System.Console.WriteLine(""); + System.Console.WriteLine("ERROR DETAILS: {0}", ex.Message); + return; + } + } + + public static void TPL_help() + { + System.Console.WriteLine(""); + System.Console.WriteLine("Sharpii {0} - TPL - A tool by person66, using libWiiSharp.dll by leathl", Version.version); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Usage:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Sharpii.exe TPL [-to | -from] input output [arguments]"); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Arguments:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" -to Convert image to tpl"); + System.Console.WriteLine(" -from Create image from tpl"); + System.Console.WriteLine(" input The input file/folder"); + System.Console.WriteLine(" output The output file/folder"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Arguments for Converting to TPL:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" -format | -f The format of the tpl. Possible values are:"); + System.Console.WriteLine(" RGBA8 (High Quality with Alpha)"); + System.Console.WriteLine(" RGB565 (Medium Quality without Alpha)"); + System.Console.WriteLine(" RGB5A3 (Low Quality with Alpha)"); + System.Console.WriteLine(" IA8 (High quality B/W with Alpha)"); + System.Console.WriteLine(" IA4 (Low Quality B/W with Alpha)"); + System.Console.WriteLine(" I8 (High Quality B/W without Alpha)"); + System.Console.WriteLine(" I4 (Low Quality B/W without Alpha)"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Notes:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" If no format is specified when converting to TPL, RGB565 is used."); + System.Console.WriteLine(" When converting to an image, the image format is chosen based on the extension"); + } + } +} \ No newline at end of file diff --git a/Sharpii/U8.cs b/Sharpii/U8.cs new file mode 100644 index 0000000..ec53229 --- /dev/null +++ b/Sharpii/U8.cs @@ -0,0 +1,227 @@ +/* This file is part of Sharpii. + * Copyright (C) 2011 Person66 + * + * Sharpii is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Sharpii is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Sharpii. If not, see . + */ + +using System; +using System.IO; +using libWiiSharp; + +namespace Sharpii +{ + partial class U8_Stuff + { + public static void U8(string[] args) + { + if (args.Length < 4) + { + U8_help(); + return; + } + + //********************* Pack ********************* + if (args[1] == "-p") + { + Pack(args); + return; + } + + //********************* Unpack ********************* + if (args[1] == "-u") + { + Unpack(args); + return; + } + + //If tuser gets here, they entered something wrong + System.Console.WriteLine("ERROR: The argument {0} is invalid", args[1]); + return; + + } + + private static void Unpack(string[] args) + { + string input = args[2]; + string output = args[3]; + + //Check if file exists + if (File.Exists(input) == false) + { + System.Console.WriteLine("ERROR: Unable to open file: {0}", input); + return; + } + //Check if file is U8 + if (libWiiSharp.U8.IsU8(input) != true) + { + System.Console.WriteLine("ERROR: File {0} is not a U8 archive", input); + return; + } + + //Run main part, and check for exceptions + try + { + //Load U8 + U8 U8file = new U8(); + + if (Quiet.quiet > 2) + System.Console.Write("Loading file..."); + + U8file.LoadFile(input); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 2) + System.Console.Write("Extracting file..."); + + U8file.Extract(output); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 1) + System.Console.WriteLine("Operation completed succesfully!"); + } + catch (Exception ex) + { + System.Console.WriteLine("An unknown error occured, please try again"); + System.Console.WriteLine(""); + System.Console.WriteLine("ERROR DETAILS: {0}", ex.Message); + return; + } + } + + private static void Pack(string[] args) + { + //Setting up variables + string input = args[2]; + string output = args[3]; + bool lz77 = false; + bool imd5 = false; + string imet = ""; + + //Check if folder exists + if (Directory.Exists(input) == false) + { + System.Console.WriteLine("ERROR: Unable to open Folder: {0}", input); + return; + } + + for (int i = 1; i < args.Length; i++) + { + switch (args[i].ToUpper()) + { + case "-LZ77": + lz77 = true; + break; + case "-IMD5": + imd5 = true; + break; + case "-IMET": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No title set"); + return; + } + imet = args[i + 1]; + break; + } + } + + if (imd5 == true && imet != "") + { + System.Console.WriteLine("ERROR: Cannot use IMET and IMD5 at the same time."); + return; + } + + //Run main part, and check for exceptions + try + { + U8 U8folder = new U8(); + + if (Quiet.quiet > 2) + System.Console.Write("Loading folder..."); + + U8folder.CreateFromDirectory(input); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (imd5 == true) + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Adding IMD5 Header"); + U8folder.AddHeaderImd5(); + } + + if (imet != "") + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Adding IMET header with title: {0}", imet); + U8folder.AddHeaderImet(false, imet); + } + + if (lz77 == true) + { + //Yeah, I know this isnt where it actually compresses it + if (Quiet.quiet > 2) + System.Console.WriteLine("Compressing U8 archive"); + U8folder.Lz77Compress = true; + } + + if (Quiet.quiet > 2) + System.Console.WriteLine("Saving file"); + + U8folder.Save(output); + + if (Quiet.quiet > 1) + System.Console.WriteLine("Operation completed succesfully!"); + } + catch (Exception ex) + { + System.Console.WriteLine("An unknown error occured, please try again"); + System.Console.WriteLine(""); + System.Console.WriteLine("ERROR DETAILS: {0}", ex.Message); + return; + } + } + + public static void U8_help() + { + System.Console.WriteLine(""); + System.Console.WriteLine("Sharpii {0} - U8 - A tool by person66, using libWiiSharp.dll by leathl", Version.version); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Usage:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Sharpii.exe U8 [-p | -u] input output [arguments]"); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Arguments:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" input The input file/folder"); + System.Console.WriteLine(" output The output file/folder"); + System.Console.WriteLine(" -p Pack"); + System.Console.WriteLine(" -u Unpack"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Arguments for Packing:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" -imet [title] Pack with an IMET header (for 00000000.app)"); + System.Console.WriteLine(" You MUST enter a channel title"); + System.Console.WriteLine(" -imd5 Pack with an IMD5 header (for Banner/Icon.bin)"); + System.Console.WriteLine(" -lz77 Compress with lz77"); + } + } +} \ No newline at end of file diff --git a/Sharpii/WAD.cs b/Sharpii/WAD.cs new file mode 100644 index 0000000..64cad66 --- /dev/null +++ b/Sharpii/WAD.cs @@ -0,0 +1,595 @@ +/* This file is part of Sharpii. + * Copyright (C) 2011 Person66 + * + * Sharpii is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Sharpii is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Sharpii. If not, see . + */ + +using System; +using System.IO; +using libWiiSharp; + +namespace Sharpii +{ + partial class WAD_Stuff + { + public static void WAD(string[] args) + { + if (args.Length < 3) + { + WAD_help(); + return; + } + + //********************* PACK ********************* + if (args[1] == "-p") + { + Pack(args); + return; + } + + //********************* UNPACK ********************* + if (args[1] == "-u") + { + Unpack(args); + return; + } + + //********************* EDIT ********************* + if (args[1] == "-e") + { + Edit(args); + return; + } + + //********************* INFO ********************* + if (args[1] == "-i") + { + Info(args); + return; + } + + //If tuser gets here, they entered something wrong + System.Console.WriteLine("ERROR: The argument {0} is invalid", args[1]); + + return; + } + + private static void Info(string[] args) + { + string input = args[2]; + string output = ""; + bool titles = false; + + //Check if file exists + if (File.Exists(input) == false) + { + System.Console.WriteLine("ERROR: Unable to open file: {0}", input); + return; + } + + for (int i = 1; i < args.Length; i++) + { + switch (args[i].ToUpper()) + { + case "-O": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No output set"); + return; + } + output = args[i + 1]; + break; + case "-OUTPUT": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No output set"); + return; + } + output = args[i + 1]; + break; + case "-TITLES": + titles = true; + break; + } + } + + try + { + WAD wad = new WAD(); + + if (Quiet.quiet > 2) + System.Console.Write("Loading file..."); + + wad.LoadFile(input); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 1 && output == "") + { + System.Console.WriteLine("WAD Info:"); + System.Console.WriteLine(""); + if (titles == false) + System.Console.WriteLine("Title: {0}", wad.ChannelTitles[1]); + else + { + System.Console.WriteLine("Titles:\n"); + System.Console.WriteLine(" Japanese: {0}", wad.ChannelTitles[0]); + System.Console.WriteLine(" English: {0}", wad.ChannelTitles[1]); + System.Console.WriteLine(" German: {0}", wad.ChannelTitles[2]); + System.Console.WriteLine(" French: {0}", wad.ChannelTitles[3]); + System.Console.WriteLine(" Spanish: {0}", wad.ChannelTitles[4]); + System.Console.WriteLine(" Italian: {0}", wad.ChannelTitles[5]); + System.Console.WriteLine(" Dutch: {0}", wad.ChannelTitles[6]); + System.Console.WriteLine(" Korean: {0}\n", wad.ChannelTitles[7]); + } + System.Console.WriteLine("Title ID: {0}", wad.UpperTitleID); + System.Console.WriteLine("IOS: {0}", ((int)wad.StartupIOS).ToString()); + System.Console.WriteLine("Region: {0}", wad.Region); + System.Console.WriteLine("Version: {0}", wad.TitleVersion); + System.Console.WriteLine("Blocks: {0}", wad.NandBlocks); + } + else + { + if (Quiet.quiet > 2) + System.Console.Write("Saving file..."); + + if (output.Substring(output.Length - 4, 4).ToUpper() != ".TXT") + output = output + ".txt"; + + TextWriter txt = new StreamWriter(output); + txt.WriteLine("WAD Info:"); + txt.WriteLine(""); + if (titles == false) + txt.WriteLine("Title: {0}", wad.ChannelTitles[1]); + else + { + txt.WriteLine("Titles:"); + txt.WriteLine(" Japanese: {0}", wad.ChannelTitles[0]); + txt.WriteLine(" English: {0}", wad.ChannelTitles[1]); + txt.WriteLine(" German: {0}", wad.ChannelTitles[2]); + txt.WriteLine(" French: {0}", wad.ChannelTitles[3]); + txt.WriteLine(" Spanish: {0}", wad.ChannelTitles[4]); + txt.WriteLine(" Italian: {0}", wad.ChannelTitles[5]); + txt.WriteLine(" Dutch: {0}", wad.ChannelTitles[6]); + txt.WriteLine(" Korean: {0}", wad.ChannelTitles[7]); + } + txt.WriteLine("Title ID: {0}", wad.UpperTitleID); + txt.WriteLine("IOS: {0}", ((int)wad.StartupIOS).ToString()); + txt.WriteLine("Region: {0}", wad.Region); + txt.WriteLine("Version: {0}", wad.TitleVersion); + txt.WriteLine("Blocks: {0}", wad.NandBlocks); + txt.Close(); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 1) + System.Console.WriteLine("Operation completed succesfully!"); + } + } + catch (Exception ex) + { + System.Console.WriteLine("An unknown error occured, please try again"); + System.Console.WriteLine(""); + System.Console.WriteLine("ERROR DETAILS: {0}", ex.Message); + return; + } + } + + private static void Edit(string[] args) + { + //setting up variables + string input = args[2]; + string output = args[3]; + string id = ""; + int ios = -1; + string title = ""; + string lwrid = "Channel"; + bool fake = false; + + //Check if file exists + if (File.Exists(input) == false) + { + System.Console.WriteLine("ERROR: Unable to open file: {0}", input); + return; + } + + for (int i = 1; i < args.Length; i++) + { + switch (args[i].ToUpper()) + { + case "-F": + fake = true; + break; + case "-ID": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No ID set"); + return; + } + id = args[i + 1]; + if (id.Length < 4) + { + System.Console.WriteLine("ERROR: ID too short"); + return; + } + id = id.Substring(0, 4); + break; + case "-TYPE": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No type set"); + return; + } + lwrid = args[i + 1]; + if (lwrid != "Channel" & lwrid != "DLC" & lwrid != "GameChannel" & lwrid != "HiddenChannels" & lwrid != "SystemChannels" & lwrid != "SystemTitles") + { + System.Console.WriteLine("ERROR: Unknown WAD type: {0}", lwrid); + return; + } + break; + case "-IOS": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No type set"); + return; + } + if (!int.TryParse(args[i + 1], out ios)) + { + Console.WriteLine("Invalid slot {0}...", args[i + 1]); + return; + } + if (ios < 0 || ios > 255) + { + Console.WriteLine("Invalid slot {0}...", ios); + return; + } + break; + case "-TITLE": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No type set"); + return; + } + title = args[i + 1]; + break; + } + } + + //Run main part, and check for exceptions + try + { + WAD wad = new WAD(); + + if (Quiet.quiet > 2) + System.Console.Write("Loading file..."); + + wad.LoadFile(input); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + + if (Quiet.quiet > 2 && fake == true) + System.Console.WriteLine("FakeSigning WAD"); + wad.FakeSign = fake; + + if (id != "") + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Changing channel type to: {0}", lwrid); + + if (lwrid == "Channel") + wad.ChangeTitleID(LowerTitleID.Channel, id); + if (lwrid == "DLC") + wad.ChangeTitleID(LowerTitleID.DLC, id); + if (lwrid == "GameChannel") + wad.ChangeTitleID(LowerTitleID.GameChannel, id); + if (lwrid == "HiddenChannels") + wad.ChangeTitleID(LowerTitleID.HiddenChannels, id); + if (lwrid == "SystemChannels") + wad.ChangeTitleID(LowerTitleID.SystemChannels, id); + if (lwrid == "SystemTitles") + wad.ChangeTitleID(LowerTitleID.SystemTitles, id); + } + if (ios > -1) + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Changing startup IOS to: {0}", ios); + wad.ChangeStartupIOS(ios); + } + if (title != "") + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Changing channel title to: {0}", title); + wad.ChangeChannelTitles(title); + } + + if (Quiet.quiet > 2) + System.Console.Write("Saving file..."); + + if (output.Substring(output.Length - 4, 4).ToUpper() != ".WAD") + output = output + ".wad"; + + wad.Save(output); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 1) + System.Console.WriteLine("Operation completed succesfully!"); + } + catch (Exception ex) + { + System.Console.WriteLine("An unknown error occured, please try again"); + System.Console.WriteLine(""); + System.Console.WriteLine("ERROR DETAILS: {0}", ex.Message); + return; + } + } + + private static void Unpack(string[] args) + { + //setting up variables + string input = args[2]; + string output = args[3]; + bool cid = false; + + //Check if file exists + if (File.Exists(input) == false) + { + System.Console.WriteLine("ERROR: Unable to open file: {0}", input); + return; + } + + //-cid argument + for (int i = 1; i < args.Length; i++) + { + switch (args[i].ToUpper()) + { + case "-CID": + cid = true; + break; + } + } + + //Run main part, and check for exceptions + try + { + WAD wad = new WAD(); + + if (Quiet.quiet > 2) + System.Console.Write("Loading file..."); + + wad.LoadFile(input); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 2) + System.Console.Write("Unpacking WAD..."); + + wad.Unpack(output, cid); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 1) + System.Console.WriteLine("Operation completed succesfully!"); + } + catch (Exception ex) + { + System.Console.WriteLine("An unknown error occured, please try again"); + System.Console.WriteLine(""); + System.Console.WriteLine("ERROR DETAILS: {0}", ex.Message); + return; + } + } + + private static void Pack(string[] args) + { + //Setting up variables + string input = args[2]; + string output = args[3]; + string id = ""; + int ios = -1; + string lwrid = "Channel"; + string title = ""; + bool fake = false; + + //Check if folder exists + if (Directory.Exists(input) == false) + { + System.Console.WriteLine("ERROR: Unable to open Folder: {0}", input); + return; + } + + for (int i = 1; i < args.Length; i++) + { + switch (args[i].ToUpper()) + { + case "-F": + fake = true; + break; + case "-ID": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No ID set"); + return; + } + id = args[i + 1]; + if (id.Length < 4) + { + System.Console.WriteLine("ERROR: ID too short"); + return; + } + id = id.Substring(0, 4); + break; + case "-TYPE": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No type set"); + return; + } + lwrid = args[i + 1]; + if (lwrid != "Channel" & lwrid != "DLC" & lwrid != "GameChannel" & lwrid != "HiddenChannels" & lwrid != "SystemChannels" & lwrid != "SystemTitles") + { + System.Console.WriteLine("ERROR: Unknown WAD type: {0}", lwrid); + return; + } + break; + case "-IOS": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No type set"); + return; + } + if (!int.TryParse(args[i + 1], out ios)) + { + Console.WriteLine("Invalid slot {0}...", args[i + 1]); + return; + } + if (ios < 0 || ios > 255) + { + Console.WriteLine("Invalid slot {0}...", ios); + return; + } + break; + case "-TITLE": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No type set"); + return; + } + title = args[i + 1]; + break; + } + } + + + //Run main part, and check for exceptions + try + { + WAD wad = new WAD(); + + if (Quiet.quiet > 2) + System.Console.Write("Loading folder..."); + + wad.CreateNew(input); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + + if (Quiet.quiet > 2 && fake == true) + System.Console.WriteLine("FakeSigning WAD"); + wad.FakeSign = fake; + + if (id != "") + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Changing channel type to: {0}", lwrid); + + if (lwrid == "Channel") + wad.ChangeTitleID(LowerTitleID.Channel, id); + if (lwrid == "DLC") + wad.ChangeTitleID(LowerTitleID.DLC, id); + if (lwrid == "GameChannel") + wad.ChangeTitleID(LowerTitleID.GameChannel, id); + if (lwrid == "HiddenChannels") + wad.ChangeTitleID(LowerTitleID.HiddenChannels, id); + if (lwrid == "SystemChannels") + wad.ChangeTitleID(LowerTitleID.SystemChannels, id); + if (lwrid == "SystemTitles") + wad.ChangeTitleID(LowerTitleID.SystemTitles, id); + } + if (ios > -1) + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Changing startup IOS to: {0}", ios); + wad.ChangeStartupIOS(ios); + } + if (title != "") + { + if (Quiet.quiet > 2) + System.Console.WriteLine("Changing channel title to: {0}", title); + wad.ChangeChannelTitles(title); + } + + if (Quiet.quiet > 2) + System.Console.Write("Saving file..."); + + if (output.Substring(output.Length - 4, 4).ToUpper() != ".WAD") + output = output + ".wad"; + + wad.Save(output); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 1) + System.Console.WriteLine("Operation completed succesfully!"); + } + catch (Exception ex) + { + System.Console.WriteLine("An unknown error occured, please try again"); + System.Console.WriteLine(""); + System.Console.WriteLine("ERROR DETAILS: {0}", ex.Message); + return; + } + } + + public static void WAD_help() + { + System.Console.WriteLine(""); + System.Console.WriteLine("Sharpii {0} - WAD - A tool by person66, using libWiiSharp.dll by leathl", Version.version); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Usage:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Sharpii.exe WAD [-p | -u | -e | -i] input output [arguments]"); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Arguments:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" input The input file/folder"); + System.Console.WriteLine(" output The output file/folder"); + System.Console.WriteLine(" -p Pack WAD"); + System.Console.WriteLine(" -u Unpack WAD"); + System.Console.WriteLine(" -e Edit WAD"); + System.Console.WriteLine(" -i Get WAD info"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Arguments for unpacking:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" -cid Use Content ID as name"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Arguments for info:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" -o output Output info to text file"); + System.Console.WriteLine(" -titles Display titles in all languages"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Arguments for packing/editing:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" -id [TitleID] Change the 4-character title id"); + System.Console.WriteLine(" -ios [IOS] Change the Startup IOS"); + System.Console.WriteLine(" -title [title] Change the Channel name/title."); + System.Console.WriteLine(" If there are spaces, surround in quotes"); + System.Console.WriteLine(" -f Fakesign the WAD"); + System.Console.WriteLine(" -type [type] Change the Channel type. Possible values are:"); + System.Console.WriteLine(" Channel, DLC, GameChannel, HiddenChannels,"); + System.Console.WriteLine(" SystemChannels, or SystemTitles"); + } + } +} \ No newline at end of file diff --git a/Sharpii/app.config b/Sharpii/app.config new file mode 100644 index 0000000..8494f72 --- /dev/null +++ b/Sharpii/app.config @@ -0,0 +1,3 @@ + + + diff --git a/Sharpii/libWiiSharp.dll b/Sharpii/libWiiSharp.dll new file mode 100644 index 0000000000000000000000000000000000000000..b96ffb0f16811aa3dc82ee92e62cfde9eacd6c6c GIT binary patch literal 160256 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