From bbd5fa7d94fcb6f5de926632789b95cc8ccc706e Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Wed, 22 Sep 2021 14:30:10 -0600 Subject: tunnel: depend on more services Signed-off-by: Jason A. Donenfeld --- embeddable-dll-service/README.md | 2 +- embeddable-dll-service/csharp/TunnelDll/Service.cs | 2 +- manager/install.go | 18 +++++++++++++++- tunnel/addressconfig.go | 25 ---------------------- 4 files changed, 19 insertions(+), 28 deletions(-) diff --git a/embeddable-dll-service/README.md b/embeddable-dll-service/README.md index 9e05ab56..06e13c8a 100644 --- a/embeddable-dll-service/README.md +++ b/embeddable-dll-service/README.md @@ -12,7 +12,7 @@ Display Name: "Some Service Name" Service Type: SERVICE_WIN32_OWN_PROCESS Start Type: StartAutomatic Error Control: ErrorNormal, -Dependencies: [ "Nsi", "TcpIp" ] +Dependencies: [ "Nsi", "Tcpip", "iphlpsvc", "dnscache" ] Sid Type: SERVICE_SID_TYPE_UNRESTRICTED Executable: "C:\path\to\example\vpnclient.exe /service configfile.conf" ``` diff --git a/embeddable-dll-service/csharp/TunnelDll/Service.cs b/embeddable-dll-service/csharp/TunnelDll/Service.cs index 8e25b6c4..dd93384e 100644 --- a/embeddable-dll-service/csharp/TunnelDll/Service.cs +++ b/embeddable-dll-service/csharp/TunnelDll/Service.cs @@ -45,7 +45,7 @@ namespace Tunnel Win32.CloseServiceHandle(service); 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); + service = Win32.CreateService(scm, shortName, longName, Win32.ServiceAccessRights.AllAccess, Win32.ServiceType.Win32OwnProcess, Win32.ServiceStartType.Demand, Win32.ServiceError.Normal, pathAndArgs, null, IntPtr.Zero, "Nsi\0Tcpip\0iphlpsvc\0dnscache", null, null); if (service == IntPtr.Zero) throw new Win32Exception(Marshal.GetLastWin32Error()); try diff --git a/manager/install.go b/manager/install.go index f74fecf0..97772b21 100644 --- a/manager/install.go +++ b/manager/install.go @@ -15,6 +15,7 @@ import ( "golang.org/x/sys/windows" "golang.org/x/sys/windows/svc" "golang.org/x/sys/windows/svc/mgr" + "golang.zx2c4.com/wireguard/windows/l18n" "golang.zx2c4.com/wireguard/windows/conf" "golang.zx2c4.com/wireguard/windows/services" @@ -164,7 +165,7 @@ func InstallTunnel(configPath string) error { ServiceType: windows.SERVICE_WIN32_OWN_PROCESS, StartType: mgr.StartAutomatic, ErrorControl: mgr.ErrorNormal, - Dependencies: []string{"Nsi", "TcpIp"}, + Dependencies: []string{"Nsi", "Tcpip", "iphlpsvc", "dnscache"}, DisplayName: "WireGuard Tunnel: " + name, SidType: windows.SERVICE_SID_TYPE_UNRESTRICTED, } @@ -175,6 +176,21 @@ func InstallTunnel(configPath string) error { err = service.Start() go trackTunnelService(name, service) // Pass off reference to handle. + if err == windows.ERROR_SERVICE_DEPENDENCY_FAIL { + for _, dependentName := range config.Dependencies { + dependentService := mgr.Service{Name: dependentName} + var serr error + dependentService.Handle, serr = windows.OpenService(m.Handle, windows.StringToUTF16Ptr(dependentService.Name), windows.SERVICE_QUERY_CONFIG) + if serr == nil { + cfg, serr := dependentService.Config() + dependentService.Close() + if serr == nil && cfg.StartType == mgr.StartDisabled { + err = errors.New(l18n.Sprintf("The %q service (%s) is disabled; please re-enable it.", cfg.DisplayName, dependentName)) + break + } + } + } + } return err } diff --git a/tunnel/addressconfig.go b/tunnel/addressconfig.go index c887f7b7..350dd645 100644 --- a/tunnel/addressconfig.go +++ b/tunnel/addressconfig.go @@ -13,7 +13,6 @@ import ( "sort" "golang.org/x/sys/windows" - "golang.org/x/sys/windows/svc/mgr" "golang.zx2c4.com/wireguard/windows/conf" "golang.zx2c4.com/wireguard/windows/tunnel/firewall" "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" @@ -57,25 +56,6 @@ func cleanupAddressesOnDisconnectedInterfaces(family winipcfg.AddressFamily, add } } -func isDnsCacheDisabled() (bool, string) { - scm, err := mgr.Connect() - if err != nil { - return false, "" - } - defer scm.Disconnect() - svc := mgr.Service{Name: "dnscache"} - svc.Handle, err = windows.OpenService(scm.Handle, windows.StringToUTF16Ptr(svc.Name), windows.SERVICE_QUERY_CONFIG) - if err != nil { - return false, "" - } - defer svc.Close() - cfg, err := svc.Config() - if err != nil { - return false, "" - } - return cfg.StartType == mgr.StartDisabled, cfg.DisplayName -} - func configureInterface(family winipcfg.AddressFamily, conf *conf.Config, luid winipcfg.LUID, clamper mtuClamper) error { estimatedRouteCount := 0 for _, peer := range conf.Peers { @@ -187,11 +167,6 @@ func configureInterface(family winipcfg.AddressFamily, conf *conf.Config, luid w err = luid.SetDNS(family, conf.Interface.DNS, conf.Interface.DNSSearch) if err != nil { - if err == windows.RPC_S_INVALID_BINDING || err == windows.ERROR_SERVICE_NOT_ACTIVE { - if disabled, name := isDnsCacheDisabled(); disabled { - err = fmt.Errorf("the %q service (dnscache) is disabled; please re-enable it", name) - } - } return fmt.Errorf("unable to set DNS %v %v: %w", conf.Interface.DNS, conf.Interface.DNSSearch, err) } return nil -- cgit v1.2.3-59-g8ed1b