aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--embeddable-dll-service/README.md2
-rw-r--r--embeddable-dll-service/csharp/TunnelDll/Service.cs2
-rw-r--r--manager/install.go18
-rw-r--r--tunnel/addressconfig.go25
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