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); }
static InternetConnectionOption[] GenQureyOption(bool isWin7OrNewer) { InternetConnectionOption[] options = new InternetConnectionOption[QueryOptionCount]; options[QueryIndexProxyMode].m_Option = isWin7OrNewer ? PerConnOption.INTERNET_PER_CONN_FLAGS_UI : PerConnOption.INTERNET_PER_CONN_FLAGS; options[QueryIndexProxyServer].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; options[QueryIndexPacUrl].m_Option = PerConnOption.INTERNET_PER_CONN_AUTOCONFIG_URL; return(options); }
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); }
static InternetConnectionOption[] GenProxyOption( Model.Data.ProxySettings proxySettings) { InternetConnectionOption[] options = new InternetConnectionOption[QueryOptionCount]; // USE a proxy server ... options[QueryIndexProxyMode].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; options[QueryIndexProxyMode].m_Value.m_Int = proxySettings.proxyMode; options[QueryIndexProxyServer].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; options[QueryIndexProxyServer].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(proxySettings.proxyAddr ?? @""); options[QueryIndexPacUrl].m_Option = PerConnOption.INTERNET_PER_CONN_AUTOCONFIG_URL; options[QueryIndexPacUrl].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(proxySettings.pacUrl ?? @""); return(options); }
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); }
/// <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); }
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; }
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) { 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); }