예제 #1
0
        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);
                }
            }
        }
예제 #2
0
    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);
                }
            }
        }
    }
예제 #3
0
        public static void Disable()
        {
            InternetPerConnOption[] options = new InternetPerConnOption[1];
            options[0]               = new InternetPerConnOption();
            options[0].dwOption      = 1;
            options[0].Value.dwValue = 1;

            InternetSetOption(options);
        }
예제 #4
0
        public static void Enable(string proxy)
        {
            InternetPerConnOption[] options = new InternetPerConnOption[2];
            options[0]                = new InternetPerConnOption();
            options[0].dwOption       = 1;
            options[0].Value.dwValue  = 2;
            options[1]                = new InternetPerConnOption();
            options[1].dwOption       = 2;
            options[1].Value.pszValue = Marshal.StringToHGlobalAnsi(proxy);

            InternetSetOption(options);
        }
        public static bool SetProxy(string strProxy, string exceptions)
        {
            InternetPerConnOptionList list = new InternetPerConnOptionList();

            int optionCount = string.IsNullOrEmpty(strProxy) ? 1 : (string.IsNullOrEmpty(exceptions) ? 2 : 3);

            InternetPerConnOption[] options = new InternetPerConnOption[optionCount];
            //not use or use 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));
            //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.pszConnection = IntPtr.Zero;
            list.dwOptionCount = options.Length;
            list.dwOptionError = 0;

            int optSize = Marshal.SizeOf(typeof(InternetPerConnOption));
            // 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 j = 0; j < options.Length; ++j)
            {
                IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (j * optSize));
                Marshal.StructureToPtr(options[j], 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);

            // 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);
        }