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