@@ -13,6 +13,7 @@ namespace shadowsocks_csharp | |||||
Local local; | Local local; | ||||
PACServer pacServer; | PACServer pacServer; | ||||
Config config; | Config config; | ||||
PolipoRunner polipoRunner; | |||||
public Form1() | public Form1() | ||||
{ | { | ||||
@@ -55,9 +56,18 @@ namespace shadowsocks_csharp | |||||
if (local != null) | if (local != null) | ||||
{ | { | ||||
local.Stop(); | local.Stop(); | ||||
if (polipoRunner != null) | |||||
{ | |||||
polipoRunner.Stop(); | |||||
} | |||||
} | } | ||||
local = new Local(config); | local = new Local(config); | ||||
local.Start(); | local.Start(); | ||||
if (polipoRunner == null) | |||||
{ | |||||
polipoRunner = new PolipoRunner(); | |||||
} | |||||
polipoRunner.Start(config); | |||||
} | } | ||||
@@ -108,6 +118,7 @@ namespace shadowsocks_csharp | |||||
private void Form1_FormClosed(object sender, FormClosedEventArgs e) | private void Form1_FormClosed(object sender, FormClosedEventArgs e) | ||||
{ | { | ||||
if (local != null) local.Stop(); | if (local != null) local.Stop(); | ||||
if (polipoRunner != null) polipoRunner.Stop(); | |||||
} | } | ||||
private void aboutToolStripMenuItem_Click(object sender, EventArgs e) | private void aboutToolStripMenuItem_Click(object sender, EventArgs e) | ||||
@@ -0,0 +1,65 @@ | |||||
using shadowsocks_csharp.Properties; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Diagnostics; | |||||
using System.IO; | |||||
using System.Text; | |||||
namespace shadowsocks_csharp | |||||
{ | |||||
class PolipoRunner | |||||
{ | |||||
private Process process; | |||||
private bool ByteArrayToFile(string fileName, byte[] content) | |||||
{ | |||||
try | |||||
{ | |||||
System.IO.FileStream _FileStream = | |||||
new System.IO.FileStream(fileName, System.IO.FileMode.Create, | |||||
System.IO.FileAccess.Write); | |||||
_FileStream.Write(content, 0, content.Length); | |||||
_FileStream.Close(); | |||||
return true; | |||||
} | |||||
catch (Exception _Exception) | |||||
{ | |||||
Console.WriteLine("Exception caught in process: {0}", | |||||
_Exception.ToString()); | |||||
} | |||||
return false; | |||||
} | |||||
public void Start(Config config) | |||||
{ | |||||
if (process == null) | |||||
{ | |||||
string temppath = Path.GetTempPath(); | |||||
string polipoConfig = Resources.polipo_config; | |||||
polipoConfig = polipoConfig.Replace("__SOCKS_PORT__", config.local_port.ToString()); | |||||
ByteArrayToFile(temppath + "/polipo.conf", System.Text.Encoding.UTF8.GetBytes(polipoConfig)); | |||||
ByteArrayToFile(temppath + "/polipo.exe", Resources.polipo); | |||||
process = new Process(); | |||||
// Configure the process using the StartInfo properties. | |||||
process.StartInfo.FileName = temppath + "/polipo.exe"; | |||||
process.StartInfo.Arguments = "-c \"" + temppath + "/polipo.conf\""; | |||||
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; | |||||
process.StartInfo.UseShellExecute = false; | |||||
process.StartInfo.CreateNoWindow = true; | |||||
process.StartInfo.RedirectStandardOutput = true; | |||||
process.StartInfo.RedirectStandardError = true; | |||||
//process.StandardOutput | |||||
process.Start(); | |||||
} | |||||
} | |||||
public void Stop() | |||||
{ | |||||
if (process != null) | |||||
{ | |||||
process.Kill(); | |||||
process.WaitForExit(); | |||||
process = null; | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,42 @@ | |||||
using Microsoft.Win32; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Runtime.InteropServices; | |||||
using System.Text; | |||||
namespace shadowsocks_csharp | |||||
{ | |||||
class SystemProxy | |||||
{ | |||||
[DllImport("wininet.dll")] | |||||
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength); | |||||
public const int INTERNET_OPTION_SETTINGS_CHANGED = 39; | |||||
public const int INTERNET_OPTION_REFRESH = 37; | |||||
static bool settingsReturn, refreshReturn; | |||||
public void Enable() | |||||
{ | |||||
RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); | |||||
registry.SetValue("ProxyEnable", 1); | |||||
registry.SetValue("ProxyServer", "127.0.0.1:8123"); | |||||
// These lines implement the Interface in the beginning of program | |||||
// They cause the OS to refresh the settings, causing IP to realy update | |||||
settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0); | |||||
refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); | |||||
} | |||||
public void Disable() | |||||
{ | |||||
RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); | |||||
registry.SetValue("ProxyEnable", 0); | |||||
registry.SetValue("ProxyServer", ""); | |||||
// These lines implement the Interface in the beginning of program | |||||
// They cause the OS to refresh the settings, causing IP to realy update | |||||
settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0); | |||||
refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); | |||||
} | |||||
} | |||||
} |
@@ -38,7 +38,7 @@ | |||||
# Uncomment this if you want to use a parent SOCKS proxy: | # Uncomment this if you want to use a parent SOCKS proxy: | ||||
socksParentProxy = "127.0.0.1:1080" | |||||
socksParentProxy = "127.0.0.1:__SOCKS_PORT__" | |||||
socksProxyType = socks5 | socksProxyType = socks5 | ||||
# Uncomment this if you want to scrub private information from the log: | # Uncomment this if you want to scrub private information from the log: | ||||
@@ -96,6 +96,7 @@ | |||||
<DependentUpon>Form1.cs</DependentUpon> | <DependentUpon>Form1.cs</DependentUpon> | ||||
</Compile> | </Compile> | ||||
<Compile Include="Local.cs" /> | <Compile Include="Local.cs" /> | ||||
<Compile Include="PolipoRunner.cs" /> | |||||
<Compile Include="Program.cs" /> | <Compile Include="Program.cs" /> | ||||
<Compile Include="Properties\AssemblyInfo.cs" /> | <Compile Include="Properties\AssemblyInfo.cs" /> | ||||
<EmbeddedResource Include="Form1.resx"> | <EmbeddedResource Include="Form1.resx"> | ||||