Unverified Commit 1e982c65 authored by Jehonathan Thomas's avatar Jehonathan Thomas Committed by GitHub

Merge pull request #508 from antrv/feature/sysproxy-win7

Fix restoring the system proxy state at the system shutdown in Windows 7
parents c963bc58 8b0e1e76
......@@ -18,6 +18,12 @@ namespace Titanium.Web.Proxy.Helpers
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);
/// <summary>
/// <see href="https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getsystemmetrics" />
/// </summary>
[DllImport("user32.dll")]
internal static extern int GetSystemMetrics(int nIndex);
// Pinvoke
internal delegate bool ConsoleEventDelegate(int eventType);
}
......
......@@ -80,10 +80,13 @@ namespace Titanium.Web.Proxy.Helpers
/// <param name="protocolType"></param>
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 @@ namespace Titanium.Web.Proxy.Helpers
/// </summary>
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 @@ namespace Titanium.Web.Proxy.Helpers
/// </summary>
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 @@ namespace Titanium.Web.Proxy.Helpers
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 @@ namespace Titanium.Web.Proxy.Helpers
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 @@ namespace Titanium.Web.Proxy.Helpers
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 @@ namespace Titanium.Web.Proxy.Helpers
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;
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())
{
return getProxyInfoFromRegistry(reg);
if (reg == null)
{
return null;
}
return null;
return getProxyInfoFromRegistry(reg);
}
}
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 @@ namespace Titanium.Web.Proxy.Helpers
NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionSettingsChanged, IntPtr.Zero, 0);
NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionRefresh, IntPtr.Zero, 0);
}
/// <summary>
/// Opens the registry key with the internet settings
/// </summary>
private static RegistryKey OpenInternetSettingsKey()
{
return Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment