From 2514bfd4555f438538b09e5d6acfff01cd6e051a Mon Sep 17 00:00:00 2001 From: Anairkoen Schno Date: Fri, 21 Sep 2018 20:51:00 -0500 Subject: [PATCH] Added support for the Doorstop early loader --- .gitmodules | 3 + BSIPA.sln | 130 +++++++++++++++++++++++++++ Doorstop | 1 + IPA.Injector/Injector.cs | 25 ++++-- IPA/IPA.csproj | 28 +++++- IPA/Program.cs | 184 +++++++++++++++++++++++---------------- 6 files changed, 286 insertions(+), 85 deletions(-) create mode 100644 .gitmodules create mode 160000 Doorstop diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..65cb0e99 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Doorstop"] + path = Doorstop + url = https://github.com/NeighTools/UnityDoorstop.git diff --git a/BSIPA.sln b/BSIPA.sln index 34c5c3a7..cb99673e 100644 --- a/BSIPA.sln +++ b/BSIPA.sln @@ -17,32 +17,162 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IPA.Loader", "IPA.Loader\IP EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IPA.Injector", "IPA.Injector\IPA.Injector.csproj", "{2A1AF16B-27F1-46E0-9A95-181516BC1CB7}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "proxy", "Doorstop\Proxy\Proxy.vcxproj", "{88609E16-731F-46C9-8139-6B1A7A83240D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + Verbose_Release|Any CPU = Verbose_Release|Any CPU + Verbose_Release|x64 = Verbose_Release|x64 + Verbose_Release|x86 = Verbose_Release|x86 + Verbose|Any CPU = Verbose|Any CPU + Verbose|x64 = Verbose|x64 + Verbose|x86 = Verbose|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {14092533-98BB-40A4-9AFC-27BB75672A70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {14092533-98BB-40A4-9AFC-27BB75672A70}.Debug|Any CPU.Build.0 = Debug|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Debug|x64.ActiveCfg = Debug|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Debug|x64.Build.0 = Debug|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Debug|x86.ActiveCfg = Debug|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Debug|x86.Build.0 = Debug|Any CPU {14092533-98BB-40A4-9AFC-27BB75672A70}.Release|Any CPU.ActiveCfg = Release|Any CPU {14092533-98BB-40A4-9AFC-27BB75672A70}.Release|Any CPU.Build.0 = Release|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Release|x64.ActiveCfg = Release|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Release|x64.Build.0 = Release|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Release|x86.ActiveCfg = Release|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Release|x86.Build.0 = Release|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose_Release|Any CPU.ActiveCfg = Release|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose_Release|Any CPU.Build.0 = Release|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose_Release|x64.ActiveCfg = Verbose_Release|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose_Release|x64.Build.0 = Verbose_Release|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose_Release|x86.ActiveCfg = Release|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose_Release|x86.Build.0 = Release|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|Any CPU.ActiveCfg = Release|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|Any CPU.Build.0 = Release|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x64.ActiveCfg = Verbose|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x64.Build.0 = Verbose|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x86.ActiveCfg = Release|Any CPU + {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x86.Build.0 = Release|Any CPU {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Debug|x64.ActiveCfg = Debug|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Debug|x64.Build.0 = Debug|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Debug|x86.ActiveCfg = Debug|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Debug|x86.Build.0 = Debug|Any CPU {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Release|Any CPU.ActiveCfg = Release|Any CPU {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Release|Any CPU.Build.0 = Release|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Release|x64.ActiveCfg = Release|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Release|x86.ActiveCfg = Release|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Release|x86.Build.0 = Release|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Verbose_Release|Any CPU.ActiveCfg = Release|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Verbose_Release|Any CPU.Build.0 = Release|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Verbose_Release|x64.ActiveCfg = Release|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Verbose_Release|x86.ActiveCfg = Release|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Verbose_Release|x86.Build.0 = Release|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Verbose|Any CPU.ActiveCfg = Release|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Verbose|Any CPU.Build.0 = Release|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Verbose|x64.ActiveCfg = Debug|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Verbose|x64.Build.0 = Debug|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Verbose|x86.ActiveCfg = Release|Any CPU + {C66092B0-5C1E-44E9-B524-E0E8E1425379}.Verbose|x86.Build.0 = Release|Any CPU {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Debug|x64.ActiveCfg = Debug|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Debug|x64.Build.0 = Debug|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Debug|x86.ActiveCfg = Debug|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Debug|x86.Build.0 = Debug|Any CPU {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Release|Any CPU.ActiveCfg = Release|Any CPU {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Release|Any CPU.Build.0 = Release|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Release|x64.ActiveCfg = Release|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Release|x64.Build.0 = Release|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Release|x86.ActiveCfg = Release|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Release|x86.Build.0 = Release|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Verbose_Release|Any CPU.ActiveCfg = Release|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Verbose_Release|Any CPU.Build.0 = Release|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Verbose_Release|x64.ActiveCfg = Release|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Verbose_Release|x64.Build.0 = Release|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Verbose_Release|x86.ActiveCfg = Release|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Verbose_Release|x86.Build.0 = Release|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Verbose|Any CPU.ActiveCfg = Release|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Verbose|Any CPU.Build.0 = Release|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Verbose|x64.ActiveCfg = Debug|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Verbose|x64.Build.0 = Debug|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Verbose|x86.ActiveCfg = Release|Any CPU + {F08C3C7A-3221-432E-BAB8-32BCE58408C8}.Verbose|x86.Build.0 = Release|Any CPU {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Debug|x64.ActiveCfg = Debug|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Debug|x64.Build.0 = Debug|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Debug|x86.ActiveCfg = Debug|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Debug|x86.Build.0 = Debug|Any CPU {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Release|Any CPU.ActiveCfg = Release|Any CPU {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Release|Any CPU.Build.0 = Release|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Release|x64.ActiveCfg = Release|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Release|x64.Build.0 = Release|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Release|x86.ActiveCfg = Release|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Release|x86.Build.0 = Release|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose_Release|Any CPU.ActiveCfg = Release|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose_Release|Any CPU.Build.0 = Release|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose_Release|x64.ActiveCfg = Release|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose_Release|x64.Build.0 = Release|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose_Release|x86.ActiveCfg = Release|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose_Release|x86.Build.0 = Release|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|Any CPU.ActiveCfg = Release|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|Any CPU.Build.0 = Release|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x64.ActiveCfg = Debug|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x64.Build.0 = Debug|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x86.ActiveCfg = Release|Any CPU + {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x86.Build.0 = Release|Any CPU {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Debug|x64.ActiveCfg = Debug|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Debug|x64.Build.0 = Debug|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Debug|x86.ActiveCfg = Debug|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Debug|x86.Build.0 = Debug|Any CPU {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Release|Any CPU.ActiveCfg = Release|Any CPU {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Release|Any CPU.Build.0 = Release|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Release|x64.ActiveCfg = Release|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Release|x64.Build.0 = Release|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Release|x86.ActiveCfg = Release|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Release|x86.Build.0 = Release|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose_Release|Any CPU.ActiveCfg = Release|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose_Release|Any CPU.Build.0 = Release|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose_Release|x64.ActiveCfg = Release|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose_Release|x64.Build.0 = Release|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose_Release|x86.ActiveCfg = Release|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose_Release|x86.Build.0 = Release|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|Any CPU.ActiveCfg = Release|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|Any CPU.Build.0 = Release|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x64.ActiveCfg = Debug|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x64.Build.0 = Debug|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x86.ActiveCfg = Release|Any CPU + {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x86.Build.0 = Release|Any CPU + {88609E16-731F-46C9-8139-6B1A7A83240D}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Debug|x64.ActiveCfg = Debug|x64 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Debug|x64.Build.0 = Debug|x64 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Debug|x86.ActiveCfg = Debug|Win32 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Debug|x86.Build.0 = Debug|Win32 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Release|Any CPU.ActiveCfg = Release|Win32 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Release|x64.ActiveCfg = Release|x64 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Release|x64.Build.0 = Release|x64 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Release|x86.ActiveCfg = Release|Win32 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Release|x86.Build.0 = Release|Win32 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose_Release|Any CPU.ActiveCfg = Verbose_Release|Win32 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose_Release|x64.ActiveCfg = Verbose_Release|x64 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose_Release|x64.Build.0 = Verbose_Release|x64 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose_Release|x86.ActiveCfg = Verbose_Release|Win32 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose_Release|x86.Build.0 = Verbose_Release|Win32 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|Any CPU.ActiveCfg = Verbose|Win32 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x64.ActiveCfg = Verbose|x64 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x64.Build.0 = Verbose|x64 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x86.ActiveCfg = Verbose|Win32 + {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x86.Build.0 = Verbose|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Doorstop b/Doorstop new file mode 160000 index 00000000..563b4d70 --- /dev/null +++ b/Doorstop @@ -0,0 +1 @@ +Subproject commit 563b4d704eef6d96528b8940306ac25ead715594 diff --git a/IPA.Injector/Injector.cs b/IPA.Injector/Injector.cs index d1fcd727..f920a78d 100644 --- a/IPA.Injector/Injector.cs +++ b/IPA.Injector/Injector.cs @@ -19,17 +19,24 @@ namespace IPA.Injector // aren't defined in mscorlib, we can control exactly what // gets loaded. - // This loads AppDomain, System.IO, System.Collections.Generic, and System.Reflection. - // If kernel32.dll is not already loaded, this will also load it. - // This call also loads IPA.Loader and initializes the logging system. In the process - // it loads Ionic.Zip. - SetupLibraryLoading(); + try + { + // This loads System.Runtime.InteropServices, and Microsoft.Win32.SafeHandles. + Windows.WinConsole.Initialize(); - // This loads System.Runtime.InteropServices, and Microsoft.Win32.SafeHandles. - Windows.WinConsole.Initialize(); + // This loads AppDomain, System.IO, System.Collections.Generic, and System.Reflection. + // If kernel32.dll is not already loaded, this will also load it. + // This call also loads IPA.Loader and initializes the logging system. In the process + // it loads Ionic.Zip. + SetupLibraryLoading(); - // This will load Harmony and UnityEngine.CoreModule - InstallBootstrapPatch(); + // This will load Harmony and UnityEngine.CoreModule + InstallBootstrapPatch(); + } + catch (Exception e) + { + Console.WriteLine(e); + } } private static void InstallBootstrapPatch() diff --git a/IPA/IPA.csproj b/IPA/IPA.csproj index 9cbd7948..105fa46f 100644 --- a/IPA/IPA.csproj +++ b/IPA/IPA.csproj @@ -28,6 +28,8 @@ false false true + + AnyCPU @@ -39,6 +41,7 @@ prompt 4 false + Debug AnyCPU @@ -50,6 +53,7 @@ 4 false true + Release favicon.ico @@ -60,6 +64,20 @@ false + + true + bin\Verbose\ + DEBUG;TRACE + full + AnyCPU + prompt + MinimumRecommendedRules.ruleset + Debug + + + bin\Verbose_Release\ + Release + @@ -106,6 +124,11 @@ false + + + diff --git a/IPA/Program.cs b/IPA/Program.cs index 9a7befc1..28b5fd50 100644 --- a/IPA/Program.cs +++ b/IPA/Program.cs @@ -31,11 +31,12 @@ namespace IPA public static ArgumentFlag ArgNoWait = new ArgumentFlag("--nowait", "-n") { DocString = "doesn't wait for user input after the operation" }; public static ArgumentFlag ArgStart = new ArgumentFlag("--start", "-s") { DocString = "uses value as arguments to start the game after the patch/unpatch", ValueString = "ARGUMENTS" }; public static ArgumentFlag ArgLaunch = new ArgumentFlag("--launch", "-l") { DocString = "uses positional parameters as arguments to start the game after patch/unpatch" }; + public static ArgumentFlag ArgDestructive = new ArgumentFlag("--destructive", "-d") { DocString = "patches the game using the now outdated destructive methods" }; [STAThread] static void Main(string[] args) { - Arguments.CmdLine.Flags(ArgHelp, ArgWaitFor, ArgForce, ArgRevert, ArgNoWait, ArgStart, ArgLaunch).Process(); + Arguments.CmdLine.Flags(ArgHelp, ArgWaitFor, ArgForce, ArgRevert, ArgNoWait, ArgStart, ArgLaunch, ArgDestructive).Process(); if (ArgHelp) { @@ -132,35 +133,115 @@ namespace IPA { var backup = new BackupUnit(context); - #region Patch Version Check + if (ArgDestructive) + { + #region Patch Version Check - var patchedModule = PatchedModule.Load(context.EngineFile); + var patchedModule = PatchedModule.Load(context.EngineFile); #if DEBUG - var isCurrentNewer = Version.CompareTo(patchedModule.Data.Version) >= 0; + var isCurrentNewer = Version.CompareTo(patchedModule.Data.Version) >= 0; #else - var isCurrentNewer = Version.CompareTo(patchedModule.Data.Version) > 0; + var isCurrentNewer = Version.CompareTo(patchedModule.Data.Version) > 0; #endif - Console.WriteLine($"Current: {Version} Patched: {patchedModule.Data.Version}"); - if (isCurrentNewer) + Console.WriteLine($"Current: {Version} Patched: {patchedModule.Data.Version}"); + if (isCurrentNewer) + { + Console.ForegroundColor = ConsoleColor.White; + Console.WriteLine( + $"Preparing for update, {(patchedModule.Data.Version == null ? "UnPatched" : patchedModule.Data.Version.ToString())} => {Version}"); + Console.WriteLine("--- Starting ---"); + Revert(context); + Console.ResetColor(); + + #region File Copying + + Console.ForegroundColor = ConsoleColor.Magenta; + Console.WriteLine("Updating files... "); + var nativePluginFolder = Path.Combine(context.DataPathDst, "Plugins"); + bool isFlat = Directory.Exists(nativePluginFolder) && + Directory.GetFiles(nativePluginFolder).Any(f => f.EndsWith(".dll")); + bool force = !BackupManager.HasBackup(context) || ArgForce; + var architecture = DetectArchitecture(context.Executable); + + Console.WriteLine("Architecture: {0}", architecture); + + CopyAll(new DirectoryInfo(context.DataPathSrc), new DirectoryInfo(context.DataPathDst), force, + backup, + (from, to) => NativePluginInterceptor(from, to, new DirectoryInfo(nativePluginFolder), isFlat, + architecture)); + CopyAll(new DirectoryInfo(context.LibsPathSrc), new DirectoryInfo(context.LibsPathDst), force, + backup, + (from, to) => NativePluginInterceptor(from, to, new DirectoryInfo(nativePluginFolder), isFlat, + architecture)); + + Console.WriteLine("Successfully updated files!"); + + #endregion + } + else + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine($"Files up to date @ Version {Version}!"); + Console.ResetColor(); + } + + #endregion + + #region Patching + + if (!patchedModule.Data.IsPatched || isCurrentNewer) + { + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine($"Patching UnityEngine.dll with Version {Application.ProductVersion}... "); + backup.Add(context.EngineFile); + patchedModule.Patch(Version); + Console.WriteLine("Done!"); + Console.ResetColor(); + } + + #endregion + + #region Creating shortcut + if (!File.Exists(context.ShortcutPath)) + { + Console.ForegroundColor = ConsoleColor.DarkGreen; + Console.WriteLine("Creating shortcut to IPA ({0})... ", context.IPA); + try + { + Shortcut.Create( + fileName: context.ShortcutPath, + targetPath: context.IPA, + arguments: Args(context.Executable, "-ln"), + workingDirectory: context.ProjectRoot, + description: "Launches the game and makes sure it's in a patched state", + hotkey: "", + iconPath: context.Executable + ); + } + catch (Exception) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Error.WriteLine("Failed to create shortcut, but game was patched!"); + } + Console.ResetColor(); + } + #endregion + } + else { - Console.ForegroundColor = ConsoleColor.White; - Console.WriteLine( - $"Preparing for update, {(patchedModule.Data.Version == null ? "UnPatched" : patchedModule.Data.Version.ToString())} => {Version}"); - Console.WriteLine("--- Starting ---"); - Revert(context); - Console.ResetColor(); - - #region File Copying + Console.ForegroundColor = ConsoleColor.Blue; + Console.WriteLine("Restoring old version... "); + if (BackupManager.HasBackup(context)) + BackupManager.Restore(context); - Console.ForegroundColor = ConsoleColor.Magenta; - Console.WriteLine("Updating files... "); var nativePluginFolder = Path.Combine(context.DataPathDst, "Plugins"); bool isFlat = Directory.Exists(nativePluginFolder) && Directory.GetFiles(nativePluginFolder).Any(f => f.EndsWith(".dll")); bool force = !BackupManager.HasBackup(context) || ArgForce; var architecture = DetectArchitecture(context.Executable); - Console.WriteLine("Architecture: {0}", architecture); + Console.ForegroundColor = ConsoleColor.DarkCyan; + Console.WriteLine("Installing files... "); CopyAll(new DirectoryInfo(context.DataPathSrc), new DirectoryInfo(context.DataPathDst), force, backup, @@ -170,20 +251,11 @@ namespace IPA backup, (from, to) => NativePluginInterceptor(from, to, new DirectoryInfo(nativePluginFolder), isFlat, architecture)); - - Console.WriteLine("Successfully updated files!"); - - #endregion - } - else - { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine($"Files up to date @ Version {Version}!"); - Console.ResetColor(); + CopyAll(new DirectoryInfo(context.IPARoot), new DirectoryInfo(context.ProjectRoot), force, + backup, + null, false); } - #endregion - #region Create Plugin Folder if (!Directory.Exists(context.PluginsFolder)) @@ -196,20 +268,6 @@ namespace IPA #endregion - #region Patching - - if (!patchedModule.Data.IsPatched || isCurrentNewer) - { - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine($"Patching UnityEngine.dll with Version {Application.ProductVersion}... "); - backup.Add(context.EngineFile); - patchedModule.Patch(Version); - Console.WriteLine("Done!"); - Console.ResetColor(); - } - - #endregion - #region Virtualizing if (File.Exists(context.AssemblyFile)) @@ -228,31 +286,6 @@ namespace IPA #endregion - #region Creating shortcut - if (!File.Exists(context.ShortcutPath)) - { - Console.ForegroundColor = ConsoleColor.DarkGreen; - Console.WriteLine("Creating shortcut to IPA ({0})... ", context.IPA); - try - { - Shortcut.Create( - fileName: context.ShortcutPath, - targetPath: context.IPA, - arguments: Args(context.Executable, "-ln"), - workingDirectory: context.ProjectRoot, - description: "Launches the game and makes sure it's in a patched state", - hotkey: "", - iconPath: context.Executable - ); - } - catch (Exception) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.Error.WriteLine("Failed to create shortcut, but game was patched!"); - } - Console.ResetColor(); - } - #endregion } catch (Exception e) { @@ -372,7 +405,7 @@ namespace IPA } public static void CopyAll(DirectoryInfo source, DirectoryInfo target, bool aggressive, BackupUnit backup, - Func> interceptor = null) + Func> interceptor = null, bool recurse = true) { if (interceptor == null) { @@ -398,11 +431,12 @@ namespace IPA } // Copy each subdirectory using recursion. - foreach (DirectoryInfo diSourceSubDir in source.GetDirectories()) - { - DirectoryInfo nextTargetSubDir = new DirectoryInfo(Path.Combine(target.FullName, diSourceSubDir.Name)); - CopyAll(diSourceSubDir, nextTargetSubDir, aggressive, backup, interceptor); - } + if (recurse) + foreach (DirectoryInfo diSourceSubDir in source.GetDirectories()) + { + DirectoryInfo nextTargetSubDir = new DirectoryInfo(Path.Combine(target.FullName, diSourceSubDir.Name)); + CopyAll(diSourceSubDir, nextTargetSubDir, aggressive, backup, interceptor, recurse); + } }