diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-01-04 16:26:47 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-01-21 15:26:07 +0100 |
commit | e9ed04e8ba4f3bee171938a435d70b2f2302f6a8 (patch) | |
tree | 6d169de5dd2a34041e40836040e8e1d994500a14 /embeddable-dll-service/csharp/TunnelDll/Service.cs | |
parent | locales: sync with crowdin (diff) | |
download | wireguard-windows-e9ed04e8ba4f3bee171938a435d70b2f2302f6a8.tar.xz wireguard-windows-e9ed04e8ba4f3bee171938a435d70b2f2302f6a8.zip |
embeddable-dll-service: add more robust example for .NET 5
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to '')
-rw-r--r-- | embeddable-dll-service/csharp/TunnelDll/Service.cs (renamed from embeddable-dll-service/csharp/Service.cs) | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/embeddable-dll-service/csharp/Service.cs b/embeddable-dll-service/csharp/TunnelDll/Service.cs index 0310d693..7f2c622e 100644 --- a/embeddable-dll-service/csharp/Service.cs +++ b/embeddable-dll-service/csharp/TunnelDll/Service.cs @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: MIT * - * Copyright (C) 2019-2020 WireGuard LLC. All Rights Reserved. + * Copyright (C) 2019-2021 WireGuard LLC. All Rights Reserved. */ using System; @@ -9,15 +9,14 @@ using System.IO.Pipes; using System.Runtime.InteropServices; using System.ComponentModel; using System.Diagnostics; -using System.Security.Principal; using System.Threading; namespace Tunnel { public class Service { - private const string LongName = "Example WireGuard Tunnel Client"; - private const string Description = "A WireGuard tunnel created by example code."; + private const string LongName = "WireGuard Demo Box"; + private const string Description = "Demonstration tunnel for testing WireGuard"; [DllImport("tunnel.dll", EntryPoint = "WireGuardTunnelService", CallingConvention = CallingConvention.Cdecl)] public static extern bool Run([MarshalAs(UnmanagedType.LPWStr)] string configFile); @@ -28,17 +27,13 @@ namespace Tunnel return new NamedPipeClientStream(pipepath); } - public static void Add(string configFile) + public static void Add(string configFile, bool ephemeral) { var tunnelName = Path.GetFileNameWithoutExtension(configFile); var shortName = String.Format("WireGuardTunnel${0}", tunnelName); var longName = String.Format("{0}: {1}", LongName, tunnelName); var exeName = Process.GetCurrentProcess().MainModule.FileName; - var pathAndArgs = String.Format("\"{0}\" /service \"{1}\"", exeName, configFile); //TODO: This is not the proper way to escape file args. - - var accessControl = File.GetAccessControl(configFile); //TODO: TOCTOU! - accessControl.SetOwner(new NTAccount(Environment.UserDomainName, Environment.UserName)); - File.SetAccessControl(configFile, accessControl); + var pathAndArgs = String.Format("\"{0}\" /service \"{1}\" {2}", exeName, configFile, Process.GetCurrentProcess().Id); //TODO: This is not the proper way to escape file args. var scm = Win32.OpenSCManager(null, null, Win32.ScmAccessRights.AllAccess); if (scm == IntPtr.Zero) @@ -49,7 +44,7 @@ namespace Tunnel if (service != IntPtr.Zero) { Win32.CloseServiceHandle(service); - Remove(configFile); + Remove(configFile, true); } service = Win32.CreateService(scm, shortName, longName, Win32.ServiceAccessRights.AllAccess, Win32.ServiceType.Win32OwnProcess, Win32.ServiceStartType.Demand, Win32.ServiceError.Normal, pathAndArgs, null, IntPtr.Zero, "Nsi\0TcpIp", null, null); if (service == IntPtr.Zero) @@ -66,6 +61,9 @@ namespace Tunnel if (!Win32.StartService(service, 0, null)) throw new Win32Exception(Marshal.GetLastWin32Error()); + + if (ephemeral && !Win32.DeleteService(service)) + throw new Win32Exception(Marshal.GetLastWin32Error()); } finally { @@ -78,7 +76,7 @@ namespace Tunnel } } - public static void Remove(string configFile) + public static void Remove(string configFile, bool waitForStop) { var tunnelName = Path.GetFileNameWithoutExtension(configFile); var shortName = String.Format("WireGuardTunnel${0}", tunnelName); @@ -99,10 +97,10 @@ namespace Tunnel var serviceStatus = new Win32.ServiceStatus(); Win32.ControlService(service, Win32.ServiceControl.Stop, serviceStatus); - for (int i = 0; i < 180 && Win32.QueryServiceStatus(service, serviceStatus) && serviceStatus.dwCurrentState != Win32.ServiceState.Stopped; ++i) + for (int i = 0; waitForStop && i < 180 && Win32.QueryServiceStatus(service, serviceStatus) && serviceStatus.dwCurrentState != Win32.ServiceState.Stopped; ++i) Thread.Sleep(1000); - if (!Win32.DeleteService(service)) + if (!Win32.DeleteService(service) && Marshal.GetLastWin32Error() != 0x00000430) throw new Win32Exception(Marshal.GetLastWin32Error()); } finally |