private void OpenClient(object sender, EventArgs e) { var clientPath = Properties.Resources.DarkAgesPath; try { if (!File.Exists(Rain.Properties.Resources.DarkAgesPath)) { MessageBox.Show("Check the Path in settings."); } else { NativeMethods.StartupInfo startupInfo = new NativeMethods.StartupInfo(); startupInfo.Size = Marshal.SizeOf(startupInfo); NativeMethods.ProcessInformation processInfo; NativeMethods.CreateProcess(Properties.Resources.DarkAgesPath, (string)null, IntPtr.Zero, IntPtr.Zero, false, NativeMethods.ProcessCreationFlags.Suspended, IntPtr.Zero, (string)null, ref startupInfo, out processInfo); using (ProcessMemoryStream processMemoryStream = new ProcessMemoryStream(processInfo.ProcessId, NativeMethods.ProcessAccessFlags.VmOperation | NativeMethods.ProcessAccessFlags.VmRead | NativeMethods.ProcessAccessFlags.VmWrite)) { processMemoryStream.Position = 4384293L; processMemoryStream.WriteByte((byte)144); processMemoryStream.WriteByte((byte)144); processMemoryStream.WriteByte((byte)144); processMemoryStream.WriteByte((byte)144); processMemoryStream.WriteByte((byte)144); processMemoryStream.WriteByte((byte)144); processMemoryStream.Position = 4404130L; processMemoryStream.WriteByte((byte)235); processMemoryStream.Position = 4404162L; processMemoryStream.WriteByte((byte)106); processMemoryStream.WriteByte((byte)1); processMemoryStream.WriteByte((byte)106); processMemoryStream.WriteByte((byte)0); processMemoryStream.WriteByte((byte)106); processMemoryStream.WriteByte((byte)0); processMemoryStream.WriteByte((byte)106); processMemoryStream.WriteByte((byte)127); processMemoryStream.Position = 5744601L; processMemoryStream.WriteByte((byte)235); processMemoryStream.Position = 7290020L; processMemoryStream.WriteString("Rain"); NativeMethods.ResumeThread(processInfo.ThreadHandle); } Process processById = Process.GetProcessById(processInfo.ProcessId); do { ; }while (processById.MainWindowHandle == IntPtr.Zero); NativeMethods.SetWindowText(processById.MainWindowHandle, "Dark Ages : Rain"); App.ProcessIds.Add(processInfo.ProcessId); } } catch (FileNotFoundException) { MessageBox.Show("Error occurred, check your path; Or permissions."); } }
private void Launch() { _config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); string path = _config.AppSettings.Settings["Path"].Value; if (!File.Exists(path)) { MessageBox.Show("Hybrasyl Launcher could not find Dark Ages located at: \r\n" + path, "File not found!", MessageBoxButton.OK, MessageBoxImage.Hand); return; } ProcessInformation information; StartupInfo startupInfo = new StartupInfo(); startupInfo.Size = Marshal.SizeOf(startupInfo); Kernel32.CreateProcess(path, null, IntPtr.Zero, IntPtr.Zero, false, ProcessCreationFlags.Suspended, IntPtr.Zero, null, ref startupInfo, out information); using (ProcessMemoryStream stream = new ProcessMemoryStream(information.ProcessId, ProcessAccess.VmWrite | ProcessAccess.VmRead | ProcessAccess.VmOperation)) { if (_config.AppSettings.Settings["SkipIntro"].Value == "true") { stream.Position = 0x42E625L; // intro stream.WriteByte(0x90); stream.WriteByte(0x90); stream.WriteByte(0x90); stream.WriteByte(0x90); stream.WriteByte(0x90); stream.WriteByte(0x90); } #region Legacy IPAddress Code /*Legacy IP Address code. do not remove.*/ //stream.Position = 0x4333C2L; // ip //IPAddress addr = Dns.GetHostAddresses(HostName)[0]; //var serverBytes = addr.GetAddressBytes(); //stream.WriteByte(0x6A); //stream.WriteByte(serverBytes[3]); //stream.WriteByte(0x6A); //stream.WriteByte(serverBytes[2]); //stream.WriteByte(0x6A); //stream.WriteByte(serverBytes[1]); //stream.WriteByte(0x6A); //stream.WriteByte(serverBytes[0]); //stream.Position = 0x4333F5L; // port //stream.WriteByte((byte)(Port % 256)); //stream.WriteByte((byte)(Port / 256)); /*End legacy IP Address code. do not remove.*/ #endregion var hostBytes = Encoding.UTF8.GetBytes(HostName); byte[] endBytes = new byte[12]; if (hostBytes.Length != 12) { for (var i = 0; i < hostBytes.Length; i++) { endBytes[i] = hostBytes[i]; } } else { endBytes = hostBytes; } stream.Position = 0x6707A8L; stream.Write(endBytes, 0, 12); if (_config.AppSettings.Settings["MultiInstance"].Value == "true") { stream.Position = 0x57A7D9L; // multi-instance stream.WriteByte(0xEB); } else { LaunchEnabled = false; OnPropertyChanged("LaunchEnabled"); } } Kernel32.ResumeThread(information.ThreadHandle); var process = Process.GetProcessById(information.ProcessId); process.WaitForInputIdle(); User32.SetWindowText(process.MainWindowHandle, "DarkAges : Hybrasyl"); }