diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-09-19 19:38:33 -0600 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-09-19 19:38:33 -0600 |
commit | 89cc9fc144b2c02cb9794fdf7e466bf2af23ced1 (patch) | |
tree | d8f9502efc0322f13d453f27af273af59c449776 | |
parent | tunnel: pretty print route failures better (diff) | |
download | wireguard-windows-89cc9fc144b2c02cb9794fdf7e466bf2af23ced1.tar.xz wireguard-windows-89cc9fc144b2c02cb9794fdf7e466bf2af23ced1.zip |
tunnel: help people fix their DNS Cache service
Too many people follow silly Internet guides and disable this, making it
impossible for us to then set activestore-style DNS servers for the
interface.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r-- | tunnel/addressconfig.go | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/tunnel/addressconfig.go b/tunnel/addressconfig.go index 350dd645..c887f7b7 100644 --- a/tunnel/addressconfig.go +++ b/tunnel/addressconfig.go @@ -13,6 +13,7 @@ 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" @@ -56,6 +57,25 @@ 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 { @@ -167,6 +187,11 @@ 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 |