summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--talpid-core/src/dns/windows/mod.rs23
1 files changed, 19 insertions, 4 deletions
diff --git a/talpid-core/src/dns/windows/mod.rs b/talpid-core/src/dns/windows/mod.rs
index 66a361e9be..d8bd326786 100644
--- a/talpid-core/src/dns/windows/mod.rs
+++ b/talpid-core/src/dns/windows/mod.rs
@@ -160,8 +160,13 @@ fn set_dns_cache_policy(servers: &[IpAddr]) -> Result<(), Error> {
}
fn set_dns_cache_policy_inner(transaction: &Transaction, servers: &[IpAddr]) -> Result<(), Error> {
- let dns_cache_parameters = RegKey::predef(HKEY_LOCAL_MACHINE)
- .open_subkey(r#"SYSTEM\CurrentControlSet\Services\DnsCache\Parameters"#)?;
+ let (dns_cache_parameters, _) = RegKey::predef(HKEY_LOCAL_MACHINE).create_subkey_transacted(
+ r#"SYSTEM\CurrentControlSet\Services\DnsCache\Parameters"#,
+ transaction,
+ )?;
+
+ // Fall back on LLMNR and NetBIOS if DNS resolution fails
+ dns_cache_parameters.set_value("DnsSecureNameQueryFallback", &1u32)?;
let policy_path = Path::new("DnsPolicyConfig").join(DNS_CACHE_POLICY_GUID);
let (policy_config, _) =
@@ -186,8 +191,18 @@ fn set_dns_cache_policy_inner(transaction: &Transaction, servers: &[IpAddr]) ->
}
fn reset_dns_cache_policy() -> Result<(), Error> {
- let dns_cache_parameters = RegKey::predef(HKEY_LOCAL_MACHINE)
- .open_subkey(r#"SYSTEM\CurrentControlSet\Services\DnsCache\Parameters"#)?;
+ let (dns_cache_parameters, _) = RegKey::predef(HKEY_LOCAL_MACHINE)
+ .create_subkey(r#"SYSTEM\CurrentControlSet\Services\DnsCache\Parameters"#)?;
+ match dns_cache_parameters.delete_value("DnsSecureNameQueryFallback") {
+ Ok(()) => Ok(()),
+ Err(error) => {
+ if error.kind() == io::ErrorKind::NotFound {
+ Ok(())
+ } else {
+ Err(Error::UpdateDnsCachePolicy(error))
+ }
+ }
+ }?;
let policy_path = Path::new("DnsPolicyConfig").join(DNS_CACHE_POLICY_GUID);
match dns_cache_parameters.delete_subkey_all(policy_path) {
Ok(()) => Ok(()),