public static Model.Data.ProxySettings GetProxySettings() { var query = GenQureyOption(true); var success = false; var result = new Model.Data.ProxySettings(); void action(IntPtr _listPtr, int _listSize) { var newSize = _listSize; success = InternetQueryOption( IntPtr.Zero, InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, _listPtr, ref newSize); if (success) { InternetPerConnOptionList optList = (InternetPerConnOptionList)Marshal.PtrToStructure( _listPtr, typeof(InternetPerConnOptionList)); result = IntPtrToProxySettings(optList.options); } } SystemProxyHandler(GenQureyOption(true), action); if (!success) { SystemProxyHandler(GenQureyOption(false), action); } return(result); }
private void SaveSettings() { if (_orgList.dwSize != 0) { return; } var opts = new[] { new InternetPerConnOption { dwOption = PerConnOption.INTERNET_PER_CONN_FLAGS }, new InternetPerConnOption { dwOption = PerConnOption.INTERNET_PER_CONN_AUTOCONFIG_URL } }; var list = new InternetPerConnOptionList { pOptions = MarshalOptions(opts), pszConnection = IntPtr.Zero, dwOptionCount = opts.Length, dwOptionError = 0 }; var listSize = list.dwSize = Marshal.SizeOf(list); if (InternetQueryOption(IntPtr.Zero, InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, ref list, ref listSize)) { _orgList = list; } AdjustLocalIntranetZoneFlags(); }
public static bool GetProxyEnabled() { InternetPerConnOptionList request = new InternetPerConnOptionList(); InternetPerConnOption[] options = new InternetPerConnOption[1]; IntPtr optionsPtr = IntPtr.Zero; try { options[0].dwOption = OptionType.INTERNET_PER_CONN_FLAGS; request.dwSize = Marshal.SizeOf(typeof(InternetPerConnOptionList)); request.pszConnection = IntPtr.Zero; request.dwOptionCount = options.Length; request.dwOptionError = 0; int optionSize = Marshal.SizeOf(options[0]); optionsPtr = Marshal.AllocCoTaskMem(optionSize * options.Length); if (optionsPtr == IntPtr.Zero) { return(false); } for (int i = 0; i < options.Length; i++) { IntPtr optionPtr = new IntPtr(optionsPtr.ToInt32() + (i * optionSize)); Marshal.StructureToPtr(options[i], optionPtr, false); } request.pOptions = optionsPtr; int requestLength = request.dwSize; bool result = NativeMethods.InternetQueryOption(IntPtr.Zero, InternetOptionActions.INTERNET_OPTION_PER_CONNECTION_OPTION, ref request, ref requestLength); if (!result) { throw new Win32Exception(Marshal.GetLastWin32Error()); } else { for (int i = 0; i < options.Length; i++) { IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (i * optionSize)); options[i] = (InternetPerConnOption)Marshal.PtrToStructure(opt, typeof(InternetPerConnOption)); } return(((ProxyFlags)options[0].Value.dwValue & ProxyFlags.PROXY_TYPE_PROXY) == ProxyFlags.PROXY_TYPE_PROXY); } } finally { if (optionsPtr == IntPtr.Zero) { Marshal.FreeCoTaskMem(optionsPtr); } } }
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_SERVE; 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 optionPtr = 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(optionPtr.ToInt32() + (i * optSize)); Marshal.StructureToPtr(options[i], opt, false); } list.Options = optionPtr; //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 api mehod 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 throw new Win32Exception(Marshal.GetLastWin32Error()); } return(returnvalue < 0); }
internal static void SystemProxyHandler(InternetConnectionOption[] options, Action <IntPtr, int> action) { InternetPerConnOptionList list = new InternetPerConnOptionList(); // 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.ToInt64() + (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! action(ipcoListPtr, list.dwSize); // FREE the data ASAP Marshal.FreeCoTaskMem(optionsPtr); Marshal.FreeCoTaskMem(ipcoListPtr); }
public static bool UnsetProxy() { InternetPerConnOptionList request = new InternetPerConnOptionList(); InternetPerConnOption[] options = new InternetPerConnOption[3]; int optionSize = 0; IntPtr optionsPtr = IntPtr.Zero; try { options[0].dwOption = OptionType.INTERNET_PER_CONN_FLAGS; options[0].Value.dwValue = (int)ProxyFlags.PROXY_TYPE_DIRECT; options[1].dwOption = OptionType.INTERNET_PER_CONN_PROXY_SERVER; options[1].Value.szValue = IntPtr.Zero; options[2].dwOption = OptionType.INTERNET_PER_CONN_PROXY_BYPASS; options[2].Value.szValue = IntPtr.Zero; optionSize = Marshal.SizeOf(typeof(InternetPerConnOption)); optionsPtr = Marshal.AllocCoTaskMem(optionSize * options.Length); if (optionsPtr == IntPtr.Zero) { return(false); } for (int i = 0; i < options.Length; ++i) { IntPtr optionPtr = new IntPtr(optionsPtr.ToInt32() + (i * optionSize)); Marshal.StructureToPtr(options[i], optionPtr, false); } request.pszConnection = IntPtr.Zero; request.dwSize = Marshal.SizeOf(typeof(InternetPerConnOptionList)); request.dwOptionCount = options.Length; request.dwOptionError = 0; request.pOptions = optionsPtr; int requestLength = request.dwSize; if (NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionActions.INTERNET_OPTION_PER_CONNECTION_OPTION, ref request, requestLength)) { NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionActions.INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0); NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionActions.INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); return(true); } else { return(false); } } finally { if (optionsPtr != IntPtr.Zero) { Marshal.FreeCoTaskMem(optionsPtr); } for (int i = 1; i < options.Length; i++) { if (options[i].Value.szValue != IntPtr.Zero) { Marshal.FreeHGlobal(options[i].Value.szValue); } } } }
private static bool ProxyEnable(WebProxy wProxy) { try { bool bReturn = true; string sPrx = wProxy.Address.DnsSafeHost + ":" + wProxy.Address.Port; InternetPerConnOptionList list = new InternetPerConnOptionList(); 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.InternetPerConnFlags; //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.InternetPerConnProxyServer; //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.InternetPerConnProxyBypass; 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.InternetOptionPerConnectionOption, list, dwBufSize); if (!bReturn) { Console.WriteLine(GetLastError()); } //Flush the current IE proxy setting bReturn = InternetSetOption(IntPtr.Zero, (int)MyOptions.InternetOptionRefresh, 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; } }
static bool SetSingleProxy(string connection, string proxy = "", int flags = 0) { var list = new InternetPerConnOptionList(); var options = new InternetConnectionOption[2]; // USE a proxy server ... options[0] = new InternetConnectionOption(); options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; options[0].m_Value.m_Int = flags != 0 ? flags : (int)(String.IsNullOrEmpty(proxy) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY)); // use THIS proxy server options[1] = new InternetConnectionOption(); options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(proxy); // default stuff list.dwSize = Marshal.SizeOf(list); list.pszConnection = Marshal.StringToHGlobalAuto(connection); list.dwOptionCount = options.Length; list.dwOptionError = 0; var optSize = Marshal.SizeOf(typeof(InternetConnectionOption)); // make a pointer out of all that ... var optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length); // copy the array over into that spot in memory ... for (var i = 0; i < options.Length; i++) { var opt = new IntPtr(optionsPtr.ToInt64() + (i * optSize)); Marshal.StructureToPtr(options[i], opt, false); } list.pOptions = optionsPtr; // and then make a pointer out of the whole list var ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize); Marshal.StructureToPtr(list, ipcoListPtr, false); // and finally, call the API method! var success = NativeMethods.InternetSetOption(IntPtr.Zero, (int)InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, ipcoListPtr, list.dwSize); // FREE the data ASAP Marshal.FreeCoTaskMem(optionsPtr); Marshal.FreeCoTaskMem(ipcoListPtr); return(success); }
private static void InternetSetOption(InternetPerConnOption[] options) { InternetPerConnOptionList internetPerConnOptionList = default(InternetPerConnOptionList); internetPerConnOptionList.Connection = null; internetPerConnOptionList.OptionCount = options.Length; internetPerConnOptionList.OptionError = 0; int optionsSize = 0; for (int i = 0; i < options.Length; i++) { optionsSize += Marshal.SizeOf(options[i]); } IntPtr optionsPtr = Marshal.AllocCoTaskMem(optionsSize); IntPtr optionPtr = optionsPtr; for (int j = 0; j < options.Length; j++) { Marshal.StructureToPtr(options[j], optionPtr, false); optionPtr = optionPtr + Marshal.SizeOf(options[j]); } internetPerConnOptionList.pOptions = optionsPtr; internetPerConnOptionList.Size = Marshal.SizeOf(internetPerConnOptionList); IntPtr listPtr = Marshal.AllocCoTaskMem(internetPerConnOptionList.Size); Marshal.StructureToPtr(internetPerConnOptionList, listPtr, false); bool flag = InternetSetOption(IntPtr.Zero, 75, listPtr, internetPerConnOptionList.Size); if (flag == true) { InternetSetOption(IntPtr.Zero, 95, IntPtr.Zero, 0); } for (int j = 0; j < options.Length; j++) { Marshal.FreeHGlobal(options[j].Value.pszValue); } Marshal.FreeCoTaskMem(optionsPtr); Marshal.FreeCoTaskMem(listPtr); }
public void SetAutoConfigUrl(string url) { SaveSettings(); var flagValue = new InternetPerConnOptionValue { dwValue = (int)PerConnFlags.PROXY_TYPE_AUTO_PROXY_URL }; var urlValue = new InternetPerConnOptionValue { pszValue = Marshal.StringToHGlobalAuto(url) }; if (_initialUri == null) { Uri.TryCreate(url, UriKind.Absolute, out _initialUri); } var opts = new[] { new InternetPerConnOption { dwOption = PerConnOption.INTERNET_PER_CONN_FLAGS, Value = flagValue }, new InternetPerConnOption { dwOption = PerConnOption.INTERNET_PER_CONN_AUTOCONFIG_URL, Value = urlValue } }; var list = new InternetPerConnOptionList { pOptions = MarshalOptions(opts), pszConnection = IntPtr.Zero, dwOptionCount = opts.Length, dwOptionError = 0 }; var listSize = list.dwSize = Marshal.SizeOf(list); var listBuff = Marshal.AllocCoTaskMem(listSize); Marshal.StructureToPtr(list, listBuff, false); InternetSetOption(IntPtr.Zero, InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, listBuff, listSize); Refresh(); Marshal.FreeHGlobal(urlValue.pszValue); Marshal.FreeCoTaskMem(list.pOptions); Marshal.FreeCoTaskMem(listBuff); }
static bool SetSingleProxy(string connection, string proxy = "", int flags = 0) { var list = new InternetPerConnOptionList(); var options = new InternetConnectionOption[2]; // USE a proxy server ... options[0] = new InternetConnectionOption(); options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; options[0].m_Value.m_Int = flags != 0 ? flags : (int)(String.IsNullOrEmpty(proxy) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY)); // use THIS proxy server options[1] = new InternetConnectionOption(); options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(proxy); // default stuff list.dwSize = Marshal.SizeOf(list); list.pszConnection = Marshal.StringToHGlobalAuto(connection); list.dwOptionCount = options.Length; list.dwOptionError = 0; var optSize = Marshal.SizeOf(typeof(InternetConnectionOption)); // make a pointer out of all that ... var optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length); // copy the array over into that spot in memory ... for (var i = 0; i < options.Length; i++) { var opt = new IntPtr(optionsPtr.ToInt64() + (i * optSize)); Marshal.StructureToPtr(options[i], opt, false); } list.pOptions = optionsPtr; // and then make a pointer out of the whole list var ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize); Marshal.StructureToPtr(list, ipcoListPtr, false); // and finally, call the API method! var success = NativeMethods.InternetSetOption(IntPtr.Zero, (int)InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, ipcoListPtr, list.dwSize); // FREE the data ASAP Marshal.FreeCoTaskMem(optionsPtr); Marshal.FreeCoTaskMem(ipcoListPtr); return success; }
public static bool SetProxy(string strProxy, string exceptions, int type) { InternetPerConnOptionList list = new InternetPerConnOptionList(); int optionCount = 1; if (type == 1) { optionCount = 1; } else if (type == 2 || type == 4) { optionCount = Utils.IsNullOrEmpty(exceptions) ? 2 : 3; } int m_Int = (int)PerConnFlags.PROXY_TYPE_DIRECT; PerConnOption m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; if (type == 2) { m_Int = (int)(PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY); m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; } else if (type == 4) { m_Int = (int)(PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_AUTO_PROXY_URL); m_Option = PerConnOption.INTERNET_PER_CONN_AUTOCONFIG_URL; } //int optionCount = Utils.IsNullOrEmpty(strProxy) ? 1 : (Utils.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)); options[0].m_Value.m_Int = m_Int; // use THIS proxy server if (optionCount > 1) { options[1].m_Option = m_Option; 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) { if (Environment.Is64BitOperatingSystem) { IntPtr opt = new IntPtr(optionsPtr.ToInt64() + (i * optSize)); Marshal.StructureToPtr(options[i], opt, false); } else { 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((int)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); }
/// <summary> /// Sets proxy. /// </summary> /// <param name="EnableProxy">If true enables proxy, false disables.</param> /// <param name="EnableAutoDetect">If true enables Auto-Detect setting, false disables.</param> /// <param name="ProxyAddress">If you want a specific proxy server</param> /// <param name="ProxyExceptions">Exceptions if you need it</param> /// <param name="AutoConfigURL">If you want an autoconfig URL i.e. PAC file</param> /// <param name="ConnectionName">If you want to apply Proxy Setting to dial up connection, specify name here.</param> /// <returns></returns> public static bool SetProxy(bool EnableProxy, bool EnableAutoDetect, string ProxyAddress, string ProxyExceptions, string AutoConfigURL, string ConnectionName = "") { // use this to store our proxy settings InternetPerConnOptionList list = new InternetPerConnOptionList(); // get count of number of options we need...starting with a base of 2. int optionCount = 1; // count out how many options we are going to need to set... if (EnableProxy) { optionCount++; } if (EnableAutoDetect) { optionCount++; } if (!string.IsNullOrEmpty(ProxyExceptions)) { optionCount++; } if (!string.IsNullOrEmpty(AutoConfigURL)) { optionCount++; } // we'll use this array to store our options InternetConnectionOption[] options = new InternetConnectionOption[optionCount]; // a counter to identify what option we are setting at the moment...there will always be option [0] at a minimum... int optionCurrent = 1; // our per connection flags get stored here... options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; // enable or disable proxy? if (EnableProxy) { options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(ProxyAddress); options[0].m_Value.m_Int = (int)PerConnFlags.PROXY_TYPE_PROXY; optionCurrent++; } else { options[0].m_Value.m_Int = (int)PerConnFlags.PROXY_TYPE_DIRECT; } // options[optionCurrent].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; // optionCurrent++; // configure proxy exceptions...use <local> to bypass proxy for local addresses... if (!string.IsNullOrEmpty(ProxyExceptions)) { options[optionCurrent].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS; options[optionCurrent].m_Value.m_StringPtr = Marshal.StringToHGlobalUni(ProxyExceptions); optionCurrent++; } // configure auto config URLw if (!string.IsNullOrEmpty(AutoConfigURL)) { options[optionCurrent].m_Option = PerConnOption.INTERNET_PER_CONN_AUTOCONFIG_URL; options[optionCurrent].m_Value.m_StringPtr = Marshal.StringToHGlobalUni(AutoConfigURL); options[0].m_Value.m_Int = (int)PerConnFlags.PROXY_TYPE_AUTO_PROXY_URL | (int)options[0].m_Value.m_Int; optionCurrent++; } if (EnableAutoDetect) { options[0].m_Value.m_Int = (int)PerConnFlags.PROXY_TYPE_AUTO_DETECT | (int)options[0].m_Value.m_Int; options[optionCurrent].m_Option = PerConnOption.INTERNET_PER_CONN_AUTODISCOVERY_FLAGS; options[optionCurrent].m_Value.m_Int = (int)AutoDetectFlags.AUTO_PROXY_FLAG_ALWAYS_DETECT; optionCurrent++; } // default stuff list.dwSize = Marshal.SizeOf(list); // do we have a connection name specified? if (string.IsNullOrEmpty(ConnectionName)) { // no - the proxy will apply to 'LAN Connections' list.szConnection = IntPtr.Zero; } else { // yes - we will apply proxy to a specific connection list.szConnection = Marshal.StringToHGlobalAuto(ConnectionName); } 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((long)(optionsPtr.ToInt64() + (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((int)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 Marshal.FreeCoTaskMem(optionsPtr); Marshal.FreeCoTaskMem(ipcoListPtr); if (returnvalue > 0) { // throw the error codes, they might be helpful (Most likely not!) throw new Win32Exception(returnvalue); } // refresh IE settings - so we don't need to re-launch internet explorer! NativeMethods.InternetSetOption(IntPtr.Zero, InternetOption.INTERNET_OPTION_PROXY_SETTINGS_CHANGED, IntPtr.Zero, 0); return(returnvalue < 0); }
static ProxyInfo GetSingleProxy(string connection) { var list = new InternetPerConnOptionList(); var options = new InternetConnectionOption[] { new InternetConnectionOption() { m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS }, new InternetConnectionOption() { m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER } }; // default stuff list.dwSize = Marshal.SizeOf(list); if (!string.IsNullOrEmpty(connection)) { list.pszConnection = Marshal.StringToHGlobalAuto(connection); } list.dwOptionCount = options.Length; list.dwOptionError = 0; var optSize = Marshal.SizeOf(typeof(InternetConnectionOption)); var optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length); // copy the array over into that spot in memory ... for (var 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 var ipcoListPtr = Marshal.AllocCoTaskMem(list.dwSize); Marshal.StructureToPtr(list, ipcoListPtr, false); // and finally, call the API method! var success = NativeMethods.InternetQueryOption(IntPtr.Zero, (int)InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, ipcoListPtr, ref list.dwSize); Marshal.PtrToStructure(ipcoListPtr, list); Marshal.PtrToStructure(list.pOptions, options[0]); Marshal.PtrToStructure(new IntPtr(list.pOptions.ToInt32() + optSize), options[1]); var proxyInfo = new ProxyInfo() { ConnectionName = connection, Flags = options[0].m_Value.m_Int, Proxy = Marshal.PtrToStringAuto(options[1].m_Value.m_StringPtr) }; // FREE the data ASAP Marshal.FreeCoTaskMem(optionsPtr); Marshal.FreeCoTaskMem(ipcoListPtr); return(proxyInfo); }
private static extern bool InternetQueryOption(IntPtr hInternet, InternetOption dwOption, // ReSharper disable once IdentifierTypo ref InternetPerConnOptionList optionList, ref int lpdwBufferLength);
/// <summary> /// Sets proxy. /// </summary> /// <param name="EnableProxy">If true enables proxy, false disables.</param> /// <param name="EnableAutoDetect">If true enables Auto-Detect setting, false disables.</param> /// <param name="ProxyAddress">If you want a specific proxy server</param> /// <param name="ProxyExceptions">Exceptions if you need it</param> /// <param name="AutoConfigURL">If you want an autoconfig URL i.e. PAC file</param> /// <param name="ConnectionName">If you want to apply Proxy Setting to dial up connection, specify name here.</param> /// <returns></returns> public static bool SetProxy(bool EnableProxy,bool EnableAutoDetect,string ProxyAddress,string ProxyExceptions, string AutoConfigURL, string ConnectionName="") { // use this to store our proxy settings InternetPerConnOptionList list = new InternetPerConnOptionList(); // get count of number of options we need...starting with a base of 2. int optionCount = 1; // count out how many options we are going to need to set... if (EnableProxy) optionCount++; if (EnableAutoDetect) optionCount++; if (!string.IsNullOrEmpty(ProxyExceptions)) optionCount++; if (!string.IsNullOrEmpty(AutoConfigURL)) optionCount++; // we'll use this array to store our options InternetConnectionOption[] options = new InternetConnectionOption[optionCount]; // a counter to identify what option we are setting at the moment...there will always be option [0] at a minimum... int optionCurrent = 1; // our per connection flags get stored here... options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; // enable or disable proxy? if (EnableProxy) { options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(ProxyAddress); options[0].m_Value.m_Int = (int)PerConnFlags.PROXY_TYPE_PROXY; optionCurrent++; } else { options[0].m_Value.m_Int = (int)PerConnFlags.PROXY_TYPE_DIRECT; } // options[optionCurrent].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; // optionCurrent++; // configure proxy exceptions...use <local> to bypass proxy for local addresses... if (!string.IsNullOrEmpty(ProxyExceptions)) { options[optionCurrent].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS; options[optionCurrent].m_Value.m_StringPtr = Marshal.StringToHGlobalUni(ProxyExceptions); optionCurrent++; } // configure auto config URLw if (!string.IsNullOrEmpty(AutoConfigURL)) { options[optionCurrent].m_Option = PerConnOption.INTERNET_PER_CONN_AUTOCONFIG_URL; options[optionCurrent].m_Value.m_StringPtr = Marshal.StringToHGlobalUni(AutoConfigURL); options[0].m_Value.m_Int = (int)PerConnFlags.PROXY_TYPE_AUTO_PROXY_URL | (int)options[0].m_Value.m_Int; optionCurrent++; } if (EnableAutoDetect) { options[0].m_Value.m_Int = (int)PerConnFlags.PROXY_TYPE_AUTO_DETECT | (int)options[0].m_Value.m_Int; options[optionCurrent].m_Option = PerConnOption.INTERNET_PER_CONN_AUTODISCOVERY_FLAGS; options[optionCurrent].m_Value.m_Int=(int)AutoDetectFlags.AUTO_PROXY_FLAG_ALWAYS_DETECT; optionCurrent++; } // default stuff list.dwSize = Marshal.SizeOf(list); // do we have a connection name specified? if (string.IsNullOrEmpty(ConnectionName)) { // no - the proxy will apply to 'LAN Connections' list.szConnection = IntPtr.Zero; } else { // yes - we will apply proxy to a specific connection list.szConnection = Marshal.StringToHGlobalAuto(ConnectionName); } 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((long)(optionsPtr.ToInt64() + (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((int)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 Marshal.FreeCoTaskMem(optionsPtr); Marshal.FreeCoTaskMem(ipcoListPtr); if (returnvalue > 0) { // throw the error codes, they might be helpful (Most likely not!) throw new Win32Exception(returnvalue); } // refresh IE settings - so we don't need to re-launch internet explorer! NativeMethods.InternetSetOption(IntPtr.Zero, InternetOption.INTERNET_OPTION_PROXY_SETTINGS_CHANGED, IntPtr.Zero, 0); return (returnvalue < 0); }
private 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]; 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)); if (optionCount > 1) { options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy); if (optionCount > 2) { options[2].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS; options[2].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions); } } list.dwSize = Marshal.SizeOf(list); list.szConnection = IntPtr.Zero; list.dwOptionCount = options.Length; list.dwOptionError = 0; int optSize = Marshal.SizeOf(typeof(InternetConnectionOption)); IntPtr optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length); for (int i = 0; i < options.Length; ++i) { IntPtr opt = new IntPtr(optionsPtr.ToInt64() + (i * optSize)); Marshal.StructureToPtr(options[i], opt, false); } list.options = optionsPtr; IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize); Marshal.StructureToPtr(list, ipcoListPtr, false); int returnvalue = NativeMethods.InternetSetOption(IntPtr.Zero, InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, ipcoListPtr, list.dwSize) ? -1 : 0; if (returnvalue == 0) { returnvalue = Marshal.GetLastWin32Error(); } Marshal.FreeCoTaskMem(optionsPtr); Marshal.FreeCoTaskMem(ipcoListPtr); if (returnvalue > 0) { // No need to catch } return(returnvalue < 0); }
private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, InternetPerConnOptionList lpBuffer, int dwBufferLength);
static ProxyInfo GetSingleProxy(string connection) { var list = new InternetPerConnOptionList(); var options = new InternetConnectionOption[]{ new InternetConnectionOption(){ m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS }, new InternetConnectionOption(){ m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER } }; // default stuff list.dwSize = Marshal.SizeOf(list); if (!string.IsNullOrEmpty(connection)) list.pszConnection = Marshal.StringToHGlobalAuto(connection); list.dwOptionCount = options.Length; list.dwOptionError = 0; var optSize = Marshal.SizeOf(typeof(InternetConnectionOption)); var optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length); // copy the array over into that spot in memory ... for (var 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 var ipcoListPtr = Marshal.AllocCoTaskMem(list.dwSize); Marshal.StructureToPtr(list, ipcoListPtr, false); // and finally, call the API method! var success = NativeMethods.InternetQueryOption(IntPtr.Zero, (int)InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, ipcoListPtr, ref list.dwSize); Marshal.PtrToStructure(ipcoListPtr, list); Marshal.PtrToStructure(list.pOptions, options[0]); Marshal.PtrToStructure(new IntPtr(list.pOptions.ToInt32() + optSize), options[1]); var proxyInfo = new ProxyInfo() { ConnectionName = connection, Flags = options[0].m_Value.m_Int, Proxy = Marshal.PtrToStringAuto(options[1].m_Value.m_StringPtr) }; // FREE the data ASAP Marshal.FreeCoTaskMem(optionsPtr); Marshal.FreeCoTaskMem(ipcoListPtr); return proxyInfo; }
public static extern bool InternetSetOption(IntPtr hInternet, InternetOptionActions dwOption, ref InternetPerConnOptionList lpOptionList, int lpdwBufferLength);
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); }