diff --git a/shadowsocks-csharp/Controller/Service/PolipoRunner.cs b/shadowsocks-csharp/Controller/Service/PolipoRunner.cs
index ae0b46f1..261436be 100644
--- a/shadowsocks-csharp/Controller/Service/PolipoRunner.cs
+++ b/shadowsocks-csharp/Controller/Service/PolipoRunner.cs
@@ -8,6 +8,7 @@ using System.IO.Compression;
using System.Text;
using System.Net.NetworkInformation;
using System.Net;
+using System.Runtime.InteropServices;
namespace Shadowsocks.Controller
{
@@ -22,7 +23,8 @@ namespace Shadowsocks.Controller
temppath = Path.GetTempPath();
try
{
- FileManager.UncompressFile(temppath + "/ss_polipo.exe", Resources.polipo_exe);
+ FileManager.UncompressFile(temppath + "/ss_privoxy.exe", Resources.privoxy_exe);
+ FileManager.UncompressFile(temppath + "/mgwz.dll", Resources.mgwz_dll);
}
catch (IOException e)
{
@@ -43,7 +45,7 @@ namespace Shadowsocks.Controller
Server server = configuration.GetCurrentServer();
if (_process == null)
{
- Process[] existingPolipo = Process.GetProcessesByName("ss_polipo");
+ Process[] existingPolipo = Process.GetProcessesByName("ss_privoxy");
foreach (Process p in existingPolipo)
{
try
@@ -56,17 +58,17 @@ namespace Shadowsocks.Controller
Console.WriteLine(e.ToString());
}
}
- string polipoConfig = Resources.polipo_config;
+ string polipoConfig = Resources.privoxy_conf;
_runningPort = this.GetFreePort();
polipoConfig = polipoConfig.Replace("__SOCKS_PORT__", configuration.localPort.ToString());
polipoConfig = polipoConfig.Replace("__POLIPO_BIND_PORT__", _runningPort.ToString());
polipoConfig = polipoConfig.Replace("__POLIPO_BIND_IP__", configuration.shareOverLan ? "0.0.0.0" : "127.0.0.1");
- FileManager.ByteArrayToFile(temppath + "/polipo.conf", System.Text.Encoding.UTF8.GetBytes(polipoConfig));
+ FileManager.ByteArrayToFile(temppath + "/privoxy.conf", System.Text.Encoding.UTF8.GetBytes(polipoConfig));
_process = new Process();
// Configure the process using the StartInfo properties.
- _process.StartInfo.FileName = temppath + "/ss_polipo.exe";
- _process.StartInfo.Arguments = "-c \"" + temppath + "/polipo.conf\"";
+ _process.StartInfo.FileName = temppath + "/ss_privoxy.exe";
+ _process.StartInfo.Arguments = " \"" + temppath + "/privoxy.conf\"";
_process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
_process.StartInfo.UseShellExecute = true;
_process.StartInfo.CreateNoWindow = true;
@@ -74,6 +76,7 @@ namespace Shadowsocks.Controller
//_process.StartInfo.RedirectStandardError = true;
_process.Start();
}
+ RefreshTrayArea();
}
public void Stop()
@@ -91,6 +94,7 @@ namespace Shadowsocks.Controller
}
_process = null;
}
+ RefreshTrayArea();
}
private int GetFreePort()
@@ -122,5 +126,50 @@ namespace Shadowsocks.Controller
}
throw new Exception("No free port found.");
}
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct RECT
+ {
+ public int left;
+ public int top;
+ public int right;
+ public int bottom;
+ }
+ [DllImport("user32.dll")]
+ public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
+ [DllImport("user32.dll")]
+ public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
+ [DllImport("user32.dll")]
+ public static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);
+ [DllImport("user32.dll")]
+ public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
+
+
+ public void RefreshTrayArea()
+ {
+ IntPtr systemTrayContainerHandle = FindWindow("Shell_TrayWnd", null);
+ IntPtr systemTrayHandle = FindWindowEx(systemTrayContainerHandle, IntPtr.Zero, "TrayNotifyWnd", null);
+ IntPtr sysPagerHandle = FindWindowEx(systemTrayHandle, IntPtr.Zero, "SysPager", null);
+ IntPtr notificationAreaHandle = FindWindowEx(sysPagerHandle, IntPtr.Zero, "ToolbarWindow32", "Notification Area");
+ if (notificationAreaHandle == IntPtr.Zero)
+ {
+ notificationAreaHandle = FindWindowEx(sysPagerHandle, IntPtr.Zero, "ToolbarWindow32", "User Promoted Notification Area");
+ IntPtr notifyIconOverflowWindowHandle = FindWindow("NotifyIconOverflowWindow", null);
+ IntPtr overflowNotificationAreaHandle = FindWindowEx(notifyIconOverflowWindowHandle, IntPtr.Zero, "ToolbarWindow32", "Overflow Notification Area");
+ RefreshTrayArea(overflowNotificationAreaHandle);
+ }
+ RefreshTrayArea(notificationAreaHandle);
+ }
+
+
+ private static void RefreshTrayArea(IntPtr windowHandle)
+ {
+ const uint wmMousemove = 0x0200;
+ RECT rect;
+ GetClientRect(windowHandle, out rect);
+ for (var x = 0; x < rect.right; x += 5)
+ for (var y = 0; y < rect.bottom; y += 5)
+ SendMessage(windowHandle, wmMousemove, 0, (y << 16) + x);
+ }
}
}
diff --git a/shadowsocks-csharp/Data/mgwz.dll.gz b/shadowsocks-csharp/Data/mgwz.dll.gz
new file mode 100644
index 00000000..139725f3
Binary files /dev/null and b/shadowsocks-csharp/Data/mgwz.dll.gz differ
diff --git a/shadowsocks-csharp/Data/polipo.exe.gz b/shadowsocks-csharp/Data/polipo.exe.gz
index c7038e12..486b50e4 100755
Binary files a/shadowsocks-csharp/Data/polipo.exe.gz and b/shadowsocks-csharp/Data/polipo.exe.gz differ
diff --git a/shadowsocks-csharp/Data/privoxy.exe.gz b/shadowsocks-csharp/Data/privoxy.exe.gz
new file mode 100644
index 00000000..c9c7a303
Binary files /dev/null and b/shadowsocks-csharp/Data/privoxy.exe.gz differ
diff --git a/shadowsocks-csharp/Data/privoxy_conf.txt b/shadowsocks-csharp/Data/privoxy_conf.txt
new file mode 100644
index 00000000..104b9626
--- /dev/null
+++ b/shadowsocks-csharp/Data/privoxy_conf.txt
@@ -0,0 +1,5 @@
+listen-address __POLIPO_BIND_IP__:8123
+show-on-task-bar 0
+activity-animation 0
+forward-socks5 / 127.0.0.1:__SOCKS_PORT__ .
+hide-console
\ No newline at end of file
diff --git a/shadowsocks-csharp/Properties/Resources.Designer.cs b/shadowsocks-csharp/Properties/Resources.Designer.cs
index 778e7b98..4e417f58 100644
--- a/shadowsocks-csharp/Properties/Resources.Designer.cs
+++ b/shadowsocks-csharp/Properties/Resources.Designer.cs
@@ -112,6 +112,16 @@ namespace Shadowsocks.Properties {
}
}
+ ///
+ /// Looks up a localized resource of type System.Byte[].
+ ///
+ internal static byte[] mgwz_dll {
+ get {
+ object obj = ResourceManager.GetObject("mgwz_dll", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
///
/// Looks up a localized string similar to proxyAddress = "__POLIPO_BIND_IP__"
///proxyPort = 8123
@@ -140,6 +150,26 @@ namespace Shadowsocks.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to listen-address __POLIPO_BIND_IP__:8123
+ ///.
+ ///
+ internal static string privoxy_conf {
+ get {
+ return ResourceManager.GetString("privoxy_conf", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Byte[].
+ ///
+ internal static byte[] privoxy_exe {
+ get {
+ object obj = ResourceManager.GetObject("privoxy_exe", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
///
/// Looks up a localized resource of type System.Byte[].
///
diff --git a/shadowsocks-csharp/Properties/Resources.resx b/shadowsocks-csharp/Properties/Resources.resx
index aa851e6b..c11207dc 100755
--- a/shadowsocks-csharp/Properties/Resources.resx
+++ b/shadowsocks-csharp/Properties/Resources.resx
@@ -112,12 +112,12 @@
2.0
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
+
..\Data\abp.js.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
@@ -127,12 +127,21 @@
..\data\libsscrypto.dll.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ ..\data\mgwz.dll.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
..\Data\polipo_config.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312
..\Data\polipo.exe.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ ..\data\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8
+
+
+ ..\data\privoxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
..\Data\proxy.pac.txt.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj
index 4a4b6db7..ffdcd0e0 100644
--- a/shadowsocks-csharp/shadowsocks-csharp.csproj
+++ b/shadowsocks-csharp/shadowsocks-csharp.csproj
@@ -205,7 +205,9 @@
+
+
@@ -214,6 +216,7 @@
+