internal static void Uninstall(string destination) { Program.SetCurrentOperation("Uninstalling MelonLoader..."); try { string MelonLoader_Folder = Path.Combine(destination, "MelonLoader"); if (Directory.Exists(MelonLoader_Folder)) { ThreadHandler.RecursiveFuncRun(delegate(ThreadHandler.RecursiveFuncRecurse recurse) { try { Directory.Delete(MelonLoader_Folder, true); } catch (Exception ex) { if (!ex.GetType().IsAssignableFrom(typeof(UnauthorizedAccessException)) && !ex.GetType().IsAssignableFrom(typeof(IOException))) { throw ex; } DialogResult result = MessageBox.Show($"Unable to remove Existing MelonLoader Folder! Make sure the Unity Game is not running or try running the Installer as Administrator.", BuildInfo.Name, MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (result == DialogResult.Retry) { recurse.Invoke(); } else { throw ex; } } }); } string proxy_path = null; if (GetExistingProxyPath(destination, out proxy_path)) { ThreadHandler.RecursiveFuncRun(delegate(ThreadHandler.RecursiveFuncRecurse recurse) { try { File.Delete(proxy_path); } catch (Exception ex) { if (!ex.GetType().IsAssignableFrom(typeof(UnauthorizedAccessException)) && !ex.GetType().IsAssignableFrom(typeof(IOException))) { throw ex; } DialogResult result = MessageBox.Show($"Unable to remove Existing Proxy Module! Make sure the Unity Game is not running or try running the Installer as Administrator.", BuildInfo.Name, MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (result == DialogResult.Retry) { recurse.Invoke(); } else { throw ex; } } }); } ThreadHandler.RecursiveFuncRun(delegate(ThreadHandler.RecursiveFuncRecurse recurse) { try { ExtraCleanupCheck(destination); } catch (Exception ex) { if (!ex.GetType().IsAssignableFrom(typeof(UnauthorizedAccessException)) && !ex.GetType().IsAssignableFrom(typeof(IOException))) { throw ex; } DialogResult result = MessageBox.Show($"Couldn't do Extra File Cleanup! Make sure the Unity Game is not running or try running the Installer as Administrator.", BuildInfo.Name, MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (result == DialogResult.Retry) { recurse.Invoke(); } else { throw ex; } } }); } catch (Exception ex) { Program.LogError(ex.ToString()); return; } if (Program.Closing) { return; } Program.CurrentInstalledVersion = null; Program.OperationSuccess(); Program.FinishingMessageBox((CurrentOperationName + " was Successful!"), MessageBoxButtons.OK, MessageBoxIcon.None); }
internal static void Automated_Install(string destination, string selected_version, bool is_x86, bool legacy_version) { Program.SetCurrentOperation("Downloading MelonLoader..."); string downloadurl = Config.Download_MelonLoader + "/" + selected_version + "/MelonLoader." + ((!legacy_version && is_x86) ? "x86" : "x64") + ".zip"; string temp_path = TempFileCache.CreateFile(); try { Program.webClient.DownloadFileAsync(new Uri(downloadurl), temp_path); while (Program.webClient.IsBusy) { } } catch (Exception ex) { Program.LogError(ex.ToString()); return; } Program.SetTotalPercentage(50); if (Program.Closing) { return; } string repo_hash_url = Config.Download_MelonLoader + "/" + selected_version + "/MelonLoader." + ((!legacy_version && is_x86) ? "x86" : "x64") + ".sha512"; string repo_hash = null; try { repo_hash = Program.webClient.DownloadString(repo_hash_url); } catch { repo_hash = null; } if (string.IsNullOrEmpty(repo_hash)) { Program.LogError("Failed to get SHA512 Hash from Repo!"); return; } if (Program.Closing) { return; } SHA512Managed sha512 = new SHA512Managed(); byte[] checksum = sha512.ComputeHash(File.ReadAllBytes(temp_path)); if ((checksum == null) || (checksum.Length <= 0)) { Program.LogError("Failed to get SHA512 Hash from Temp File!"); return; } string file_hash = BitConverter.ToString(checksum).Replace("-", string.Empty); if (string.IsNullOrEmpty(file_hash)) { Program.LogError("Failed to get SHA512 Hash from Temp File!"); return; } if (!file_hash.Equals(repo_hash)) { Program.LogError("SHA512 Hash from Temp File does not match Repo Hash!"); return; } Program.SetCurrentOperation("Extracting MelonLoader..."); try { string MelonLoader_Folder = Path.Combine(destination, "MelonLoader"); if (Directory.Exists(MelonLoader_Folder)) { ThreadHandler.RecursiveFuncRun(delegate(ThreadHandler.RecursiveFuncRecurse recurse) { try { Directory.Delete(MelonLoader_Folder, true); } catch (Exception ex) { if (!ex.GetType().IsAssignableFrom(typeof(UnauthorizedAccessException)) && !ex.GetType().IsAssignableFrom(typeof(IOException))) { throw ex; } DialogResult result = MessageBox.Show($"Unable to remove Existing MelonLoader Folder! Make sure the Unity Game is not running or try running the Installer as Administrator.", BuildInfo.Name, MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (result == DialogResult.Retry) { recurse.Invoke(); } else { throw ex; } } }); } string proxy_path = null; if (GetExistingProxyPath(destination, out proxy_path)) { ThreadHandler.RecursiveFuncRun(delegate(ThreadHandler.RecursiveFuncRecurse recurse) { try { File.Delete(proxy_path); } catch (Exception ex) { if (!ex.GetType().IsAssignableFrom(typeof(UnauthorizedAccessException)) && !ex.GetType().IsAssignableFrom(typeof(IOException))) { throw ex; } DialogResult result = MessageBox.Show($"Unable to remove Existing Proxy Module! Make sure the Unity Game is not running or try running the Installer as Administrator.", BuildInfo.Name, MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (result == DialogResult.Retry) { recurse.Invoke(); } else { throw ex; } } }); } using FileStream stream = new FileStream(temp_path, FileMode.Open, FileAccess.Read); using ZipArchive zip = new ZipArchive(stream); int total_entry_count = zip.Entries.Count; for (int i = 0; i < total_entry_count; i++) { if (Program.Closing) { break; } int percentage = ((i / total_entry_count) * 100); Program.SetCurrentPercentage(percentage); Program.SetTotalPercentage((50 + (percentage / 2))); ZipArchiveEntry entry = zip.Entries[i]; string fullPath = Path.Combine(destination, entry.FullName); if (!fullPath.StartsWith(destination)) { throw new IOException("Extracting Zip entry would have resulted in a file outside the specified destination directory."); } string filename = Path.GetFileName(fullPath); if (filename.Length != 0) { if (!legacy_version && filename.Equals("version.dll")) { foreach (string proxyname in ProxyNames) { string new_proxy_path = Path.Combine(destination, (proxyname + ".dll")); if (File.Exists(new_proxy_path)) { continue; } fullPath = new_proxy_path; break; } } string directorypath = Path.GetDirectoryName(fullPath); if (!Directory.Exists(directorypath)) { Directory.CreateDirectory(directorypath); } using FileStream targetStream = new FileStream(fullPath, FileMode.OpenOrCreate, FileAccess.Write); using Stream entryStream = entry.Open(); ThreadHandler.RecursiveFuncRun(delegate(ThreadHandler.RecursiveFuncRecurse recurse) { try { entryStream.CopyTo(targetStream); } catch (Exception ex) { if (!ex.GetType().IsAssignableFrom(typeof(UnauthorizedAccessException)) && !ex.GetType().IsAssignableFrom(typeof(IOException))) { throw ex; } DialogResult result = MessageBox.Show($"Couldn't extract file {filename}! Make sure the Unity Game is not running or try running the Installer as Administrator.", BuildInfo.Name, MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (result == DialogResult.Retry) { recurse.Invoke(); } else { throw ex; } } }); continue; } if (entry.Length != 0) { throw new IOException("Zip entry name ends in directory separator character but contains data."); } if (!Directory.Exists(fullPath)) { Directory.CreateDirectory(fullPath); } } ThreadHandler.RecursiveFuncRun(delegate(ThreadHandler.RecursiveFuncRecurse recurse) { try { DowngradeMelonPreferences(destination, legacy_version); } catch (Exception ex) { if (!ex.GetType().IsAssignableFrom(typeof(UnauthorizedAccessException)) && !ex.GetType().IsAssignableFrom(typeof(IOException))) { throw ex; } DialogResult result = MessageBox.Show($"Unable to Downgrade MelonLoader Preferences! Make sure the Unity Game is not running or try running the Installer as Administrator.", BuildInfo.Name, MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (result == DialogResult.Retry) { recurse.Invoke(); } else { throw ex; } } }); ExtraDirectoryChecks(destination); ThreadHandler.RecursiveFuncRun(delegate(ThreadHandler.RecursiveFuncRecurse recurse) { try { ExtraCleanupCheck(destination); } catch (Exception ex) { if (!ex.GetType().IsAssignableFrom(typeof(UnauthorizedAccessException)) && !ex.GetType().IsAssignableFrom(typeof(IOException))) { throw ex; } DialogResult result = MessageBox.Show($"Couldn't do Extra File Cleanup! Make sure the Unity Game is not running or try running the Installer as Administrator.", BuildInfo.Name, MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (result == DialogResult.Retry) { recurse.Invoke(); } else { throw ex; } } }); } catch (Exception ex) { Program.LogError(ex.ToString()); return; } if (Program.Closing) { return; } TempFileCache.ClearCache(); Program.OperationSuccess(); Program.FinishingMessageBox((CurrentOperationName + " was Successful!"), MessageBoxButtons.OK, MessageBoxIcon.None); }
internal static void ManualZip_Install(string zip_path, string destination) { Program.SetCurrentOperation("Extracting Zip Archive..."); try { string MelonLoader_Folder = Path.Combine(destination, "MelonLoader"); if (Directory.Exists(MelonLoader_Folder)) { ThreadHandler.RecursiveFuncRun(delegate(ThreadHandler.RecursiveFuncRecurse recurse) { try { Directory.Delete(MelonLoader_Folder, true); } catch (Exception ex) { if (!ex.GetType().IsAssignableFrom(typeof(UnauthorizedAccessException)) && !ex.GetType().IsAssignableFrom(typeof(IOException))) { throw ex; } DialogResult result = MessageBox.Show($"Unable to remove Existing MelonLoader Folder! Make sure the Unity Game is not running or try running the Installer as Administrator.", BuildInfo.Name, MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (result == DialogResult.Retry) { recurse.Invoke(); } else { throw ex; } } }); } string proxy_path = null; if (GetExistingProxyPath(destination, out proxy_path)) { ThreadHandler.RecursiveFuncRun(delegate(ThreadHandler.RecursiveFuncRecurse recurse) { try { File.Delete(proxy_path); } catch (Exception ex) { if (!ex.GetType().IsAssignableFrom(typeof(UnauthorizedAccessException)) && !ex.GetType().IsAssignableFrom(typeof(IOException))) { throw ex; } DialogResult result = MessageBox.Show($"Unable to remove Existing Proxy Module! Make sure the Unity Game is not running or try running the Installer as Administrator.", BuildInfo.Name, MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (result == DialogResult.Retry) { recurse.Invoke(); } else { throw ex; } } }); } using FileStream stream = new FileStream(zip_path, FileMode.Open, FileAccess.Read); using ZipArchive zip = new ZipArchive(stream); int total_entry_count = zip.Entries.Count; for (int i = 0; i < total_entry_count; i++) { if (Program.Closing) { break; } int percentage = ((i / total_entry_count) * 100); Program.SetCurrentPercentage(percentage); Program.SetTotalPercentage(percentage); ZipArchiveEntry entry = zip.Entries[i]; string fullPath = Path.Combine(destination, entry.FullName); if (!fullPath.StartsWith(destination)) { throw new IOException("Extracting Zip entry would have resulted in a file outside the specified destination directory."); } string filename = Path.GetFileName(fullPath); if (filename.Length != 0) { string directorypath = Path.GetDirectoryName(fullPath); if (!Directory.Exists(directorypath)) { Directory.CreateDirectory(directorypath); } using FileStream targetStream = new FileStream(fullPath, FileMode.OpenOrCreate, FileAccess.Write); using Stream entryStream = entry.Open(); ThreadHandler.RecursiveFuncRun(delegate(ThreadHandler.RecursiveFuncRecurse recurse) { try { entryStream.CopyTo(targetStream); } catch (Exception ex) { if (!ex.GetType().IsAssignableFrom(typeof(UnauthorizedAccessException)) && !ex.GetType().IsAssignableFrom(typeof(IOException))) { throw ex; } DialogResult result = MessageBox.Show($"Couldn't extract file {filename}! Make sure the Unity Game is not running or try running the Installer as Administrator.", BuildInfo.Name, MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (result == DialogResult.Retry) { recurse.Invoke(); } else { throw ex; } } }); continue; } if (entry.Length != 0) { throw new IOException("Zip entry name ends in directory separator character but contains data."); } if (!Directory.Exists(fullPath)) { Directory.CreateDirectory(fullPath); } } ExtraDirectoryChecks(destination); ThreadHandler.RecursiveFuncRun(delegate(ThreadHandler.RecursiveFuncRecurse recurse) { try { ExtraCleanupCheck(destination); } catch (Exception ex) { if (!ex.GetType().IsAssignableFrom(typeof(UnauthorizedAccessException)) && !ex.GetType().IsAssignableFrom(typeof(IOException))) { throw ex; } DialogResult result = MessageBox.Show($"Couldn't do Extra File Cleanup! Make sure the Unity Game is not running or try running the Installer as Administrator.", BuildInfo.Name, MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (result == DialogResult.Retry) { recurse.Invoke(); } else { throw ex; } } }); } catch (Exception ex) { Program.LogError(ex.ToString()); return; } if (Program.Closing) { return; } Program.OperationSuccess(); Program.FinishingMessageBox((CurrentOperationName + " was Successful!"), MessageBoxButtons.OK, MessageBoxIcon.None); }