From 373ee6586a489a5cfa1e21fda36149c4f1245c1b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 4 Jul 2024 17:07:05 +0800 Subject: [PATCH] Optimize system proxy code --- v2rayN/v2rayN/App.xaml.cs | 1 + v2rayN/v2rayN/Handler/ProxySetting.cs | 22 +++++--- v2rayN/v2rayN/Handler/SysProxyHandle.cs | 72 ++++++++++++++----------- 3 files changed, 57 insertions(+), 38 deletions(-) diff --git a/v2rayN/v2rayN/App.xaml.cs b/v2rayN/v2rayN/App.xaml.cs index d5b510b3..406cd3ac 100644 --- a/v2rayN/v2rayN/App.xaml.cs +++ b/v2rayN/v2rayN/App.xaml.cs @@ -43,6 +43,7 @@ namespace v2rayN Init(); Logging.LoggingEnabled(_config.guiItem.enableLog); Logging.SaveLog($"v2rayN start up | {Utils.GetVersion()} | {Utils.GetExePath()}"); + Logging.SaveLog($"{Environment.OSVersion} - {(Environment.Is64BitOperatingSystem ? 64 : 32)}"); Logging.ClearLogs(); Thread.CurrentThread.CurrentUICulture = new(_config.uiItem.currentLanguage); diff --git a/v2rayN/v2rayN/Handler/ProxySetting.cs b/v2rayN/v2rayN/Handler/ProxySetting.cs index a6ce2454..061ab887 100644 --- a/v2rayN/v2rayN/Handler/ProxySetting.cs +++ b/v2rayN/v2rayN/Handler/ProxySetting.cs @@ -29,15 +29,23 @@ namespace v2rayN.Handler /// true: one of connection is successfully updated proxy settings public static bool SetProxy(string? strProxy, string? exceptions, int type) { - // set proxy for LAN - bool result = SetConnectionProxy(null, strProxy, exceptions, type); - // set proxy for dial up connections - var connections = EnumerateRasEntries(); - foreach (var connection in connections) + try { - result |= SetConnectionProxy(connection, strProxy, exceptions, type); + // set proxy for LAN + bool result = SetConnectionProxy(null, strProxy, exceptions, type); + // set proxy for dial up connections + var connections = EnumerateRasEntries(); + foreach (var connection in connections) + { + result |= SetConnectionProxy(connection, strProxy, exceptions, type); + } + return result; + } + catch (Exception ex) + { + Logging.SaveLog(ex.Message, ex); + return false; } - return result; } private static bool SetConnectionProxy(string? connectionName, string? strProxy, string? exceptions, int type) diff --git a/v2rayN/v2rayN/Handler/SysProxyHandle.cs b/v2rayN/v2rayN/Handler/SysProxyHandle.cs index 679c3aa5..6bd261f9 100644 --- a/v2rayN/v2rayN/Handler/SysProxyHandle.cs +++ b/v2rayN/v2rayN/Handler/SysProxyHandle.cs @@ -6,30 +6,7 @@ namespace v2rayN.Handler { public static class SysProxyHandle { - //private const string _userWininetConfigFile = "user-wininet.json"; - - //private static string _queryStr; - - // In general, this won't change - // format: - // - // - // - // - - private enum RET_ERRORS : int - { - RET_NO_ERROR = 0, - INVALID_FORMAT = 1, - NO_PERMISSION = 2, - SYSCALL_FAILED = 3, - NO_MEMORY = 4, - INVAILD_OPTION_COUNT = 5, - }; - - static SysProxyHandle() - { - } + private const string _regPath = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings"; public static bool UpdateSysProxy(Config config, bool forceDisable) { @@ -65,11 +42,17 @@ namespace v2rayN.Handler .Replace("{http_port}", port.ToString()) .Replace("{socks_port}", portSocks.ToString()); } - ProxySetting.SetProxy(strProxy, strExceptions, 2); // set a named proxy + if (!ProxySetting.SetProxy(strProxy, strExceptions, 2)) + { + SetProxy(strProxy, strExceptions, 2); + } } else if (type == ESysProxyType.ForcedClear) { - ProxySetting.UnsetProxy(); // set to no proxy + if (!ProxySetting.UnsetProxy()) + { + UnsetProxy(); + } } else if (type == ESysProxyType.Unchanged) { @@ -78,7 +61,10 @@ namespace v2rayN.Handler { PacHandler.Start(Utils.GetConfigPath(), port, portPac); var strProxy = $"{Global.HttpProtocol}{Global.Loopback}:{portPac}/pac?t={DateTime.Now.Ticks}"; - ProxySetting.SetProxy(strProxy, "", 4); // use pac script url for auto-config proxy + if (!ProxySetting.SetProxy(strProxy, "", 4)) + { + SetProxy(strProxy, "", 4); + } } if (type != ESysProxyType.Pac) @@ -95,14 +81,38 @@ namespace v2rayN.Handler public static void ResetIEProxy4WindowsShutDown() { - try + SetProxy(null, null, 1); + } + + private static void UnsetProxy() + { + SetProxy(null, null, 1); + } + + private static bool SetProxy(string? strProxy, string? exceptions, int type) + { + if (type == 1) { - //TODO To be verified - Utils.RegWriteValue(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", 0); + Utils.RegWriteValue(_regPath, "ProxyEnable", 0); + Utils.RegWriteValue(_regPath, "ProxyServer", string.Empty); + Utils.RegWriteValue(_regPath, "ProxyOverride", string.Empty); + Utils.RegWriteValue(_regPath, "AutoConfigURL", string.Empty); } - catch + if (type == 2) { + Utils.RegWriteValue(_regPath, "ProxyEnable", 1); + Utils.RegWriteValue(_regPath, "ProxyServer", strProxy ?? string.Empty); + Utils.RegWriteValue(_regPath, "ProxyOverride", exceptions ?? string.Empty); + Utils.RegWriteValue(_regPath, "AutoConfigURL", string.Empty); } + else if (type == 4) + { + Utils.RegWriteValue(_regPath, "ProxyEnable", 0); + Utils.RegWriteValue(_regPath, "ProxyServer", string.Empty); + Utils.RegWriteValue(_regPath, "ProxyOverride", string.Empty); + Utils.RegWriteValue(_regPath, "AutoConfigURL", strProxy ?? string.Empty); + } + return true; } } } \ No newline at end of file