using System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.InteropServices; using System.Windows.Forms; namespace Navigator { // Token: 0x02000003 RID: 3 public static class Experiments { // Token: 0x06000014 RID: 20 [DllImport("kernel32.dll", SetLastError = true)] private static extern bool AttachConsole(uint dwProcessId); // Token: 0x06000015 RID: 21 [DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true)] private static extern bool FreeConsole(); // Token: 0x06000016 RID: 22 [DllImport("kernel32.dll")] private static extern bool SetConsoleCtrlHandler(Experiments.ConsoleCtrlDelegate HandlerRoutine, bool Add); // Token: 0x06000017 RID: 23 [DllImport("kernel32.dll")] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool GenerateConsoleCtrlEvent(Experiments.CtrlTypes dwCtrlEvent, uint dwProcessGroupId); // Token: 0x06000018 RID: 24 [DllImport("User32.dll", CharSet = CharSet.Auto)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); // Token: 0x06000019 RID: 25 RVA: 0x000023C8 File Offset: 0x000005C8 public static Process StartProgramUsingDotNet(RichTextBox output, bool createNoWindow) { Process process = new Process(); Process result; try { string codeBase = Assembly.GetExecutingAssembly().CodeBase; string directoryName = Path.GetDirectoryName(codeBase); process.StartInfo.FileName = (directoryName + "\\mysqld.exe").Remove(0, 6); process.StartInfo.Arguments = " --defaults-file=my.ini --console"; process.StartInfo.CreateNoWindow = true; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardError = true; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardInput = true; process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; process.OutputDataReceived += delegate(object origin, DataReceivedEventArgs args) { Experiments.WriteTextAsync(args.Data, output); }; process.ErrorDataReceived += delegate(object origin, DataReceivedEventArgs args) { Experiments.WriteTextAsync(args.Data, output); }; process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); result = process; } catch (Exception ex) { MessageBox.Show(string.Concat(new string[] { ex.Message, "\n", ex.StackTrace, "\n", ex.Source })); result = process; } return result; } // Token: 0x0600001A RID: 26 RVA: 0x000025AC File Offset: 0x000007AC private static void WriteTextAsync(string text, RichTextBox output) { Action method = delegate() { if (text != null) { output.AppendText(text + Environment.NewLine); IntPtr wParam = new IntPtr(7); IntPtr lParam = new IntPtr(0); Experiments.SendMessage(output.Handle, 277U, wParam, lParam); } }; output.BeginInvoke(method, null); } // Token: 0x0600001B RID: 27 RVA: 0x000025EC File Offset: 0x000007EC public static void StopProgramByAttachingToItsConsoleAndIssuingCtrlCEvent(Process proc) { if (Experiments.AttachConsole((uint)proc.Id)) { Experiments.SetConsoleCtrlHandler(null, true); Experiments.GenerateConsoleCtrlEvent(Experiments.CtrlTypes.CTRL_C_EVENT, 0U); proc.WaitForExit(); Experiments.FreeConsole(); Experiments.SetConsoleCtrlHandler(null, false); } } // Token: 0x04000003 RID: 3 private const int WM_VSCROLL = 277; // Token: 0x04000004 RID: 4 private const int SB_BOTTOM = 7; // Token: 0x02000004 RID: 4 // (Invoke) Token: 0x0600001D RID: 29 private delegate bool ConsoleCtrlDelegate(Experiments.CtrlTypes CtrlType); // Token: 0x02000005 RID: 5 private enum CtrlTypes : uint { // Token: 0x04000006 RID: 6 CTRL_C_EVENT, // Token: 0x04000007 RID: 7 CTRL_BREAK_EVENT, // Token: 0x04000008 RID: 8 CTRL_CLOSE_EVENT, // Token: 0x04000009 RID: 9 CTRL_LOGOFF_EVENT = 5U, // Token: 0x0400000A RID: 10 CTRL_SHUTDOWN_EVENT } } }