diff --git a/CHANGELOG b/CHANGELOG index b937a36..dcaf481 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,4 +2,7 @@ [ v1.0.1 ] - Ship required WinDivert64.sys file -- Increased debuggability \ No newline at end of file +- Increased debuggability + +[ v1.0.2 ] +- Fixed IP routing service issue \ No newline at end of file diff --git a/EvilLimiter.Windows/EvilLimiter.Windows.csproj b/EvilLimiter.Windows/EvilLimiter.Windows.csproj index a4233bf..7e6cbe3 100644 --- a/EvilLimiter.Windows/EvilLimiter.Windows.csproj +++ b/EvilLimiter.Windows/EvilLimiter.Windows.csproj @@ -212,6 +212,7 @@ + FrmAddHost.cs diff --git a/EvilLimiter.Windows/Forms/FrmMain.cs b/EvilLimiter.Windows/Forms/FrmMain.cs index ce8baa2..4b8a302 100644 --- a/EvilLimiter.Windows/Forms/FrmMain.cs +++ b/EvilLimiter.Windows/Forms/FrmMain.cs @@ -1,6 +1,7 @@ using EvilLimiter.Windows.Common; using EvilLimiter.Windows.Data; using EvilLimiter.Windows.Networking; +using EvilLimiter.Windows.Utilities; using MetroFramework; using System; using System.Collections.Generic; @@ -280,6 +281,8 @@ private void TglRouting_CheckedChanged(object sender, EventArgs e) Task.Run(() => { Invoke(invokeGenerator(false)); + + ServiceUtilities.ChangeStartMode(Globals.RoutingService, ServiceStartMode.Manual); Globals.RoutingService.Start(); while (Globals.RoutingService.Status != ServiceControllerStatus.Running) @@ -296,7 +299,9 @@ private void TglRouting_CheckedChanged(object sender, EventArgs e) Task.Run(() => { Invoke(invokeGenerator(false)); + Globals.RoutingService.Stop(); + ServiceUtilities.ChangeStartMode(Globals.RoutingService, ServiceStartMode.Manual); while (Globals.RoutingService.Status != ServiceControllerStatus.Stopped) { diff --git a/EvilLimiter.Windows/Properties/AssemblyInfo.cs b/EvilLimiter.Windows/Properties/AssemblyInfo.cs index d1d099f..a6cc7fa 100644 --- a/EvilLimiter.Windows/Properties/AssemblyInfo.cs +++ b/EvilLimiter.Windows/Properties/AssemblyInfo.cs @@ -32,7 +32,7 @@ // Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, // indem Sie "*" wie unten gezeigt eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.1.0")] -[assembly: AssemblyFileVersion("1.0.1.0")] +[assembly: AssemblyVersion("1.0.2.0")] +[assembly: AssemblyFileVersion("1.0.2.0")] [assembly: NeutralResourcesLanguage("en-US")] diff --git a/EvilLimiter.Windows/Utilities/ServiceUtilities.cs b/EvilLimiter.Windows/Utilities/ServiceUtilities.cs new file mode 100644 index 0000000..d6b931e --- /dev/null +++ b/EvilLimiter.Windows/Utilities/ServiceUtilities.cs @@ -0,0 +1,83 @@ +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; +using System.ServiceProcess; + +namespace EvilLimiter.Windows.Utilities +{ + public static class ServiceUtilities + { + [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern Boolean ChangeServiceConfig( + IntPtr hService, + UInt32 nServiceType, + UInt32 nStartType, + UInt32 nErrorControl, + String lpBinaryPathName, + String lpLoadOrderGroup, + IntPtr lpdwTagId, + [In] char[] lpDependencies, + String lpServiceStartName, + String lpPassword, + String lpDisplayName); + + [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)] + static extern IntPtr OpenService( + IntPtr hSCManager, string lpServiceName, uint dwDesiredAccess); + + [DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)] + public static extern IntPtr OpenSCManager( + string machineName, string databaseName, uint dwAccess); + + [DllImport("advapi32.dll", EntryPoint = "CloseServiceHandle")] + public static extern int CloseServiceHandle(IntPtr hSCObject); + + private const uint SERVICE_NO_CHANGE = 0xFFFFFFFF; + private const uint SERVICE_QUERY_CONFIG = 0x00000001; + private const uint SERVICE_CHANGE_CONFIG = 0x00000002; + private const uint SC_MANAGER_ALL_ACCESS = 0x000F003F; + + public static void ChangeStartMode(ServiceController svc, ServiceStartMode mode) + { + var scManagerHandle = OpenSCManager(null, null, SC_MANAGER_ALL_ACCESS); + if (scManagerHandle == IntPtr.Zero) + { + throw new ExternalException("Open Service Manager Error"); + } + + var serviceHandle = OpenService( + scManagerHandle, + svc.ServiceName, + SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG); + + if (serviceHandle == IntPtr.Zero) + { + throw new ExternalException("Open Service Error"); + } + + var result = ChangeServiceConfig( + serviceHandle, + SERVICE_NO_CHANGE, + (uint)mode, + SERVICE_NO_CHANGE, + null, + null, + IntPtr.Zero, + null, + null, + null, + null); + + if (result == false) + { + int nError = Marshal.GetLastWin32Error(); + var win32Exception = new Win32Exception(nError); + throw new ExternalException("Could not change service start type: " + + win32Exception.Message); + } + + CloseServiceHandle(serviceHandle); + CloseServiceHandle(scManagerHandle); + } + } +} \ No newline at end of file