mirror of https://github.com/2dust/v2rayN
remove res
parent
b7ac195bfc
commit
dfc22258dd
|
@ -1,190 +0,0 @@
|
||||||
using System;
|
|
||||||
using Microsoft.Win32;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
namespace v2rayN.Handler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 设置系统代理类
|
|
||||||
/// </summary>
|
|
||||||
class ProxySetting
|
|
||||||
{
|
|
||||||
public static bool UnsetProxy()
|
|
||||||
{
|
|
||||||
return SetProxy(null, null);
|
|
||||||
}
|
|
||||||
public static bool SetProxy(string strProxy)
|
|
||||||
{
|
|
||||||
return SetProxy(strProxy, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool SetProxy(string strProxy, string exceptions)
|
|
||||||
{
|
|
||||||
InternetPerConnOptionList list = new InternetPerConnOptionList();
|
|
||||||
|
|
||||||
int optionCount = string.IsNullOrEmpty(strProxy) ? 1 : (string.IsNullOrEmpty(exceptions) ? 2 : 3);
|
|
||||||
InternetConnectionOption[] options = new InternetConnectionOption[optionCount];
|
|
||||||
// USE a proxy server ...
|
|
||||||
options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS;
|
|
||||||
options[0].m_Value.m_Int = (int)((optionCount < 2) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY));
|
|
||||||
// use THIS proxy server
|
|
||||||
if (optionCount > 1)
|
|
||||||
{
|
|
||||||
options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER;
|
|
||||||
options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy);
|
|
||||||
// except for these addresses ...
|
|
||||||
if (optionCount > 2)
|
|
||||||
{
|
|
||||||
options[2].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS;
|
|
||||||
options[2].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// default stuff
|
|
||||||
list.dwSize = Marshal.SizeOf(list);
|
|
||||||
list.szConnection = IntPtr.Zero;
|
|
||||||
list.dwOptionCount = options.Length;
|
|
||||||
list.dwOptionError = 0;
|
|
||||||
|
|
||||||
|
|
||||||
int optSize = Marshal.SizeOf(typeof(InternetConnectionOption));
|
|
||||||
// make a pointer out of all that ...
|
|
||||||
IntPtr optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length);
|
|
||||||
// copy the array over into that spot in memory ...
|
|
||||||
for (int i = 0; i < options.Length; ++i)
|
|
||||||
{
|
|
||||||
IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (i * optSize));
|
|
||||||
Marshal.StructureToPtr(options[i], opt, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
list.options = optionsPtr;
|
|
||||||
|
|
||||||
// and then make a pointer out of the whole list
|
|
||||||
IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize);
|
|
||||||
Marshal.StructureToPtr(list, ipcoListPtr, false);
|
|
||||||
|
|
||||||
// and finally, call the API method!
|
|
||||||
int returnvalue = NativeMethods.InternetSetOption(IntPtr.Zero,
|
|
||||||
InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION,
|
|
||||||
ipcoListPtr, list.dwSize) ? -1 : 0;
|
|
||||||
if (returnvalue == 0)
|
|
||||||
{ // get the error codes, they might be helpful
|
|
||||||
returnvalue = Marshal.GetLastWin32Error();
|
|
||||||
}
|
|
||||||
// FREE the data ASAP
|
|
||||||
Marshal.FreeCoTaskMem(optionsPtr);
|
|
||||||
Marshal.FreeCoTaskMem(ipcoListPtr);
|
|
||||||
if (returnvalue > 0)
|
|
||||||
{ // throw the error codes, they might be helpful
|
|
||||||
//throw new Win32Exception(Marshal.GetLastWin32Error());
|
|
||||||
}
|
|
||||||
|
|
||||||
return (returnvalue < 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#region WinInet structures
|
|
||||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
|
|
||||||
public struct InternetPerConnOptionList
|
|
||||||
{
|
|
||||||
public int dwSize; // size of the INTERNET_PER_CONN_OPTION_LIST struct
|
|
||||||
public IntPtr szConnection; // connection name to set/query options
|
|
||||||
public int dwOptionCount; // number of options to set/query
|
|
||||||
public int dwOptionError; // on error, which option failed
|
|
||||||
//[MarshalAs(UnmanagedType.)]
|
|
||||||
public IntPtr options;
|
|
||||||
};
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
|
|
||||||
public struct InternetConnectionOption
|
|
||||||
{
|
|
||||||
static readonly int Size;
|
|
||||||
public PerConnOption m_Option;
|
|
||||||
public InternetConnectionOptionValue m_Value;
|
|
||||||
static InternetConnectionOption()
|
|
||||||
{
|
|
||||||
InternetConnectionOption.Size = Marshal.SizeOf(typeof(InternetConnectionOption));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nested Types
|
|
||||||
[StructLayout(LayoutKind.Explicit)]
|
|
||||||
public struct InternetConnectionOptionValue
|
|
||||||
{
|
|
||||||
// Fields
|
|
||||||
[FieldOffset(0)]
|
|
||||||
public System.Runtime.InteropServices.ComTypes.FILETIME m_FileTime;
|
|
||||||
[FieldOffset(0)]
|
|
||||||
public int m_Int;
|
|
||||||
[FieldOffset(0)]
|
|
||||||
public IntPtr m_StringPtr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region WinInet enums
|
|
||||||
//
|
|
||||||
// options manifests for Internet{Query|Set}Option
|
|
||||||
//
|
|
||||||
public enum InternetOption : uint
|
|
||||||
{
|
|
||||||
INTERNET_OPTION_PER_CONNECTION_OPTION = 75
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Options used in INTERNET_PER_CONN_OPTON struct
|
|
||||||
//
|
|
||||||
public enum PerConnOption
|
|
||||||
{
|
|
||||||
INTERNET_PER_CONN_FLAGS = 1, // Sets or retrieves the connection type. The Value member will contain one or more of the values from PerConnFlags
|
|
||||||
INTERNET_PER_CONN_PROXY_SERVER = 2, // Sets or retrieves a string containing the proxy servers.
|
|
||||||
INTERNET_PER_CONN_PROXY_BYPASS = 3, // Sets or retrieves a string containing the URLs that do not use the proxy server.
|
|
||||||
INTERNET_PER_CONN_AUTOCONFIG_URL = 4//, // Sets or retrieves a string containing the URL to the automatic configuration script.
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// PER_CONN_FLAGS
|
|
||||||
//
|
|
||||||
[Flags]
|
|
||||||
public enum PerConnFlags
|
|
||||||
{
|
|
||||||
PROXY_TYPE_DIRECT = 0x00000001, // direct to net
|
|
||||||
PROXY_TYPE_PROXY = 0x00000002, // via named proxy
|
|
||||||
PROXY_TYPE_AUTO_PROXY_URL = 0x00000004, // autoproxy URL
|
|
||||||
PROXY_TYPE_AUTO_DETECT = 0x00000008 // use autoproxy detection
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
internal static class NativeMethods
|
|
||||||
{
|
|
||||||
[DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)]
|
|
||||||
[return: MarshalAs(UnmanagedType.Bool)]
|
|
||||||
public static extern bool InternetSetOption(IntPtr hInternet, InternetOption dwOption, IntPtr lpBuffer, int dwBufferLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
//判断是否使用代理
|
|
||||||
public static bool UsedProxy()
|
|
||||||
{
|
|
||||||
RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true);
|
|
||||||
if (rk.GetValue("ProxyEnable").ToString() == "1")
|
|
||||||
{
|
|
||||||
rk.Close();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rk.Close();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//获得代理的IP和端口
|
|
||||||
public static string GetProxyProxyServer()
|
|
||||||
{
|
|
||||||
RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true);
|
|
||||||
string ProxyServer = rk.GetValue("ProxyServer").ToString();
|
|
||||||
rk.Close();
|
|
||||||
return ProxyServer;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,185 +0,0 @@
|
||||||
using Newtonsoft.Json;
|
|
||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
|
||||||
using System.Text;
|
|
||||||
using v2rayN.Base;
|
|
||||||
using v2rayN.Mode;
|
|
||||||
using v2rayN.Properties;
|
|
||||||
using v2rayN.Tool;
|
|
||||||
|
|
||||||
namespace v2rayN.HttpProxyHandler
|
|
||||||
{
|
|
||||||
class SysProxyHandle
|
|
||||||
{
|
|
||||||
private const string _userWininetConfigFile = "user-wininet.json";
|
|
||||||
|
|
||||||
private static string _queryStr;
|
|
||||||
|
|
||||||
// In general, this won't change
|
|
||||||
// format:
|
|
||||||
// <flags><CR-LF>
|
|
||||||
// <proxy-server><CR-LF>
|
|
||||||
// <bypass-list><CR-LF>
|
|
||||||
// <pac-url>
|
|
||||||
private static SysproxyConfig _userSettings = null;
|
|
||||||
|
|
||||||
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()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
FileManager.UncompressFile(Utils.GetTempPath("sysproxy.exe"),
|
|
||||||
Environment.Is64BitOperatingSystem ? Resources.sysproxy64_exe : Resources.sysproxy_exe);
|
|
||||||
}
|
|
||||||
catch (IOException ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void SetIEProxy(bool enable, bool global, string proxyServer, string pacURL)
|
|
||||||
{
|
|
||||||
//Read();
|
|
||||||
|
|
||||||
//if (!_userSettings.UserSettingsRecorded)
|
|
||||||
//{
|
|
||||||
// // record user settings
|
|
||||||
// ExecSysproxy("query");
|
|
||||||
// ParseQueryStr(_queryStr);
|
|
||||||
//}
|
|
||||||
|
|
||||||
string arguments;
|
|
||||||
if (enable)
|
|
||||||
{
|
|
||||||
arguments = global
|
|
||||||
? string.Format(
|
|
||||||
//"global {0} <local>;localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;172.32.*;192.168.*",
|
|
||||||
"global {0} <local>;localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;172.32.*",
|
|
||||||
proxyServer)
|
|
||||||
: string.Format("pac {0}", pacURL);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// restore user settings
|
|
||||||
//var flags = _userSettings.Flags;
|
|
||||||
//var proxy_server = _userSettings.ProxyServer ?? "-";
|
|
||||||
//var bypass_list = _userSettings.BypassList ?? "-";
|
|
||||||
//var pac_url = _userSettings.PacUrl ?? "-";
|
|
||||||
////arguments = string.Format("set {0} {1} {2} {3}", flags, proxy_server, bypass_list, pac_url);
|
|
||||||
//set null settings
|
|
||||||
arguments = string.Format("set {0} {1} {2} {3}", 1, "-", "<local>", @"http://127.0.0.1");
|
|
||||||
|
|
||||||
// have to get new settings
|
|
||||||
//_userSettings.UserSettingsRecorded = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Save();
|
|
||||||
ExecSysproxy(arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ExecSysproxy(string arguments)
|
|
||||||
{
|
|
||||||
using (var process = new Process())
|
|
||||||
{
|
|
||||||
// Configure the process using the StartInfo properties.
|
|
||||||
process.StartInfo.FileName = Utils.GetTempPath("sysproxy.exe");
|
|
||||||
process.StartInfo.Arguments = arguments;
|
|
||||||
process.StartInfo.WorkingDirectory = Utils.GetTempPath();
|
|
||||||
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
|
|
||||||
process.StartInfo.UseShellExecute = false;
|
|
||||||
process.StartInfo.RedirectStandardError = true;
|
|
||||||
process.StartInfo.RedirectStandardOutput = true;
|
|
||||||
|
|
||||||
// Need to provide encoding info, or output/error strings we got will be wrong.
|
|
||||||
process.StartInfo.StandardOutputEncoding = Encoding.Unicode;
|
|
||||||
process.StartInfo.StandardErrorEncoding = Encoding.Unicode;
|
|
||||||
|
|
||||||
process.StartInfo.CreateNoWindow = true;
|
|
||||||
process.Start();
|
|
||||||
|
|
||||||
var stderr = process.StandardError.ReadToEnd();
|
|
||||||
var stdout = process.StandardOutput.ReadToEnd();
|
|
||||||
|
|
||||||
process.WaitForExit();
|
|
||||||
|
|
||||||
var exitCode = process.ExitCode;
|
|
||||||
if (exitCode != (int)RET_ERRORS.RET_NO_ERROR)
|
|
||||||
{
|
|
||||||
throw new Exception(stderr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arguments == "query")
|
|
||||||
{
|
|
||||||
if (stdout.IsNullOrWhiteSpace() || stdout.IsNullOrEmpty())
|
|
||||||
{
|
|
||||||
// we cannot get user settings
|
|
||||||
throw new Exception("failed to query wininet settings");
|
|
||||||
}
|
|
||||||
_queryStr = stdout;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void Save()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using (StreamWriter sw = new StreamWriter(File.Open(Utils.GetPath(_userWininetConfigFile), FileMode.Create)))
|
|
||||||
{
|
|
||||||
string jsonString = JsonConvert.SerializeObject(_userSettings, Formatting.Indented);
|
|
||||||
sw.Write(jsonString);
|
|
||||||
sw.Flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (IOException ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void Read()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
string configContent = File.ReadAllText(Utils.GetPath(_userWininetConfigFile));
|
|
||||||
_userSettings = JsonConvert.DeserializeObject<SysproxyConfig>(configContent);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
// Suppress all exceptions. finally block will initialize new user config settings.
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (_userSettings == null) _userSettings = new SysproxyConfig();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ParseQueryStr(string str)
|
|
||||||
{
|
|
||||||
string[] userSettingsArr = str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
|
|
||||||
_userSettings.Flags = userSettingsArr[0];
|
|
||||||
|
|
||||||
// handle output from WinINET
|
|
||||||
if (userSettingsArr[1] == "(null)") _userSettings.ProxyServer = null;
|
|
||||||
else _userSettings.ProxyServer = userSettingsArr[1];
|
|
||||||
if (userSettingsArr[2] == "(null)") _userSettings.BypassList = null;
|
|
||||||
else _userSettings.BypassList = userSettingsArr[2];
|
|
||||||
if (userSettingsArr[3] == "(null)") _userSettings.PacUrl = null;
|
|
||||||
else _userSettings.PacUrl = userSettingsArr[3];
|
|
||||||
|
|
||||||
_userSettings.UserSettingsRecorded = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue