From 8b0e1e76d94b03e53e6ab2579548465cc1c86f23 Mon Sep 17 00:00:00 2001 From: Anton Ryzhov Date: Wed, 17 Oct 2018 16:31:34 +0300 Subject: [PATCH] Do not call SetInternetOption when restoring proxy state at the system shutdown in Windows 7 or earlier. This re-enables ProxyEnabled registry value. --- .../Helpers/NativeMethods.SystemProxy.cs | 6 ++ src/Titanium.Web.Proxy/Helpers/SystemProxy.cs | 92 ++++++++++++++----- 2 files changed, 74 insertions(+), 24 deletions(-) diff --git a/src/Titanium.Web.Proxy/Helpers/NativeMethods.SystemProxy.cs b/src/Titanium.Web.Proxy/Helpers/NativeMethods.SystemProxy.cs index c85e880fa..56509a458 100644 --- a/src/Titanium.Web.Proxy/Helpers/NativeMethods.SystemProxy.cs +++ b/src/Titanium.Web.Proxy/Helpers/NativeMethods.SystemProxy.cs @@ -18,6 +18,12 @@ internal static extern bool InternetSetOption(IntPtr hInternet, int dwOption, In [DllImport("kernel32.dll", SetLastError = true)] internal static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add); + /// + /// + /// + [DllImport("user32.dll")] + internal static extern int GetSystemMetrics(int nIndex); + // Pinvoke internal delegate bool ConsoleEventDelegate(int eventType); } diff --git a/src/Titanium.Web.Proxy/Helpers/SystemProxy.cs b/src/Titanium.Web.Proxy/Helpers/SystemProxy.cs index a1a5cb0da..11cd5f8f9 100644 --- a/src/Titanium.Web.Proxy/Helpers/SystemProxy.cs +++ b/src/Titanium.Web.Proxy/Helpers/SystemProxy.cs @@ -80,10 +80,13 @@ public SystemProxyManager() /// internal void SetProxy(string hostname, int port, ProxyProtocolType protocolType) { - var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); - - if (reg != null) + using (var reg = OpenInternetSettingsKey()) { + if (reg == null) + { + return; + } + saveOriginalProxyConfiguration(reg); prepareRegistry(reg); @@ -124,9 +127,13 @@ internal void SetProxy(string hostname, int port, ProxyProtocolType protocolType /// internal void RemoveProxy(ProxyProtocolType protocolType, bool saveOriginalConfig = true) { - var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); - if (reg != null) + using (var reg = OpenInternetSettingsKey()) { + if (reg == null) + { + return; + } + if (saveOriginalConfig) { saveOriginalProxyConfiguration(reg); @@ -161,10 +168,13 @@ internal void RemoveProxy(ProxyProtocolType protocolType, bool saveOriginalConfi /// internal void DisableAllProxy() { - var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); - - if (reg != null) + using (var reg = OpenInternetSettingsKey()) { + if (reg == null) + { + return; + } + saveOriginalProxyConfiguration(reg); reg.SetValue(regProxyEnable, 0); @@ -176,10 +186,13 @@ internal void DisableAllProxy() internal void SetAutoProxyUrl(string url) { - var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); - - if (reg != null) + using (var reg = OpenInternetSettingsKey()) { + if (reg == null) + { + return; + } + saveOriginalProxyConfiguration(reg); reg.SetValue(regAutoConfigUrl, url); refresh(); @@ -188,10 +201,13 @@ internal void SetAutoProxyUrl(string url) internal void SetProxyOverride(string proxyOverride) { - var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); - - if (reg != null) + using (var reg = OpenInternetSettingsKey()) { + if (reg == null) + { + return; + } + saveOriginalProxyConfiguration(reg); reg.SetValue(regProxyOverride, proxyOverride); refresh(); @@ -205,10 +221,13 @@ internal void RestoreOriginalSettings() return; } - var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); - - if (reg != null) + using (var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true)) { + if (reg == null) + { + return; + } + var ov = originalValues; if (ov.AutoConfigUrl != null) { @@ -246,26 +265,43 @@ internal void RestoreOriginalSettings() reg.DeleteValue(regProxyOverride, false); } + // This should not be needed, but sometimes the values are not stored into the registry + // at system shutdown without flushing. + reg.Flush(); + originalValues = null; - refresh(); + + const int SM_SHUTTINGDOWN = 0x2000; + Version windows7Version = new Version(6, 1); + if (Environment.OSVersion.Version > windows7Version || + NativeMethods.GetSystemMetrics(SM_SHUTTINGDOWN) == 0) + { + // Do not call refresh() in Windows 7 or earlier at system shutdown. + // SetInternetOption in the refresh method re-enables ProxyEnable registry value + // in Windows 7 or earlier at system shutdown. + refresh(); + } } } internal ProxyInfo GetProxyInfoFromRegistry() { - var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); - - if (reg != null) + using (var reg = OpenInternetSettingsKey()) { + if (reg == null) + { + return null; + } + return getProxyInfoFromRegistry(reg); } - - return null; } private ProxyInfo getProxyInfoFromRegistry(RegistryKey reg) { - var pi = new ProxyInfo(null, reg.GetValue(regAutoConfigUrl) as string, reg.GetValue(regProxyEnable) as int?, + var pi = new ProxyInfo(null, + reg.GetValue(regAutoConfigUrl) as string, + reg.GetValue(regProxyEnable) as int?, reg.GetValue(regProxyServer) as string, reg.GetValue(regProxyOverride) as string); @@ -307,5 +343,13 @@ private static void refresh() NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionSettingsChanged, IntPtr.Zero, 0); NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionRefresh, IntPtr.Zero, 0); } + + /// + /// Opens the registry key with the internet settings + /// + private static RegistryKey OpenInternetSettingsKey() + { + return Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true); + } } }