private static bool Apply_connect(ref INTERNET_PER_CONN_OPTION_LIST options, string conn) { options.Connection = StringUtils.IntPtrFromString(conn); var optionsPtr = Marshal.AllocCoTaskMem(options.Size); //free Marshal.StructureToPtr(options, optionsPtr, false); var ret = NativeMethods.InternetSetOption(IntPtr.Zero, INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION, optionsPtr, Marshal.SizeOf(typeof(INTERNET_PER_CONN_OPTION_LIST))); Marshal.FreeCoTaskMem(optionsPtr); if (!ret) { return(false); } if (!NativeMethods.InternetSetOption(IntPtr.Zero, INTERNET_OPTION.INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0)) { return(false); } if (!NativeMethods.InternetSetOption(IntPtr.Zero, INTERNET_OPTION.INTERNET_OPTION_PROXY_SETTINGS_CHANGED, IntPtr.Zero, 0)) { return(false); } if (!NativeMethods.InternetSetOption(IntPtr.Zero, INTERNET_OPTION.INTERNET_OPTION_REFRESH, IntPtr.Zero, 0)) { return(false); } return(true); }
private static void Initialize(ref INTERNET_PER_CONN_OPTION_LIST options, ProxyType type, string url = null, string bypass = @"<local>") { var optionCount = (int)type; var dwBufferSize = Marshal.SizeOf(typeof(INTERNET_PER_CONN_OPTION_LIST)); options.Size = dwBufferSize; options.OptionCount = optionCount; options.OptionError = 0; var perOption = new INTERNET_PER_CONN_OPTION[optionCount]; var optSize = Marshal.SizeOf(typeof(INTERNET_PER_CONN_OPTION)); var optionsPtr = Marshal.AllocCoTaskMem(perOption.Length * optSize);// free if (optionsPtr == IntPtr.Zero) { throw new NullReferenceException(); } perOption[0].dwOption = INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS; switch (type) { case ProxyType.Direct: { perOption[0].Value.dwValue = INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_AUTO_DETECT | INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_DIRECT; break; } case ProxyType.Pac: { perOption[0].Value.dwValue = INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_AUTO_PROXY_URL | INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_DIRECT; perOption[1].dwOption = INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_AUTOCONFIG_URL; perOption[1].Value.pszValue = StringUtils.IntPtrFromString(url); break; } case ProxyType.Global: { perOption[0].Value.dwValue = INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_PROXY | INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_DIRECT; perOption[1].dwOption = INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_SERVER; perOption[1].Value.pszValue = StringUtils.IntPtrFromString(url); perOption[2].dwOption = INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_BYPASS; perOption[2].Value.pszValue = StringUtils.IntPtrFromString(bypass); break; } default: throw new ArgumentOutOfRangeException(nameof(type), type, null); } // copy the array over into that spot in memory ... if (Environment.Is64BitProcess) { var baseAddress = optionsPtr.ToInt64(); //long for (var i = 0; i < perOption.Length; ++i) { var opt = new IntPtr(baseAddress + i * optSize); Marshal.StructureToPtr(perOption[i], opt, false); } } else { var baseAddress = optionsPtr.ToInt32(); //Int for (var i = 0; i < perOption.Length; ++i) { var opt = new IntPtr(baseAddress + i * optSize); Marshal.StructureToPtr(perOption[i], opt, false); } } options.pOptions = optionsPtr; }