/// <summary> /// Set the system proxy, as per the 'Internet Options' panel /// </summary> /// <returns>True if the operation was successful</returns> public static bool SetProxy(bool ProxyEnable, string ProxyServer, string ProxyBypass) { var options = new INTERNET_PER_CONN_OPTION[3]; // Option #1: ProxyEnable options[0].dwOption = INTERNET_PER_CONN.FLAGS; options[0].Value.i = (int) (ProxyEnable ? (PER_CONN_FLAGS.PROXY_TYPE_DIRECT | PER_CONN_FLAGS.PROXY_TYPE_PROXY) : PER_CONN_FLAGS.PROXY_TYPE_DIRECT); // Option #2: ProxyServer options[1].dwOption = INTERNET_PER_CONN.PROXY_SERVER; options[1].Value.iptr = Marshal.StringToHGlobalAuto( ProxyServer); // Option #3: ProxyBypass options[2].dwOption = INTERNET_PER_CONN.PROXY_BYPASS; options[2].Value.iptr = Marshal.StringToHGlobalAuto( ProxyBypass); var list = new INTERNET_PER_CONN_OPTION_LIST(); list.dwSize = Marshal.SizeOf(list); list.pszConnection = IntPtr.Zero; // change globally list.dwOptionCount = options.Length; list.dwOptionError = 0; // Marshall each option in options int optSize = Marshal.SizeOf(typeof(INTERNET_PER_CONN_OPTION)); IntPtr optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length); for (int i = 0; i < options.Length; ++i) { var opt = new IntPtr(optionsPtr.ToInt32() + (i * optSize)); Marshal.StructureToPtr(options[i], opt, false); } list.pOptions = optionsPtr; // and then make a pointer out of the whole list IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize); Marshal.StructureToPtr(list, ipcoListPtr, false); // Finally, call the InternetSetOption API int res = InternetSetOption(IntPtr.Zero, INTERNET_OPTION.PER_CONNECTION_OPTION, ipcoListPtr, list.dwSize) ? -1 : 0; if (res == 0) res = Marshal.GetLastWin32Error(); Marshal.FreeCoTaskMem(optionsPtr); Marshal.FreeCoTaskMem(ipcoListPtr); if (res > 0) throw new Win32Exception(Marshal.GetLastWin32Error()); return (res < 0); }
/// <summary> /// Backup the current options for LAN connection. /// Make sure free the memory after restoration. /// </summary> private static INTERNET_PER_CONN_OPTION_LIST GetSystemProxy() { // Query following options. INTERNET_PER_CONN_OPTION[] Options = new INTERNET_PER_CONN_OPTION[3]; Options[0] = new INTERNET_PER_CONN_OPTION(); Options[0].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS; Options[1] = new INTERNET_PER_CONN_OPTION(); Options[1].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_SERVER; Options[2] = new INTERNET_PER_CONN_OPTION(); Options[2].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_BYPASS; // Allocate a block of memory of the options. System.IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0]) + Marshal.SizeOf(Options[1]) + Marshal.SizeOf(Options[2])); System.IntPtr current = (System.IntPtr)buffer; // Marshal data from a managed object to an unmanaged block of memory. for (int i = 0; i < Options.Length; i++) { Marshal.StructureToPtr(Options[i], current, false); current = (System.IntPtr)((int)current + Marshal.SizeOf(Options[i])); } // Initialize a INTERNET_PER_CONN_OPTION_LIST instance. INTERNET_PER_CONN_OPTION_LIST Request = new INTERNET_PER_CONN_OPTION_LIST(); // Point to the allocated memory. Request.pOptions = buffer; Request.Size = Marshal.SizeOf(Request); // IntPtr.Zero means LAN connection. Request.Connection = IntPtr.Zero; Request.OptionCount = Options.Length; Request.OptionError = 0; int size = Marshal.SizeOf(Request); // Query internet options. bool result = InternetQueryOptionList(IntPtr.Zero, INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION, ref Request, ref size); if (!result) { throw new ApplicationException(" Set Internet Option Failed! "); } return Request; }
private static bool ProxyEnable(WebProxy wProxy) { try { bool bReturn = true; string sPrx = wProxy.Address.DnsSafeHost + ":" + wProxy.Address.Port; INTERNET_PER_CONN_OPTION_LIST list = new INTERNET_PER_CONN_OPTION_LIST(); int dwBufSize = Marshal.SizeOf(list); INTERNET_PER_CONN_OPTION[] opts = new INTERNET_PER_CONN_OPTION[3]; int opt_size = Marshal.SizeOf(opts[0]); list.dwSize = dwBufSize; list.pszConnection = String.Empty; list.dwOptionCount = 3; //set flags opts[0].dwOption = (int)MyOptions.INTERNET_PER_CONN_FLAGS; //opts[0].dwValue = (int)(Options.PROXY_TYPE_DIRECT | Options.PROXY_TYPE_PROXY); //opts[0].dwValue = (int)(MyOptions.PROXY_TYPE_DIRECT | MyOptions.PROXY_TYPE_PROXY); opts[0].dwValue = (int)(Flags.PROXY_TYPE_PROXY); //set proxyname opts[1].dwOption = (int)MyOptions.INTERNET_PER_CONN_PROXY_SERVER; //opts[1].pszValue = Marshal.StringToHGlobalAnsi("http://" + sPrx); opts[1].pszValue = Marshal.StringToHGlobalAnsi(sPrx); //opts[1].pszValue = Marshal.StringToCoTaskMemAnsi("http=http://" + sPrx + "; ftp=ftp://" + sPrx + "; https=https://" + sPrx + "; gopher=gopher://" + sPrx + "; socks=socks://" + sPrx); //set override opts[2].dwOption = (int)MyOptions.INTERNET_PER_CONN_PROXY_BYPASS; opts[2].pszValue = Marshal.StringToHGlobalAnsi("localhost"); //opts[2].pszValue = Marshal.StringToCoTaskMemAnsi("<local>localhost; rado.ra-host.com"); byte[] b = new byte[3 * opt_size]; opts[0].GetBytes().CopyTo(b, 0); opts[1].GetBytes().CopyTo(b, opt_size); opts[2].GetBytes().CopyTo(b, 2 * opt_size); IntPtr ptr = Marshal.AllocCoTaskMem(3 * opt_size); Marshal.Copy(b, 0, ptr, 3 * opt_size); list.pOptions = ptr; //set the options on the connection bReturn = InternetSetOption(IntPtr.Zero, (int)MyOptions.INTERNET_OPTION_PER_CONNECTION_OPTION, list, dwBufSize); if (!bReturn) { Console.WriteLine(GetLastError()); } //Flush the current IE proxy setting bReturn = InternetSetOption(IntPtr.Zero, (int)MyOptions.INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); if (!bReturn) { Console.WriteLine(GetLastError()); } Marshal.FreeHGlobal(opts[1].pszValue); Marshal.FreeHGlobal(opts[2].pszValue); Marshal.FreeCoTaskMem(ptr); return bReturn; } catch (Exception) { throw; } }
internal bool SetToWinINET(string sConnectionName) { try { INTERNET_PER_CONN_OPTION_LIST structure = new INTERNET_PER_CONN_OPTION_LIST(); INTERNET_PER_CONN_OPTION[] internet_per_conn_optionArray = new INTERNET_PER_CONN_OPTION[5]; if (sConnectionName == "DefaultLAN") { sConnectionName = null; } structure.Connection = sConnectionName; structure.OptionCount = internet_per_conn_optionArray.Length; structure.OptionError = 0; int num = 0; if (this._bDirect) { num |= 1; } if (this._bAutoDetect) { num |= 8; } if (this._bAutoDetectWasUserSet) { num |= 8; } if (this._bUseConfigScript) { num |= 4; } if (this._bProxiesSpecified) { num |= 2; } internet_per_conn_optionArray[0] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[0].dwOption = 1; internet_per_conn_optionArray[0].Value.dwValue = num; internet_per_conn_optionArray[1] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[1].dwOption = 2; internet_per_conn_optionArray[1].Value.pszValue = Marshal.StringToHGlobalAnsi(this.CalculateProxyString()); internet_per_conn_optionArray[2] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[2].dwOption = 3; internet_per_conn_optionArray[2].Value.pszValue = Marshal.StringToHGlobalAnsi(this._sHostsThatBypass); internet_per_conn_optionArray[3] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[3].dwOption = 4; internet_per_conn_optionArray[3].Value.pszValue = Marshal.StringToHGlobalAnsi(this._sScriptURL); internet_per_conn_optionArray[4] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[4].dwOption = 5; internet_per_conn_optionArray[4].Value.dwValue = 0; if (this._bAutoDetectWasUserSet) { internet_per_conn_optionArray[4].Value.dwValue = 1; } int cb = 0; for (int i = 0; i < internet_per_conn_optionArray.Length; i++) { cb += Marshal.SizeOf(internet_per_conn_optionArray[i]); } IntPtr ptr = Marshal.AllocCoTaskMem(cb); IntPtr ptr2 = ptr; for (int j = 0; j < internet_per_conn_optionArray.Length; j++) { Marshal.StructureToPtr(internet_per_conn_optionArray[j], ptr2, false); ptr2 = (IntPtr) (((long) ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[j])); } structure.pOptions = ptr; structure.Size = Marshal.SizeOf(structure); int size = structure.Size; bool flag = InternetSetOptionList(IntPtr.Zero, 0x4b, ref structure, size); int num6 = Marshal.GetLastWin32Error(); if (flag) { InternetSetOption(IntPtr.Zero, 0x5f, IntPtr.Zero, 0); } else { Trace.WriteLine("[Fiddler] SetProxy failed. WinINET Error #" + num6.ToString("x")); } Marshal.FreeHGlobal(internet_per_conn_optionArray[0].Value.pszValue); Marshal.FreeHGlobal(internet_per_conn_optionArray[1].Value.pszValue); Marshal.FreeHGlobal(internet_per_conn_optionArray[2].Value.pszValue); Marshal.FreeCoTaskMem(ptr); return flag; } catch (Exception exception) { Trace.WriteLine("[Fiddler] SetProxy failed. " + exception.Message); return false; } }
/// <summary> /// Set the proxy server for LAN connection. /// </summary> public static bool SetConnectionProxy(string proxyServer) { IntPtr hInternet = InternetOpen(applicationName, INTERNET_OPEN_TYPE_DIRECT, null, null, 0); //// Create 3 options. //INTERNET_PER_CONN_OPTION[] Options = new INTERNET_PER_CONN_OPTION[3]; // Create 2 options. INTERNET_PER_CONN_OPTION[] Options; // Set PROXY flags. System.IntPtr buffer; if (string.IsNullOrEmpty(proxyServer)) { Options = new INTERNET_PER_CONN_OPTION[1]; Options[0] = new INTERNET_PER_CONN_OPTION(); Options[0].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS; Options[0].Value.dwValue = (int)INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_DIRECT; buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0])); } else { Options= new INTERNET_PER_CONN_OPTION[2]; Options[0] = new INTERNET_PER_CONN_OPTION(); Options[0].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS; Options[0].Value.dwValue = (int)INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_PROXY; // Set proxy name. Options[1] = new INTERNET_PER_CONN_OPTION(); Options[1].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_SERVER; Options[1].Value.pszValue = Marshal.StringToHGlobalAnsi(proxyServer); buffer=Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0]) + Marshal.SizeOf(Options[1])); } //// Set proxy bypass. //Options[2] = new INTERNET_PER_CONN_OPTION(); //Options[2].dwOption = // (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_BYPASS; //Options[2].Value.pszValue = Marshal.StringToHGlobalAnsi("local"); //// Allocate a block of memory of the options. //System.IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0]) // + Marshal.SizeOf(Options[1]) + Marshal.SizeOf(Options[2])); // Allocate a block of memory of the options. System.IntPtr current = buffer; // Marshal data from a managed object to an unmanaged block of memory. for (int i = 0; i < Options.Length; i++) { Marshal.StructureToPtr(Options[i], current, false); current = (System.IntPtr)((int)current + Marshal.SizeOf(Options[i])); } // Initialize a INTERNET_PER_CONN_OPTION_LIST instance. INTERNET_PER_CONN_OPTION_LIST option_list = new INTERNET_PER_CONN_OPTION_LIST(); // Point to the allocated memory. option_list.pOptions = buffer; // Return the unmanaged size of an object in bytes. option_list.Size = Marshal.SizeOf(option_list); // IntPtr.Zero means LAN connection. option_list.Connection = IntPtr.Zero; option_list.OptionCount = Options.Length; option_list.OptionError = 0; int size = Marshal.SizeOf(option_list); // Allocate memory for the INTERNET_PER_CONN_OPTION_LIST instance. IntPtr intptrStruct = Marshal.AllocCoTaskMem(size); // Marshal data from a managed object to an unmanaged block of memory. Marshal.StructureToPtr(option_list, intptrStruct, true); // Set internet settings. bool bReturn = InternetSetOption(hInternet, INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION, intptrStruct, size); // Free the allocated memory. Marshal.FreeCoTaskMem(buffer); Marshal.FreeCoTaskMem(intptrStruct); InternetCloseHandle(hInternet); // Throw an exception if this operation failed. if (!bReturn) { throw new ApplicationException(" Set Internet Option Failed!"); } return bReturn; }
public bool GetFromWinINET(string sConnectionName) { this.Clear(); try { INTERNET_PER_CONN_OPTION_LIST structure = new INTERNET_PER_CONN_OPTION_LIST(); INTERNET_PER_CONN_OPTION[] internet_per_conn_optionArray = new INTERNET_PER_CONN_OPTION[5]; if (sConnectionName == "DefaultLAN") { sConnectionName = null; } structure.Connection = sConnectionName; structure.OptionCount = internet_per_conn_optionArray.Length; structure.OptionError = 0; internet_per_conn_optionArray[0] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[0].dwOption = 1; internet_per_conn_optionArray[1] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[1].dwOption = 2; internet_per_conn_optionArray[2] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[2].dwOption = 3; internet_per_conn_optionArray[3] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[3].dwOption = 4; internet_per_conn_optionArray[4] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[4].dwOption = 10; int cb = 0; for (int i = 0; i < internet_per_conn_optionArray.Length; i++) { cb += Marshal.SizeOf(internet_per_conn_optionArray[i]); } IntPtr ptr = Marshal.AllocCoTaskMem(cb); IntPtr ptr2 = ptr; for (int j = 0; j < internet_per_conn_optionArray.Length; j++) { Marshal.StructureToPtr(internet_per_conn_optionArray[j], ptr2, false); ptr2 = (IntPtr) (((long) ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[j])); } structure.pOptions = ptr; structure.Size = Marshal.SizeOf(structure); int size = structure.Size; bool flag = InternetQueryOptionList(IntPtr.Zero, 0x4b, ref structure, ref size); int num5 = Marshal.GetLastWin32Error(); if (!flag) { if (0x57 == num5) { internet_per_conn_optionArray[4].dwOption = 5; ptr2 = ptr; for (int k = 0; k < internet_per_conn_optionArray.Length; k++) { Marshal.StructureToPtr(internet_per_conn_optionArray[k], ptr2, false); ptr2 = (IntPtr) (((long) ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[k])); } structure.pOptions = ptr; structure.Size = Marshal.SizeOf(structure); size = structure.Size; flag = InternetQueryOptionList(IntPtr.Zero, 0x4b, ref structure, ref size); num5 = Marshal.GetLastWin32Error(); } if (!flag) { object[] args = new object[] { sConnectionName ?? "DefaultLAN", num5.ToString("x") }; FiddlerApplication.Log.LogFormat("Fiddler was unable to get information about the proxy for '{0}' [0x{1}].\n", args); } } if (flag) { ptr2 = ptr; for (int m = 0; m < internet_per_conn_optionArray.Length; m++) { Marshal.PtrToStructure(ptr2, internet_per_conn_optionArray[m]); ptr2 = (IntPtr) (((long) ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[m])); } this._bDirect = 1 == (internet_per_conn_optionArray[0].Value.dwValue & 1); this._bUseConfigScript = 4 == (internet_per_conn_optionArray[0].Value.dwValue & 4); this._bAutoDetect = 8 == (internet_per_conn_optionArray[0].Value.dwValue & 8); this._bProxiesSpecified = 2 == (internet_per_conn_optionArray[0].Value.dwValue & 2); if (internet_per_conn_optionArray[4].dwOption == 10) { this._bAutoDetectWasUserSet = 8 == (internet_per_conn_optionArray[4].Value.dwValue & 8); } else { this._bAutoDetectWasUserSet = this._bAutoDetect && (1 == (internet_per_conn_optionArray[4].Value.dwValue & 1)); } this._sScriptURL = Marshal.PtrToStringAnsi(internet_per_conn_optionArray[3].Value.pszValue); Utilities.GlobalFree(internet_per_conn_optionArray[3].Value.pszValue); if (internet_per_conn_optionArray[1].Value.pszValue != IntPtr.Zero) { string sProxyString = Marshal.PtrToStringAnsi(internet_per_conn_optionArray[1].Value.pszValue); Utilities.GlobalFree(internet_per_conn_optionArray[1].Value.pszValue); this.SetManualProxies(sProxyString); } if (internet_per_conn_optionArray[2].Value.pszValue != IntPtr.Zero) { this._sHostsThatBypass = Marshal.PtrToStringAnsi(internet_per_conn_optionArray[2].Value.pszValue); Utilities.GlobalFree(internet_per_conn_optionArray[2].Value.pszValue); } } Marshal.FreeCoTaskMem(ptr); return flag; } catch (Exception exception) { FiddlerApplication.ReportException(exception, "Unable to get proxy information for " + (sConnectionName ?? "DefaultLAN")); return false; } }
public bool GetFromWinINET(string sConnectionName) { this.Clear(); try { INTERNET_PER_CONN_OPTION_LIST structure = new INTERNET_PER_CONN_OPTION_LIST(); INTERNET_PER_CONN_OPTION[] internet_per_conn_optionArray = new INTERNET_PER_CONN_OPTION[5]; if (sConnectionName == "DefaultLAN") { sConnectionName = null; } structure.Connection = sConnectionName; structure.OptionCount = internet_per_conn_optionArray.Length; structure.OptionError = 0; internet_per_conn_optionArray[0] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[0].dwOption = 1; internet_per_conn_optionArray[1] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[1].dwOption = 2; internet_per_conn_optionArray[2] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[2].dwOption = 3; internet_per_conn_optionArray[3] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[3].dwOption = 4; internet_per_conn_optionArray[4] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[4].dwOption = 10; int cb = 0; for (int i = 0; i < internet_per_conn_optionArray.Length; i++) { cb += Marshal.SizeOf(internet_per_conn_optionArray[i]); } IntPtr ptr = Marshal.AllocCoTaskMem(cb); IntPtr ptr2 = ptr; for (int j = 0; j < internet_per_conn_optionArray.Length; j++) { Marshal.StructureToPtr(internet_per_conn_optionArray[j], ptr2, false); ptr2 = (IntPtr)(((long)ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[j])); } structure.pOptions = ptr; structure.Size = Marshal.SizeOf(structure); int size = structure.Size; bool flag = InternetQueryOptionList(IntPtr.Zero, 0x4b, ref structure, ref size); int num5 = Marshal.GetLastWin32Error(); if (!flag && (0x57 == num5)) { internet_per_conn_optionArray[4].dwOption = 5; ptr2 = ptr; for (int k = 0; k < internet_per_conn_optionArray.Length; k++) { Marshal.StructureToPtr(internet_per_conn_optionArray[k], ptr2, false); ptr2 = (IntPtr)(((long)ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[k])); } structure.pOptions = ptr; structure.Size = Marshal.SizeOf(structure); size = structure.Size; flag = InternetQueryOptionList(IntPtr.Zero, 0x4b, ref structure, ref size); num5 = Marshal.GetLastWin32Error(); } if (flag) { ptr2 = ptr; for (int m = 0; m < internet_per_conn_optionArray.Length; m++) { Marshal.PtrToStructure(ptr2, internet_per_conn_optionArray[m]); ptr2 = (IntPtr)(((long)ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[m])); } this._bDirect = 1 == (internet_per_conn_optionArray[0].Value.dwValue & 1); this._bUseConfigScript = 4 == (internet_per_conn_optionArray[0].Value.dwValue & 4); this._bAutoDetect = 8 == (internet_per_conn_optionArray[0].Value.dwValue & 8); this._bProxiesSpecified = 2 == (internet_per_conn_optionArray[0].Value.dwValue & 2); if (internet_per_conn_optionArray[4].dwOption == 10) { this._bAutoDetectWasUserSet = 8 == (internet_per_conn_optionArray[4].Value.dwValue & 8); } else { this._bAutoDetectWasUserSet = this._bAutoDetect && (1 == (internet_per_conn_optionArray[4].Value.dwValue & 1)); } this._sScriptURL = Marshal.PtrToStringAnsi(internet_per_conn_optionArray[3].Value.pszValue); Utilities.GlobalFree(internet_per_conn_optionArray[3].Value.pszValue); if (internet_per_conn_optionArray[1].Value.pszValue != IntPtr.Zero) { string sProxyString = Marshal.PtrToStringAnsi(internet_per_conn_optionArray[1].Value.pszValue); Utilities.GlobalFree(internet_per_conn_optionArray[1].Value.pszValue); this.InitializeFromProxyString(sProxyString); } if (internet_per_conn_optionArray[2].Value.pszValue != IntPtr.Zero) { this._sHostsThatBypass = Marshal.PtrToStringAnsi(internet_per_conn_optionArray[2].Value.pszValue); Utilities.GlobalFree(internet_per_conn_optionArray[2].Value.pszValue); this._bBypassIntranetHosts = this._sHostsThatBypass.Contains("<local>"); } } Marshal.FreeCoTaskMem(ptr); return(flag); } catch (Exception exception) { KProxyApplication.ReportException(exception, "Unable to get proxy information for " + (sConnectionName ?? "DefaultLAN")); return(false); } }
internal bool SetToWinINET(string sConnectionName) { try { INTERNET_PER_CONN_OPTION_LIST structure = new INTERNET_PER_CONN_OPTION_LIST(); INTERNET_PER_CONN_OPTION[] internet_per_conn_optionArray = new INTERNET_PER_CONN_OPTION[5]; if (sConnectionName == "DefaultLAN") { sConnectionName = null; } structure.Connection = sConnectionName; structure.OptionCount = internet_per_conn_optionArray.Length; structure.OptionError = 0; int num = 0; if (this._bDirect) { num |= 1; } if (this._bAutoDetect) { num |= 8; } if (this._bAutoDetectWasUserSet) { num |= 8; } if (this._bUseConfigScript) { num |= 4; } if (this._bProxiesSpecified) { num |= 2; } internet_per_conn_optionArray[0] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[0].dwOption = 1; internet_per_conn_optionArray[0].Value.dwValue = num; internet_per_conn_optionArray[1] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[1].dwOption = 2; internet_per_conn_optionArray[1].Value.pszValue = Marshal.StringToHGlobalAnsi(this.CalculateProxyString()); internet_per_conn_optionArray[2] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[2].dwOption = 3; internet_per_conn_optionArray[2].Value.pszValue = Marshal.StringToHGlobalAnsi(this._sHostsThatBypass); internet_per_conn_optionArray[3] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[3].dwOption = 4; internet_per_conn_optionArray[3].Value.pszValue = Marshal.StringToHGlobalAnsi(this._sScriptURL); internet_per_conn_optionArray[4] = new INTERNET_PER_CONN_OPTION(); internet_per_conn_optionArray[4].dwOption = 5; internet_per_conn_optionArray[4].Value.dwValue = 0; if (this._bAutoDetectWasUserSet) { internet_per_conn_optionArray[4].Value.dwValue = 1; } int cb = 0; for (int i = 0; i < internet_per_conn_optionArray.Length; i++) { cb += Marshal.SizeOf(internet_per_conn_optionArray[i]); } IntPtr ptr = Marshal.AllocCoTaskMem(cb); IntPtr ptr2 = ptr; for (int j = 0; j < internet_per_conn_optionArray.Length; j++) { Marshal.StructureToPtr(internet_per_conn_optionArray[j], ptr2, false); ptr2 = (IntPtr)(((long)ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[j])); } structure.pOptions = ptr; structure.Size = Marshal.SizeOf(structure); int size = structure.Size; bool flag = InternetSetOptionList(IntPtr.Zero, 0x4b, ref structure, size); int num6 = Marshal.GetLastWin32Error(); if (flag) { InternetSetOption(IntPtr.Zero, 0x5f, IntPtr.Zero, 0); } else { Trace.WriteLine("[KProxy] SetProxy failed. WinINET Error #" + num6.ToString("x")); } Marshal.FreeHGlobal(internet_per_conn_optionArray[0].Value.pszValue); Marshal.FreeHGlobal(internet_per_conn_optionArray[1].Value.pszValue); Marshal.FreeHGlobal(internet_per_conn_optionArray[2].Value.pszValue); Marshal.FreeCoTaskMem(ptr); return(flag); } catch (Exception exception) { Trace.WriteLine("[KProxy] SetProxy failed. " + exception.Message); return(false); } }
/// <summary> /// Set the proxy server for LAN connection. /// </summary> public static void Enable(string proxyServer) { IntPtr internetHandle = IntPtr.Zero; internetHandle = InternetOpen(AGENT, INTERNET_OPEN_TYPE_DIRECT, null, null, 0); if (internetHandle == IntPtr.Zero) { throw new FlashpointProxyException("Could not open the Internet Handle."); } // initialize a INTERNET_PER_CONN_OPTION_LIST instance INTERNET_PER_CONN_OPTION_LIST internetPerConnOptionList = new INTERNET_PER_CONN_OPTION_LIST(); int internetPerConnOptionListSize = Marshal.SizeOf(internetPerConnOptionList); // create two options INTERNET_PER_CONN_OPTION[] internetPerConnOptionListOptions = new INTERNET_PER_CONN_OPTION[2]; // set PROXY flags internetPerConnOptionListOptions[0] = new INTERNET_PER_CONN_OPTION(); internetPerConnOptionListOptions[0].Option = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS; internetPerConnOptionListOptions[0].Value.Value = (int)INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_PROXY; // set proxy name internetPerConnOptionListOptions[1] = new INTERNET_PER_CONN_OPTION(); internetPerConnOptionListOptions[1].Option = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_SERVER; internetPerConnOptionListOptions[1].Value.ValuePointer = Marshal.StringToHGlobalAnsi(proxyServer); // allocate memory for the INTERNET_PER_CONN_OPTION_LIST Options internetPerConnOptionList.OptionsPointer = Marshal.AllocCoTaskMem(Marshal.SizeOf(internetPerConnOptionListOptions[0]) + Marshal.SizeOf(internetPerConnOptionListOptions[1])); System.IntPtr internetPerConnOptionListOptionPointer = internetPerConnOptionList.OptionsPointer; // marshal data from a managed object to unmanaged memory for (int i = 0; i < internetPerConnOptionListOptions.Length; i++) { Marshal.StructureToPtr(internetPerConnOptionListOptions[i], internetPerConnOptionListOptionPointer, false); internetPerConnOptionListOptionPointer = (System.IntPtr)((long)internetPerConnOptionListOptionPointer + Marshal.SizeOf(internetPerConnOptionListOptions[i])); } // fill the internetPerConnOptionList structure internetPerConnOptionList.Size = Marshal.SizeOf(internetPerConnOptionList); // NULL == LAN, otherwise connectoid name internetPerConnOptionList.Connection = IntPtr.Zero; // set two options internetPerConnOptionList.OptionCount = internetPerConnOptionListOptions.Length; internetPerConnOptionList.OptionError = 0; // allocate memory for the INTERNET_PER_CONN_OPTION_LIST IntPtr internetPerConnOptionListPointer = Marshal.AllocCoTaskMem(internetPerConnOptionListSize); // marshal data from a managed object to unmanaged memory Marshal.StructureToPtr(internetPerConnOptionList, internetPerConnOptionListPointer, true); // set the options on the connection bool result = InternetSetOption(internetHandle, INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION, internetPerConnOptionListPointer, internetPerConnOptionListSize); // free the allocated memory Marshal.FreeCoTaskMem(internetPerConnOptionList.OptionsPointer); Marshal.FreeCoTaskMem(internetPerConnOptionListPointer); if (!InternetCloseHandle(internetHandle)) { throw new FlashpointProxyException("Could not close the Internet Handle."); } // throw an exception if this operation failed if (!result) { throw new FlashpointProxyException("Could not set the Internet Options."); } }
/// <summary> /// Set the proxy server for LAN connection. /// </summary> static bool SetConnectionProxyInternal(IntPtr hInternet, string proxyServer) { // Create 3 options. INTERNET_PER_CONN_OPTION[] Options = new INTERNET_PER_CONN_OPTION[3]; // Set PROXY flags. Options[0] = new INTERNET_PER_CONN_OPTION(); Options[0].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS; Options[0].Value.dwValue = (int)INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_PROXY; // Set proxy name. Options[1] = new INTERNET_PER_CONN_OPTION(); Options[1].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_SERVER; Options[1].Value.pszValue = Marshal.StringToHGlobalAnsi(proxyServer); // Set proxy bypass. Options[2] = new INTERNET_PER_CONN_OPTION(); Options[2].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_BYPASS; Options[2].Value.pszValue = Marshal.StringToHGlobalAnsi("local"); // Allocate a block of memory of the options. System.IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0]) + Marshal.SizeOf(Options[1]) + Marshal.SizeOf(Options[2])); System.IntPtr current = buffer; // Marshal data from a managed object to an unmanaged block of memory. for (int i = 0; i < Options.Length; i++) { Marshal.StructureToPtr(Options[i], current, false); current = (System.IntPtr)((int)current + Marshal.SizeOf(Options[i])); } // Initialize a INTERNET_PER_CONN_OPTION_LIST instance. INTERNET_PER_CONN_OPTION_LIST option_list = new INTERNET_PER_CONN_OPTION_LIST(); // Point to the allocated memory. option_list.pOptions = buffer; // Return the unmanaged size of an object in bytes. option_list.Size = Marshal.SizeOf(option_list); // IntPtr.Zero means LAN connection. option_list.Connection = IntPtr.Zero; option_list.OptionCount = Options.Length; option_list.OptionError = 0; int size = Marshal.SizeOf(option_list); // Allocate memory for the INTERNET_PER_CONN_OPTION_LIST instance. IntPtr intptrStruct = Marshal.AllocCoTaskMem(size); // Marshal data from a managed object to an unmanaged block of memory. Marshal.StructureToPtr(option_list, intptrStruct, true); // Set internet settings. bool bReturn = InternetSetOption( hInternet, INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION, intptrStruct, size); // Free the allocated memory. Marshal.FreeCoTaskMem(buffer); Marshal.FreeCoTaskMem(intptrStruct); // Throw an exception if this operation failed. if (!bReturn) { throw new ApplicationException(" Set Internet Option Failed!"); } // Notify the system that the registry settings have been changed and cause // the proxy data to be reread from the registry for a handle. InternetSetOption( hInternet, INTERNET_OPTION.INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0); InternetSetOption( hInternet, INTERNET_OPTION.INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); return(bReturn); }