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