private static void DoRunChecks(Arguments args) { /* Splash Screen */ if (!Debugger.IsAttached && !DetectLinux.LinuxDetected()) { _SplashScreen = new Thread(new ThreadStart(SplashScreen)); _SplashScreen.Start(); } File.Delete("communication.log"); File.Delete("launcher.log"); Log.StartLogging(); if (!DetectLinux.LinuxDetected()) { //Check if User has .NETFramework 4.6.2 or later Installed const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\"; using (var ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey)) { if (ndpKey != null && ndpKey.GetValue("Release") != null && (int)ndpKey.GetValue("Release") >= 394802) { /* Check Up to Date Certificate Status */ try { WebClient update_data = new WebClient(); update_data.CancelAsync(); update_data.Headers.Add("user-agent", "GameLauncher " + Application.ProductVersion + " (+https://github.com/SoapBoxRaceWorld/GameLauncher_NFSW)"); update_data.DownloadStringAsync(new Uri("http://crl.carboncrew.org/RCA-Info.json")); update_data.DownloadStringCompleted += (sender, e) => { JsonRootCA API = JsonConvert.DeserializeObject <JsonRootCA>(e.Result); if (API.CN != null) { Log.Info("CERTIFICATE STORE: Setting Common Name -> " + API.CN); CertificateStore.RootCACommonName = API.CN; } if (API.Subject != null) { Log.Info("CERTIFICATE STORE: Setting Subject Name -> " + API.Subject); CertificateStore.RootCASubjectName = API.Subject; } if (API.Ids != null) { foreach (IdsModel entries in API.Ids) { if (entries.Serial != null) { Log.Info("CERTIFICATE STORE: Setting Serial Number -> " + entries.Serial); CertificateStore.RootCASerial = entries.Serial; } } } if (API.File != null) { foreach (FileModel entries in API.File) { if (entries.Name != null) { Log.Info("CERTIFICATE STORE: Setting Root CA File Name -> " + entries.Name); CertificateStore.RootCAFileName = entries.Name; } if (entries.Cer != null) { Log.Info("CERTIFICATE STORE: Setting Root CA File URL -> " + entries.Cer); CertificateStore.RootCAFileURL = entries.Cer; } } } }; } catch { Log.Error("CERTIFICATE STORE: Unable to Retrive Latest Certificate Information"); } } else { DialogResult frameworkError = MessageBox.Show(null, "This application requires one of the following versions of the .NET Framework:\n" + " .NETFramework, Version=v4.6.2 \n\nDo you want to install this .NET Framework version now?", "GameLauncher.exe - This application could not be started.", MessageBoxButtons.YesNo, MessageBoxIcon.Error); if (frameworkError == DialogResult.Yes) { Process.Start("https://dotnet.microsoft.com/download/dotnet-framework"); } /* Close Splash Screen (Just in Case) */ if (IsSplashScreenLive == true) { _SplashScreen.Abort(); } Process.GetProcessById(Process.GetCurrentProcess().Id).Kill(); } } } FileSettingsSave.NullSafeSettings(); FileAccountSave.NullSafeAccount(); FunctionStatus.CurrentLanguage = CultureInfo.CurrentCulture.Name.Split('-')[0].ToUpper(); Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US"); if (UriScheme.IsCommandLineArgumentsInstalled()) { UriScheme.InstallCommandLineArguments(Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), AppDomain.CurrentDomain.FriendlyName)); if (args.Parse != null) { new UriScheme(args.Parse); } } if (EnableInsider.ShouldIBeAnInsider() == true) { Log.Build("INSIDER: GameLauncher " + Application.ProductVersion + "_" + EnableInsider.BuildNumber()); } else { Log.Build("BUILD: GameLauncher " + Application.ProductVersion); } if (Properties.Settings.Default.IsRestarting) { Properties.Settings.Default.IsRestarting = false; Properties.Settings.Default.Save(); Thread.Sleep(3000); } if (!DetectLinux.LinuxDetected()) { //Windows Firewall Runner if (!string.IsNullOrEmpty(FileSettingsSave.FirewallStatus)) { if (FirewallManager.IsServiceRunning == true && FirewallHelper.FirewallStatus() == true) { string nameOfLauncher = "SBRW - Game Launcher"; string localOfLauncher = Assembly.GetEntryAssembly().Location; string nameOfUpdater = "SBRW - Game Launcher Updater"; string localOfUpdater = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "GameLauncherUpdater.exe"); string groupKeyLauncher = "Game Launcher for Windows"; string descriptionLauncher = "Soapbox Race World"; bool removeFirewallRule = false; bool firstTimeRun = false; if (FileSettingsSave.FirewallStatus == "Not Excluded" || FileSettingsSave.FirewallStatus == "Turned Off" || FileSettingsSave.FirewallStatus == "Service Stopped" || FileSettingsSave.FirewallStatus == "Unknown") { firstTimeRun = true; FileSettingsSave.FirewallStatus = "Excluded"; } else if (FileSettingsSave.FirewallStatus == "Reset") { removeFirewallRule = true; FileSettingsSave.FirewallStatus = "Not Excluded"; } //Inbound & Outbound FirewallHelper.DoesRulesExist(removeFirewallRule, firstTimeRun, nameOfLauncher, localOfLauncher, groupKeyLauncher, descriptionLauncher, FirewallProtocol.Any); FirewallHelper.DoesRulesExist(removeFirewallRule, firstTimeRun, nameOfUpdater, localOfUpdater, groupKeyLauncher, descriptionLauncher, FirewallProtocol.Any); //This Removes the Game File Exe From Firewall //To Find the one that Adds the Exe To Firewall -> Search for `OnDownloadFinished()` string CurrentGameFilesExePath = Path.Combine(FileSettingsSave.GameInstallation + "\\nfsw.exe"); if (File.Exists(CurrentGameFilesExePath) && removeFirewallRule == true) { string nameOfGame = "SBRW - Game"; string localOfGame = CurrentGameFilesExePath; string groupKeyGame = "Need for Speed: World"; string descriptionGame = groupKeyGame; //Inbound & Outbound FirewallHelper.DoesRulesExist(removeFirewallRule, firstTimeRun, nameOfGame, localOfGame, groupKeyGame, descriptionGame, FirewallProtocol.Any); } } else if (FirewallManager.IsServiceRunning == true && FirewallHelper.FirewallStatus() == false) { FileSettingsSave.FirewallStatus = "Turned Off"; } else { FileSettingsSave.FirewallStatus = "Service Stopped"; } FileSettingsSave.SaveSettings(); } } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(true); /* Set Launcher Directory */ Log.Info("CORE: Setting up current directory: " + Path.GetDirectoryName(Application.ExecutablePath)); Directory.SetCurrentDirectory(Path.GetDirectoryName(Application.ExecutablePath)); if (!DetectLinux.LinuxDetected()) { Log.Info("CORE: Checking current directory"); switch (FunctionStatus.CheckFolder(Directory.GetCurrentDirectory())) { case FolderType.IsTempFolder: case FolderType.IsUsersFolders: case FolderType.IsProgramFilesFolder: case FolderType.IsWindowsFolder: case FolderType.IsRootFolder: String constructMsg = String.Empty; constructMsg += "Bu Dizinde NFS World Dosyaları Yok.\nLütfen Bu Başlatıcı Dosyalarını oyunun Dosyalarının Olduğu dizine atın NOT:\n\n"; constructMsg += "• X:\\ (Anadizin, veya C:\\ ve D:\\)\n"; constructMsg += "• C:\\Program Files\n"; constructMsg += "• C:\\Program Files (x86)\n"; constructMsg += "• C:\\Kullanıcı ('Masaüstü' veya 'Belgeler')\n"; constructMsg += "• C:\\Windows\n\n"; constructMsg += "Dizinlerine Kurmayınız!"; MessageBox.Show(null, constructMsg, "NFSTR.Com Başlatıcı", MessageBoxButtons.OK, MessageBoxIcon.Error); Environment.Exit(0); break; } if (!FunctionStatus.HasWriteAccessToFolder(Path.GetDirectoryName(Application.ExecutablePath))) { MessageBox.Show("Bu Uygulama Admin Yetkileri Gerektirir"); } //Update this text file if a new GameLauncherUpdater.exe has been delployed - DavidCarbon try { try { switch (APIStatusChecker.CheckStatus("http://api.github.com/repos/SoapboxRaceWorld/GameLauncherUpdater/releases/latest")) { case APIStatus.Online: WebClient update_data = new WebClient(); update_data.CancelAsync(); update_data.Headers.Add("user-agent", "GameLauncher " + Application.ProductVersion + " (+https://github.com/SoapBoxRaceWorld/GameLauncher_NFSW)"); update_data.DownloadStringAsync(new Uri("http://api.github.com/repos/SoapboxRaceWorld/GameLauncherUpdater/releases/latest")); update_data.DownloadStringCompleted += (sender, e) => { GitHubRelease GHAPI = JsonConvert.DeserializeObject <GitHubRelease>(e.Result); if (GHAPI.TagName != null) { Log.Info("LAUNCHER UPDATER: Setting Latest Version -> " + GHAPI.TagName); LatestUpdaterBuildVersion = GHAPI.TagName; } Log.Info("LAUNCHER UPDATER: Latest Version -> " + LatestUpdaterBuildVersion); }; break; default: Log.Error("LAUNCHER UPDATER: Failed to Retrive Latest Updater Information from GitHub"); break; } } catch { var GetLatestUpdaterBuildVersion = new WebClient().DownloadString(URLs.secondstaticapiserver + "/Version.txt"); if (!string.IsNullOrEmpty(GetLatestUpdaterBuildVersion)) { Log.Info("LAUNCHER UPDATER: Setting Latest Version -> " + GetLatestUpdaterBuildVersion); LatestUpdaterBuildVersion = GetLatestUpdaterBuildVersion; } } Log.Info("LAUNCHER UPDATER: Fail Safe Latest Version -> " + LatestUpdaterBuildVersion); } catch (Exception ex) { Log.Error("LAUNCHER UPDATER: Failed to get new version file: " + ex.Message); } } if (!DetectLinux.LinuxDetected()) { //Windows 7 Fix if (WindowsProductVersion.GetWindowsNumber() == 6.1 && (string.IsNullOrEmpty(FileSettingsSave.Win7UpdatePatches))) { if (ManagementSearcher.GetInstalledHotFix("KB3020369") == false || ManagementSearcher.GetInstalledHotFix("KB3125574") == false) { String messageBoxPopupKB = String.Empty; messageBoxPopupKB = "Hey Windows 7 User, we've detected a potential issue of some missing Updates that are required.\n"; messageBoxPopupKB += "We found that these Windows Update packages are showing as not installed:\n\n"; if (ManagementSearcher.GetInstalledHotFix("KB3020369") == false) { messageBoxPopupKB += "- Update KB3020369\n"; } if (ManagementSearcher.GetInstalledHotFix("KB3125574") == false) { messageBoxPopupKB += "- Update KB3125574\n"; } messageBoxPopupKB += "\nAditionally, we must add a value to the registry:\n"; messageBoxPopupKB += "- HKLM/SYSTEM/CurrentControlSet/Control/SecurityProviders\n/SCHANNEL/Protocols/TLS 1.2/Client\n"; messageBoxPopupKB += "- Value: DisabledByDefault -> 0\n\n"; messageBoxPopupKB += "Would you like to add those values?"; DialogResult replyPatchWin7 = MessageBox.Show(null, messageBoxPopupKB, "SBRW Launcher", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (replyPatchWin7 == DialogResult.Yes) { RegistryKey key = Registry.LocalMachine.CreateSubKey(@"SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client"); key.SetValue("DisabledByDefault", 0x0); MessageBox.Show(null, "Registry option set, Remember that the changes may require a system reboot to take effect", "SBRW Launcher", MessageBoxButtons.OK, MessageBoxIcon.Warning); FileSettingsSave.Win7UpdatePatches = "1"; } else { MessageBox.Show(null, "Roger that, There may be some issues connecting to the servers.", "SBRW Launcher", MessageBoxButtons.OK, MessageBoxIcon.Warning); FileSettingsSave.Win7UpdatePatches = "0"; } FileSettingsSave.SaveSettings(); } } if (!RedistributablePackage.IsInstalled(RedistributablePackageVersion.VC2015to2019x86)) { var result = MessageBox.Show( "You do not have the 32-bit 2015-2019 VC++ Redistributable Package installed.\n \nThis will install in the Background\n \nThis may restart your computer. \n \nClick OK to install it.", "Compatibility", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); if (result != DialogResult.OK) { MessageBox.Show("The game will not be started.", "Compatibility", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } var wc = new WebClient(); wc.DownloadFile("https://aka.ms/vs/16/release/VC_redist.x86.exe", "VC_redist.x86.exe"); var proc = Process.Start(new ProcessStartInfo { Verb = "runas", Arguments = "/quiet", FileName = "VC_redist.x86.exe" }); if (proc == null) { MessageBox.Show("Failed to run package installer. The game will not be started.", "Compatibility", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } if (Environment.Is64BitOperatingSystem == true) { if (!RedistributablePackage.IsInstalled(RedistributablePackageVersion.VC2015to2019x64)) { var result = MessageBox.Show( "You do not have the 64-bit 2015-2019 VC++ Redistributable Package installed.\n \nThis will install in the Background\n \nThis may restart your computer. \n \nClick OK to install it.", "Compatibility", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); if (result != DialogResult.OK) { MessageBox.Show("The game will not be started.", "Compatibility", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } var wc = new WebClient(); wc.DownloadFile("https://aka.ms/vs/16/release/VC_redist.x64.exe", "VC_redist.x64.exe"); var proc = Process.Start(new ProcessStartInfo { Verb = "runas", Arguments = "/quiet", FileName = "VC_redist.x64.exe" }); if (proc == null) { MessageBox.Show("Failed to run package installer. The game will not be started.", "Compatibility", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } } } Console.WriteLine("Application path: " + Path.GetDirectoryName(Application.ExecutablePath)); if (!string.IsNullOrEmpty(FileSettingsSave.GameInstallation)) { if (!FunctionStatus.HasWriteAccessToFolder(FileSettingsSave.GameInstallation)) { MessageBox.Show("This application requires admin priviledge. Restarting..."); } } //StaticConfiguration.DisableErrorTraces = false; if (!File.Exists("servers.json")) { try { File.WriteAllText("servers.json", "[]"); } catch { /* ignored */ } } if (Properties.Settings.Default.IsRestarting) { Properties.Settings.Default.IsRestarting = false; Properties.Settings.Default.Save(); Thread.Sleep(3000); } Theming.CheckIfThemeExists(); /* Check If Launcher Failed to Connect to any APIs */ if (VisualsAPIChecker.WOPLAPI == false) { DialogResult restartAppNoApis = MessageBox.Show(null, "There's no internet connection, Launcher might crash \n \nClick Yes to Close Launcher \nor \nClick No Continue", "GameLauncher has Stopped, Failed To Connect To API", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (restartAppNoApis == DialogResult.No) { MessageBox.Show("Good Luck... \n No Really \n ...Good Luck", "GameLauncher Will Continue, When It Failed To Connect To API"); Log.Warning("PRE-CHECK: User has Bypassed 'No Internet Connection' Check and Will Continue"); } if (restartAppNoApis == DialogResult.Yes) { /* Close Splash Screen (Just in Case) */ if (IsSplashScreenLive == true) { _SplashScreen.Abort(); } Process.GetProcessById(Process.GetCurrentProcess().Id).Kill(); } } LanguageListUpdater.GetList(); LauncherUpdateCheck.CheckAvailability(); if (!DetectLinux.LinuxDetected()) { //Install Custom Root Certificate CertificateStore.Check(); if (!File.Exists("GameLauncherUpdater.exe")) { Log.Info("LAUNCHER UPDATER: Starting GameLauncherUpdater downloader"); try { using (WebClient wc = new WebClient()) { wc.DownloadFileCompleted += (object sender, AsyncCompletedEventArgs e) => { if (new FileInfo("GameLauncherUpdater.exe").Length == 0) { File.Delete("GameLauncherUpdater.exe"); } }; wc.DownloadFile(new Uri("https://github.com/SoapboxRaceWorld/GameLauncherUpdater/releases/latest/download/GameLauncherUpdater.exe"), "GameLauncherUpdater.exe"); } } catch (Exception ex) { Log.Error("LAUCHER UPDATER: Failed to download updater. " + ex.Message); } } else if (File.Exists("GameLauncherUpdater.exe")) { String GameLauncherUpdaterLocation = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "GameLauncherUpdater.exe"); var LauncherUpdaterBuild = FileVersionInfo.GetVersionInfo(GameLauncherUpdaterLocation); var LauncherUpdaterBuildNumber = LauncherUpdaterBuild.FileVersion; var UpdaterBuildNumberResult = LauncherUpdaterBuildNumber.CompareTo(LatestUpdaterBuildVersion); Log.Build("LAUNCHER UPDATER BUILD: GameLauncherUpdater " + LauncherUpdaterBuildNumber); if (UpdaterBuildNumberResult < 0) { Log.Info("LAUNCHER UPDATER: " + UpdaterBuildNumberResult + " Builds behind latest Updater!"); } else { Log.Info("LAUNCHER UPDATER: Latest GameLauncherUpdater!"); } if (UpdaterBuildNumberResult < 0) { Log.Info("LAUNCHER UPDATER: Downloading New GameLauncherUpdater.exe"); File.Delete("GameLauncherUpdater.exe"); try { using (WebClient wc = new WebClient()) { wc.DownloadFile(new Uri("https://github.com/SoapboxRaceWorld/GameLauncherUpdater/releases/latest/download/GameLauncherUpdater.exe"), "GameLauncherUpdater.exe"); } } catch (Exception ex) { Log.Error("LAUNCHER UPDATER: Failed to download new updater. " + ex.Message); } } } } if (!string.IsNullOrEmpty(FileSettingsSave.GameInstallation)) { var linksPath = Path.Combine(FileSettingsSave.GameInstallation + "\\.links"); ModNetLinksCleanup.CleanLinks(linksPath); } /* Check Permission for Launcher Folder and File it Self */ FileORFolderPermissions.CheckLauncherPerms("Folder", Path.Combine(AppDomain.CurrentDomain.BaseDirectory)); Log.Info("PROXY: Starting Proxy"); ServerProxy.Instance.Start(); /* Check ServerList Status */ if (FunctionStatus.ServerListStatus != "Loaded") { ServerListUpdater.GetList(); } /* Close Splash Screen */ if (IsSplashScreenLive == true) { _SplashScreen.Abort(); } Log.Visuals("CORE: Starting MainScreen"); Application.Run(new MainScreen()); }
/* Retrieve CA Information */ /// <summary> /// Retrieves the Root CA JSON file with the latest details of the Certificate /// </summary> /// <remarks>Sets the Certificate Details For Launcher Comparison</remarks> public static void Latest() { if (!UnixOS.Detected()) { Log.Checking("CERTIFICATE STORE: Is Installed or Not"); DiscordLauncherPresence.Status("Start Up", "Checking Root Certificate Authority"); try { Uri URLCall = new Uri("http://crl.carboncrew.org/RCA-Info.json"); ServicePointManager.FindServicePoint(URLCall).ConnectionLeaseTimeout = (int)TimeSpan.FromMinutes(1).TotalMilliseconds; var Client = new WebClient { Encoding = Encoding.UTF8 }; if (!WebCalls.Alternative()) { Client = new WebClientWithTimeout { Encoding = Encoding.UTF8 }; } else { Client.Headers.Add("user-agent", "SBRW Launcher " + Application.ProductVersion + " (+https://github.com/SoapBoxRaceWorld/GameLauncher_NFSW)"); } try { /* Download Up to Date Certificate Status */ RootCAJson = Client.DownloadString(URLCall); } catch (WebException Error) { APIChecker.StatusCodes(URLCall.GetComponents(UriComponents.HttpRequestUrl, UriFormat.SafeUnescaped), Error, (HttpWebResponse)Error.Response); } catch (Exception Error) { LogToFileAddons.OpenLog("CERTIFICATE STORE", null, Error, null, true); } finally { if (Client != null) { Client.Dispose(); } } if (IsJSONValid.ValidJson(RootCAJson)) { JsonRootCA API = JsonConvert.DeserializeObject <JsonRootCA>(RootCAJson); if (API.CN != null) { Log.Info("CERTIFICATE STORE: Setting Common Name -> " + API.CN); RootCACommonName = API.CN; } if (API.Subject != null) { Log.Info("CERTIFICATE STORE: Setting Subject Name -> " + API.Subject); RootCASubjectName = API.Subject; } if (API.Ids != null) { foreach (IdsModel entries in API.Ids) { if (entries.Serial != null) { Log.Info("CERTIFICATE STORE: Setting Serial Number -> " + entries.Serial); RootCASerial = entries.Serial; } } } if (API.File != null) { foreach (FileModel entries in API.File) { if (entries.Name != null) { Log.Info("CERTIFICATE STORE: Setting Root CA File Name -> " + entries.Name); RootCAFileName = entries.Name; } if (entries.Cer != null) { Log.Info("CERTIFICATE STORE: Setting Root CA File URL -> " + entries.Cer); RootCAFileURL = entries.Cer; } } } if (API != null) { API = null; } } else { Log.Warning("CERTIFICATE STORE: Received Invalid JSON Data"); } } catch (Exception Error) { LogToFileAddons.OpenLog("CERTIFICATE STORE", null, Error, null, true); } finally { if (RootCAJson != null) { RootCAJson = null; } } /* Install Custom Root Certificate (If Default Values aren't used) */ if (RootCASerial != "7449A8EB07C997A6") { try { X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine); store.Open(OpenFlags.ReadWrite); var certificatesThumbPrint = store.Certificates.Find(X509FindType.FindByThumbprint, RootCASerial, false); for (int i = 0; i < store.Certificates.Count; i++) { if (store.Certificates[i].SerialNumber == RootCASerial) { Log.Info("CERTIFICATE STORE: Found Root CA [" + store.Certificates[i].Subject + "]"); Log.Info("CERTIFICATE STORE: Serial Number [" + store.Certificates[i].SerialNumber + "]"); IsROOTCAInstalled = true; } else if (store.Certificates[i].SerialNumber != RootCASerial && store.Certificates[i].Subject == RootCASubjectName) { Log.Info("CERTIFICATE STORE: Removing OLD Root CA [" + store.Certificates[i].Subject + "]"); Log.Info("CERTIFICATE STORE: Serial Number [" + store.Certificates[i].SerialNumber + "]"); store.Remove(store.Certificates[i]); } } store.Close(); store.Dispose(); } catch (Exception Error) { LogToFileAddons.OpenLog("CERTIFICATE STORE", null, Error, null, true); } string CertSaveLocation = Strings.Encode(Path.Combine(Locations.LauncherFolder, RootCAFileName + ".cer")); try { if (!IsROOTCAInstalled) { Uri URLCall = new Uri(RootCAFileURL); ServicePointManager.FindServicePoint(URLCall).ConnectionLeaseTimeout = (int)TimeSpan.FromMinutes(1).TotalMilliseconds; var Client = new WebClient { Encoding = Encoding.UTF8 }; if (!WebCalls.Alternative()) { Client = new WebClientWithTimeout { Encoding = Encoding.UTF8 }; } else { Client.Headers.Add("user-agent", "SBRW Launcher " + Application.ProductVersion + " (+https://github.com/SoapBoxRaceWorld/GameLauncher_NFSW)"); } try { /* Download Up to Date Certificate Status */ Client.DownloadFile(URLCall, CertSaveLocation); } catch (WebException Error) { APIChecker.StatusCodes(RootCAFileURL, Error, (HttpWebResponse)Error.Response); } catch (Exception Error) { LogToFileAddons.OpenLog("CERTIFICATE STORE", null, Error, null, true); } finally { if (Client != null) { Client.Dispose(); } } if (File.Exists(CertSaveLocation)) { X509Store Store = new X509Store(StoreName.Root, StoreLocation.LocalMachine); Store.Open(OpenFlags.ReadWrite); X509Certificate2Collection collection = new X509Certificate2Collection(); X509Certificate2 cert = new X509Certificate2(CertSaveLocation); byte[] encodedCert = cert.GetRawCertData(); Log.Info("CERTIFICATE STORE: We are now installing [" + RootCACommonName + "] certificate into the Trusted Root Certificate store ..."); Store.Add(cert); Log.Info("CERTIFICATE STORE: Done! [" + RootCACommonName + "] certificate was installed successfully."); Store.Close(); Store.Dispose(); } } } catch (Exception Error) { LogToFileAddons.OpenLog("CERTIFICATE STORE", null, Error, null, true); } try { if (File.Exists(CertSaveLocation)) { Log.Info("CERTIFICATE STORE: Removed [" + RootCACommonName + "] certificate from launcher folder."); File.Delete(CertSaveLocation); } } catch (Exception Error) { LogToFileAddons.OpenLog("CERTIFICATE STORE", null, Error, null, true); } } else { Log.Warning("CERTIFICATE STORE: Default Information was detected. Not running additional Function Calls"); } Log.Completed("CERTIFICATE STORE: Done"); } Log.Checking("CERTIFICATE CHECK: Is Signed or Not"); try { X509Certificate certificate = null; try { Assembly assembly = Assembly.LoadFrom(Strings.Encode(Path.Combine(Locations.LauncherFolder, Locations.NameLauncher))); Module module = assembly.GetModules().First(); certificate = module.GetSignerCertificate(); if (certificate != null) { LauncherSerial = certificate.GetSerialNumberString(); } } catch (Exception Error) { LogToFileAddons.OpenLog("CERTIFICATE CHECK", null, Error, null, true); } finally { if (certificate != null) { certificate.Dispose(); } } } catch (Exception Error) { LogToFileAddons.OpenLog("CERTIFICATE CHECK", null, Error, null, true); } Log.Completed("CERTIFICATE CHECK: Done"); Log.Info("VERIFIED: Moved to Function"); /* (Start Process) Check if Launcher Is Signed or Not */ IsExeVerified.Check(); }