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 @@ +