using System; using System.Diagnostics; using System.IO; using System.Security.Cryptography; using System.Windows.Forms; namespace AssemblerCasinoLauncher { static class Program { const string ExpectedPokerSha256 = "7E7165F5B9287FCF0F7A7E8F526DD23C0DA5F3A6CF72F08D1A40EB548FFCD428"; [STAThread] static void Main() { var root = AppDomain.CurrentDomain.BaseDirectory; // The installed launcher is at the root; developer builds live in dist. if (!File.Exists(Path.Combine(root, "bin", "poker.exe"))) { var parent = Directory.GetParent(root.TrimEnd(Path.DirectorySeparatorChar)); if (parent != null && Directory.Exists(Path.Combine(parent.FullName, "assets")) && File.Exists(Path.Combine(parent.FullName, "bin", "poker.exe"))) root = parent.FullName; } var game = Path.Combine(root, "bin", "poker.exe"); if (!File.Exists(game)) { MessageBox.Show("bin\\poker.exe не найден рядом с лаунчером.", "Assembler Casino", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!VerifyGame(game)) { MessageBox.Show("bin\\poker.exe был изменен или поврежден. Запуск остановлен.", "Assembler Casino", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } Process.Start(new ProcessStartInfo { FileName = game, WorkingDirectory = root, UseShellExecute = false }); } static bool VerifyGame(string gamePath) { try { using (var sha = SHA256.Create()) using (var stream = File.OpenRead(gamePath)) { var actual = BitConverter.ToString(sha.ComputeHash(stream)).Replace("-", ""); return actual.Equals(ExpectedPokerSha256, StringComparison.OrdinalIgnoreCase); } } catch { return false; } } } }