From 084d48d22da2a518887949a59c77f2bca35f94b2 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Wed, 23 Jun 2021 17:48:47 -0700 Subject: [PATCH] net/dns: always proxy through quad-100 on windows 8.1. Windows 8.1 incorrectly handles search paths on an interface with no associated resolver, so we have to provide a full primary DNS config rather than use Windows 8.1's nascent-but-present NRPT functionality. Fixes #2237. Signed-off-by: David Anderson --- net/dns/manager_windows.go | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/net/dns/manager_windows.go b/net/dns/manager_windows.go index 83cc0db51..aec11c5a7 100644 --- a/net/dns/manager_windows.go +++ b/net/dns/manager_windows.go @@ -44,7 +44,7 @@ func NewOSConfigurator(logf logger.Logf, interfaceName string) (OSConfigurator, ret := windowsManager{ logf: logf, guid: interfaceName, - nrptWorks: !isWindows7(), + nrptWorks: isWindows10OrBetter(), } // Best-effort: if our NRPT rule exists, try to delete it. Unlike @@ -407,22 +407,16 @@ var siteLocalResolvers = []netaddr.IP{ netaddr.MustParseIP("fec0:0:0:ffff::3"), } -func isWindows7() bool { +func isWindows10OrBetter() bool { key, err := registry.OpenKey(registry.LOCAL_MACHINE, versionKey, registry.READ) if err != nil { - // Fail safe, assume Windows 7. - return true + // Fail safe, assume old Windows. + return false } - ver, _, err := key.GetStringValue("CurrentVersion") - if err != nil { - return true + // This key above only exists in Windows 10 and above. Its mere + // presence is good enough. + if _, _, err := key.GetIntegerValue("CurrentMajorVersionNumber"); err != nil { + return false } - // Careful to not assume anything about version numbers beyond - // 6.3, Microsoft deprecated this registry key and locked its - // value to what it was in Windows 8.1. We can only use this to - // probe for versions before that. Good thing we only need Windows - // 7 (so far). - // - // And yes, Windows 7 is version 6.1. Don't ask. - return ver == "6.1" + return true }