Пример #1
0
        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);
        }
Пример #2
0
        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;
        }