示例#1
0
        /// <summary>
        /// Set the system proxy, as per the 'Internet Options' panel
        /// </summary>
        /// <returns>True if the operation was successful</returns>
        public static bool SetProxy(bool ProxyEnable,
            string ProxyServer, string ProxyBypass)
        {
            var options = new INTERNET_PER_CONN_OPTION[3];

            // Option #1: ProxyEnable
            options[0].dwOption = INTERNET_PER_CONN.FLAGS;
            options[0].Value.i = (int) (ProxyEnable
                ? (PER_CONN_FLAGS.PROXY_TYPE_DIRECT |
                    PER_CONN_FLAGS.PROXY_TYPE_PROXY)
                : PER_CONN_FLAGS.PROXY_TYPE_DIRECT);

            // Option #2: ProxyServer
            options[1].dwOption = INTERNET_PER_CONN.PROXY_SERVER;
            options[1].Value.iptr = Marshal.StringToHGlobalAuto(
                ProxyServer);

            // Option #3: ProxyBypass
            options[2].dwOption = INTERNET_PER_CONN.PROXY_BYPASS;
            options[2].Value.iptr = Marshal.StringToHGlobalAuto(
                ProxyBypass);

            var list = new INTERNET_PER_CONN_OPTION_LIST();
            list.dwSize = Marshal.SizeOf(list);
            list.pszConnection = IntPtr.Zero; // change globally
            list.dwOptionCount = options.Length;
            list.dwOptionError = 0;

            // Marshall each option in options
            int optSize = Marshal.SizeOf(typeof(INTERNET_PER_CONN_OPTION));
            IntPtr optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length);
            for (int 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
            IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize);
            Marshal.StructureToPtr(list, ipcoListPtr, false);

            // Finally, call the InternetSetOption API
            int res = InternetSetOption(IntPtr.Zero,
               INTERNET_OPTION.PER_CONNECTION_OPTION, ipcoListPtr, list.dwSize)
               ? -1 : 0;
            if (res == 0)
                res = Marshal.GetLastWin32Error();

            Marshal.FreeCoTaskMem(optionsPtr);
            Marshal.FreeCoTaskMem(ipcoListPtr);
            if (res > 0)
                throw new Win32Exception(Marshal.GetLastWin32Error());

            return (res < 0);
        }
示例#2
0
            /// <summary>
            /// Backup the current options for LAN connection.
            /// Make sure free the memory after restoration. 
            /// </summary>
            private static INTERNET_PER_CONN_OPTION_LIST GetSystemProxy()
            {

                // Query following options. 
                INTERNET_PER_CONN_OPTION[] Options = new INTERNET_PER_CONN_OPTION[3];

                Options[0] = new INTERNET_PER_CONN_OPTION();
                Options[0].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS;
                Options[1] = new INTERNET_PER_CONN_OPTION();
                Options[1].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_SERVER;
                Options[2] = new INTERNET_PER_CONN_OPTION();
                Options[2].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_BYPASS;

                // Allocate a block of memory of the options.
                System.IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0])
                    + Marshal.SizeOf(Options[1]) + Marshal.SizeOf(Options[2]));

                System.IntPtr current = (System.IntPtr)buffer;

                // Marshal data from a managed object to an unmanaged block of memory.
                for (int i = 0; i < Options.Length; i++)
                {
                    Marshal.StructureToPtr(Options[i], current, false);
                    current = (System.IntPtr)((int)current + Marshal.SizeOf(Options[i]));
                }

                // Initialize a INTERNET_PER_CONN_OPTION_LIST instance.
                INTERNET_PER_CONN_OPTION_LIST Request = new INTERNET_PER_CONN_OPTION_LIST();

                // Point to the allocated memory.
                Request.pOptions = buffer;

                Request.Size = Marshal.SizeOf(Request);

                // IntPtr.Zero means LAN connection.
                Request.Connection = IntPtr.Zero;

                Request.OptionCount = Options.Length;
                Request.OptionError = 0;
                int size = Marshal.SizeOf(Request);

                // Query internet options. 
                bool result = InternetQueryOptionList(IntPtr.Zero,
                    INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION,
                    ref Request, ref size);
                if (!result)
                {
                    throw new ApplicationException(" Set Internet Option Failed! ");
                }

                return Request;
            }
示例#3
0
 private static bool ProxyEnable(WebProxy wProxy)
 {
     try
     {
         bool bReturn = true;
         string sPrx = wProxy.Address.DnsSafeHost + ":" + wProxy.Address.Port;
         INTERNET_PER_CONN_OPTION_LIST list = new INTERNET_PER_CONN_OPTION_LIST();
         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.INTERNET_PER_CONN_FLAGS;
         //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.INTERNET_PER_CONN_PROXY_SERVER;
         //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.INTERNET_PER_CONN_PROXY_BYPASS;
         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.INTERNET_OPTION_PER_CONNECTION_OPTION, list, dwBufSize);
         if (!bReturn)
         {
             Console.WriteLine(GetLastError());
         }
         //Flush the current IE proxy setting
         bReturn = InternetSetOption(IntPtr.Zero, (int)MyOptions.INTERNET_OPTION_REFRESH, 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;
     }
 }
 internal bool SetToWinINET(string sConnectionName)
 {
     try
     {
         INTERNET_PER_CONN_OPTION_LIST structure = new INTERNET_PER_CONN_OPTION_LIST();
         INTERNET_PER_CONN_OPTION[] internet_per_conn_optionArray = new INTERNET_PER_CONN_OPTION[5];
         if (sConnectionName == "DefaultLAN")
         {
             sConnectionName = null;
         }
         structure.Connection = sConnectionName;
         structure.OptionCount = internet_per_conn_optionArray.Length;
         structure.OptionError = 0;
         int num = 0;
         if (this._bDirect)
         {
             num |= 1;
         }
         if (this._bAutoDetect)
         {
             num |= 8;
         }
         if (this._bAutoDetectWasUserSet)
         {
             num |= 8;
         }
         if (this._bUseConfigScript)
         {
             num |= 4;
         }
         if (this._bProxiesSpecified)
         {
             num |= 2;
         }
         internet_per_conn_optionArray[0] = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[0].dwOption = 1;
         internet_per_conn_optionArray[0].Value.dwValue = num;
         internet_per_conn_optionArray[1] = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[1].dwOption = 2;
         internet_per_conn_optionArray[1].Value.pszValue = Marshal.StringToHGlobalAnsi(this.CalculateProxyString());
         internet_per_conn_optionArray[2] = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[2].dwOption = 3;
         internet_per_conn_optionArray[2].Value.pszValue = Marshal.StringToHGlobalAnsi(this._sHostsThatBypass);
         internet_per_conn_optionArray[3] = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[3].dwOption = 4;
         internet_per_conn_optionArray[3].Value.pszValue = Marshal.StringToHGlobalAnsi(this._sScriptURL);
         internet_per_conn_optionArray[4] = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[4].dwOption = 5;
         internet_per_conn_optionArray[4].Value.dwValue = 0;
         if (this._bAutoDetectWasUserSet)
         {
             internet_per_conn_optionArray[4].Value.dwValue = 1;
         }
         int cb = 0;
         for (int i = 0; i < internet_per_conn_optionArray.Length; i++)
         {
             cb += Marshal.SizeOf(internet_per_conn_optionArray[i]);
         }
         IntPtr ptr = Marshal.AllocCoTaskMem(cb);
         IntPtr ptr2 = ptr;
         for (int j = 0; j < internet_per_conn_optionArray.Length; j++)
         {
             Marshal.StructureToPtr(internet_per_conn_optionArray[j], ptr2, false);
             ptr2 = (IntPtr) (((long) ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[j]));
         }
         structure.pOptions = ptr;
         structure.Size = Marshal.SizeOf(structure);
         int size = structure.Size;
         bool flag = InternetSetOptionList(IntPtr.Zero, 0x4b, ref structure, size);
         int num6 = Marshal.GetLastWin32Error();
         if (flag)
         {
             InternetSetOption(IntPtr.Zero, 0x5f, IntPtr.Zero, 0);
         }
         else
         {
             Trace.WriteLine("[Fiddler] SetProxy failed. WinINET Error #" + num6.ToString("x"));
         }
         Marshal.FreeHGlobal(internet_per_conn_optionArray[0].Value.pszValue);
         Marshal.FreeHGlobal(internet_per_conn_optionArray[1].Value.pszValue);
         Marshal.FreeHGlobal(internet_per_conn_optionArray[2].Value.pszValue);
         Marshal.FreeCoTaskMem(ptr);
         return flag;
     }
     catch (Exception exception)
     {
         Trace.WriteLine("[Fiddler] SetProxy failed. " + exception.Message);
         return false;
     }
 }
示例#5
0
            /// <summary>
            /// Set the proxy server for LAN connection.
            /// </summary>
            public static bool SetConnectionProxy(string proxyServer)
            {

                IntPtr hInternet = InternetOpen(applicationName, INTERNET_OPEN_TYPE_DIRECT, null, null, 0);

                //// Create 3 options.
                //INTERNET_PER_CONN_OPTION[] Options = new INTERNET_PER_CONN_OPTION[3];

                // Create 2 options.
                INTERNET_PER_CONN_OPTION[] Options;

                // Set PROXY flags.
                System.IntPtr buffer;
                if (string.IsNullOrEmpty(proxyServer))
                {
                   Options = new INTERNET_PER_CONN_OPTION[1];
                   Options[0] = new INTERNET_PER_CONN_OPTION();
                   Options[0].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS;

                Options[0].Value.dwValue = (int)INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_DIRECT;
                buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0]));
                }
                else
                {
                    Options= new INTERNET_PER_CONN_OPTION[2];
                    Options[0] = new INTERNET_PER_CONN_OPTION();
                    Options[0].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS;

                    Options[0].Value.dwValue = (int)INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_PROXY;

                    // Set proxy name.
                    Options[1] = new INTERNET_PER_CONN_OPTION();
                    Options[1].dwOption =
                        (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_SERVER;
                    Options[1].Value.pszValue = Marshal.StringToHGlobalAnsi(proxyServer);
                    buffer=Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0])
                    + Marshal.SizeOf(Options[1]));
                }

                //// Set proxy bypass.
                //Options[2] = new INTERNET_PER_CONN_OPTION();
                //Options[2].dwOption =
                //    (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_BYPASS;
                //Options[2].Value.pszValue = Marshal.StringToHGlobalAnsi("local");

                //// Allocate a block of memory of the options.
                //System.IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0])
                //    + Marshal.SizeOf(Options[1]) + Marshal.SizeOf(Options[2]));

                // Allocate a block of memory of the options.
                 

                System.IntPtr current = buffer;

                // Marshal data from a managed object to an unmanaged block of memory.
                for (int i = 0; i < Options.Length; i++)
                {
                    Marshal.StructureToPtr(Options[i], current, false);
                    current = (System.IntPtr)((int)current + Marshal.SizeOf(Options[i]));
                }

                // Initialize a INTERNET_PER_CONN_OPTION_LIST instance.
                INTERNET_PER_CONN_OPTION_LIST option_list = new INTERNET_PER_CONN_OPTION_LIST();

                // Point to the allocated memory.
                option_list.pOptions = buffer;

                // Return the unmanaged size of an object in bytes.
                option_list.Size = Marshal.SizeOf(option_list);

                // IntPtr.Zero means LAN connection.
                option_list.Connection = IntPtr.Zero;

                option_list.OptionCount = Options.Length;
                option_list.OptionError = 0;
                int size = Marshal.SizeOf(option_list);

                // Allocate memory for the INTERNET_PER_CONN_OPTION_LIST instance.
                IntPtr intptrStruct = Marshal.AllocCoTaskMem(size);

                // Marshal data from a managed object to an unmanaged block of memory.
                Marshal.StructureToPtr(option_list, intptrStruct, true);

                // Set internet settings.
                bool bReturn = InternetSetOption(hInternet,
                    INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION, intptrStruct, size);

                // Free the allocated memory.
                Marshal.FreeCoTaskMem(buffer);
                Marshal.FreeCoTaskMem(intptrStruct);
                InternetCloseHandle(hInternet);

                // Throw an exception if this operation failed.
                if (!bReturn)
                {
                    throw new ApplicationException(" Set Internet Option Failed!");
                }

                return bReturn;
            }
 public bool GetFromWinINET(string sConnectionName)
 {
     this.Clear();
     try
     {
         INTERNET_PER_CONN_OPTION_LIST structure = new INTERNET_PER_CONN_OPTION_LIST();
         INTERNET_PER_CONN_OPTION[] internet_per_conn_optionArray = new INTERNET_PER_CONN_OPTION[5];
         if (sConnectionName == "DefaultLAN")
         {
             sConnectionName = null;
         }
         structure.Connection = sConnectionName;
         structure.OptionCount = internet_per_conn_optionArray.Length;
         structure.OptionError = 0;
         internet_per_conn_optionArray[0] = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[0].dwOption = 1;
         internet_per_conn_optionArray[1] = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[1].dwOption = 2;
         internet_per_conn_optionArray[2] = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[2].dwOption = 3;
         internet_per_conn_optionArray[3] = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[3].dwOption = 4;
         internet_per_conn_optionArray[4] = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[4].dwOption = 10;
         int cb = 0;
         for (int i = 0; i < internet_per_conn_optionArray.Length; i++)
         {
             cb += Marshal.SizeOf(internet_per_conn_optionArray[i]);
         }
         IntPtr ptr = Marshal.AllocCoTaskMem(cb);
         IntPtr ptr2 = ptr;
         for (int j = 0; j < internet_per_conn_optionArray.Length; j++)
         {
             Marshal.StructureToPtr(internet_per_conn_optionArray[j], ptr2, false);
             ptr2 = (IntPtr) (((long) ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[j]));
         }
         structure.pOptions = ptr;
         structure.Size = Marshal.SizeOf(structure);
         int size = structure.Size;
         bool flag = InternetQueryOptionList(IntPtr.Zero, 0x4b, ref structure, ref size);
         int num5 = Marshal.GetLastWin32Error();
         if (!flag)
         {
             if (0x57 == num5)
             {
                 internet_per_conn_optionArray[4].dwOption = 5;
                 ptr2 = ptr;
                 for (int k = 0; k < internet_per_conn_optionArray.Length; k++)
                 {
                     Marshal.StructureToPtr(internet_per_conn_optionArray[k], ptr2, false);
                     ptr2 = (IntPtr) (((long) ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[k]));
                 }
                 structure.pOptions = ptr;
                 structure.Size = Marshal.SizeOf(structure);
                 size = structure.Size;
                 flag = InternetQueryOptionList(IntPtr.Zero, 0x4b, ref structure, ref size);
                 num5 = Marshal.GetLastWin32Error();
             }
             if (!flag)
             {
                 object[] args = new object[] { sConnectionName ?? "DefaultLAN", num5.ToString("x") };
                 FiddlerApplication.Log.LogFormat("Fiddler was unable to get information about the proxy for '{0}' [0x{1}].\n", args);
             }
         }
         if (flag)
         {
             ptr2 = ptr;
             for (int m = 0; m < internet_per_conn_optionArray.Length; m++)
             {
                 Marshal.PtrToStructure(ptr2, internet_per_conn_optionArray[m]);
                 ptr2 = (IntPtr) (((long) ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[m]));
             }
             this._bDirect = 1 == (internet_per_conn_optionArray[0].Value.dwValue & 1);
             this._bUseConfigScript = 4 == (internet_per_conn_optionArray[0].Value.dwValue & 4);
             this._bAutoDetect = 8 == (internet_per_conn_optionArray[0].Value.dwValue & 8);
             this._bProxiesSpecified = 2 == (internet_per_conn_optionArray[0].Value.dwValue & 2);
             if (internet_per_conn_optionArray[4].dwOption == 10)
             {
                 this._bAutoDetectWasUserSet = 8 == (internet_per_conn_optionArray[4].Value.dwValue & 8);
             }
             else
             {
                 this._bAutoDetectWasUserSet = this._bAutoDetect && (1 == (internet_per_conn_optionArray[4].Value.dwValue & 1));
             }
             this._sScriptURL = Marshal.PtrToStringAnsi(internet_per_conn_optionArray[3].Value.pszValue);
             Utilities.GlobalFree(internet_per_conn_optionArray[3].Value.pszValue);
             if (internet_per_conn_optionArray[1].Value.pszValue != IntPtr.Zero)
             {
                 string sProxyString = Marshal.PtrToStringAnsi(internet_per_conn_optionArray[1].Value.pszValue);
                 Utilities.GlobalFree(internet_per_conn_optionArray[1].Value.pszValue);
                 this.SetManualProxies(sProxyString);
             }
             if (internet_per_conn_optionArray[2].Value.pszValue != IntPtr.Zero)
             {
                 this._sHostsThatBypass = Marshal.PtrToStringAnsi(internet_per_conn_optionArray[2].Value.pszValue);
                 Utilities.GlobalFree(internet_per_conn_optionArray[2].Value.pszValue);
             }
         }
         Marshal.FreeCoTaskMem(ptr);
         return flag;
     }
     catch (Exception exception)
     {
         FiddlerApplication.ReportException(exception, "Unable to get proxy information for " + (sConnectionName ?? "DefaultLAN"));
         return false;
     }
 }
示例#7
0
 public bool GetFromWinINET(string sConnectionName)
 {
     this.Clear();
     try
     {
         INTERNET_PER_CONN_OPTION_LIST structure = new INTERNET_PER_CONN_OPTION_LIST();
         INTERNET_PER_CONN_OPTION[]    internet_per_conn_optionArray = new INTERNET_PER_CONN_OPTION[5];
         if (sConnectionName == "DefaultLAN")
         {
             sConnectionName = null;
         }
         structure.Connection                      = sConnectionName;
         structure.OptionCount                     = internet_per_conn_optionArray.Length;
         structure.OptionError                     = 0;
         internet_per_conn_optionArray[0]          = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[0].dwOption = 1;
         internet_per_conn_optionArray[1]          = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[1].dwOption = 2;
         internet_per_conn_optionArray[2]          = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[2].dwOption = 3;
         internet_per_conn_optionArray[3]          = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[3].dwOption = 4;
         internet_per_conn_optionArray[4]          = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[4].dwOption = 10;
         int cb = 0;
         for (int i = 0; i < internet_per_conn_optionArray.Length; i++)
         {
             cb += Marshal.SizeOf(internet_per_conn_optionArray[i]);
         }
         IntPtr ptr  = Marshal.AllocCoTaskMem(cb);
         IntPtr ptr2 = ptr;
         for (int j = 0; j < internet_per_conn_optionArray.Length; j++)
         {
             Marshal.StructureToPtr(internet_per_conn_optionArray[j], ptr2, false);
             ptr2 = (IntPtr)(((long)ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[j]));
         }
         structure.pOptions = ptr;
         structure.Size     = Marshal.SizeOf(structure);
         int  size = structure.Size;
         bool flag = InternetQueryOptionList(IntPtr.Zero, 0x4b, ref structure, ref size);
         int  num5 = Marshal.GetLastWin32Error();
         if (!flag && (0x57 == num5))
         {
             internet_per_conn_optionArray[4].dwOption = 5;
             ptr2 = ptr;
             for (int k = 0; k < internet_per_conn_optionArray.Length; k++)
             {
                 Marshal.StructureToPtr(internet_per_conn_optionArray[k], ptr2, false);
                 ptr2 = (IntPtr)(((long)ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[k]));
             }
             structure.pOptions = ptr;
             structure.Size     = Marshal.SizeOf(structure);
             size = structure.Size;
             flag = InternetQueryOptionList(IntPtr.Zero, 0x4b, ref structure, ref size);
             num5 = Marshal.GetLastWin32Error();
         }
         if (flag)
         {
             ptr2 = ptr;
             for (int m = 0; m < internet_per_conn_optionArray.Length; m++)
             {
                 Marshal.PtrToStructure(ptr2, internet_per_conn_optionArray[m]);
                 ptr2 = (IntPtr)(((long)ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[m]));
             }
             this._bDirect           = 1 == (internet_per_conn_optionArray[0].Value.dwValue & 1);
             this._bUseConfigScript  = 4 == (internet_per_conn_optionArray[0].Value.dwValue & 4);
             this._bAutoDetect       = 8 == (internet_per_conn_optionArray[0].Value.dwValue & 8);
             this._bProxiesSpecified = 2 == (internet_per_conn_optionArray[0].Value.dwValue & 2);
             if (internet_per_conn_optionArray[4].dwOption == 10)
             {
                 this._bAutoDetectWasUserSet = 8 == (internet_per_conn_optionArray[4].Value.dwValue & 8);
             }
             else
             {
                 this._bAutoDetectWasUserSet = this._bAutoDetect && (1 == (internet_per_conn_optionArray[4].Value.dwValue & 1));
             }
             this._sScriptURL = Marshal.PtrToStringAnsi(internet_per_conn_optionArray[3].Value.pszValue);
             Utilities.GlobalFree(internet_per_conn_optionArray[3].Value.pszValue);
             if (internet_per_conn_optionArray[1].Value.pszValue != IntPtr.Zero)
             {
                 string sProxyString = Marshal.PtrToStringAnsi(internet_per_conn_optionArray[1].Value.pszValue);
                 Utilities.GlobalFree(internet_per_conn_optionArray[1].Value.pszValue);
                 this.InitializeFromProxyString(sProxyString);
             }
             if (internet_per_conn_optionArray[2].Value.pszValue != IntPtr.Zero)
             {
                 this._sHostsThatBypass = Marshal.PtrToStringAnsi(internet_per_conn_optionArray[2].Value.pszValue);
                 Utilities.GlobalFree(internet_per_conn_optionArray[2].Value.pszValue);
                 this._bBypassIntranetHosts = this._sHostsThatBypass.Contains("<local>");
             }
         }
         Marshal.FreeCoTaskMem(ptr);
         return(flag);
     }
     catch (Exception exception)
     {
         KProxyApplication.ReportException(exception, "Unable to get proxy information for " + (sConnectionName ?? "DefaultLAN"));
         return(false);
     }
 }
示例#8
0
 internal bool SetToWinINET(string sConnectionName)
 {
     try
     {
         INTERNET_PER_CONN_OPTION_LIST structure = new INTERNET_PER_CONN_OPTION_LIST();
         INTERNET_PER_CONN_OPTION[]    internet_per_conn_optionArray = new INTERNET_PER_CONN_OPTION[5];
         if (sConnectionName == "DefaultLAN")
         {
             sConnectionName = null;
         }
         structure.Connection  = sConnectionName;
         structure.OptionCount = internet_per_conn_optionArray.Length;
         structure.OptionError = 0;
         int num = 0;
         if (this._bDirect)
         {
             num |= 1;
         }
         if (this._bAutoDetect)
         {
             num |= 8;
         }
         if (this._bAutoDetectWasUserSet)
         {
             num |= 8;
         }
         if (this._bUseConfigScript)
         {
             num |= 4;
         }
         if (this._bProxiesSpecified)
         {
             num |= 2;
         }
         internet_per_conn_optionArray[0]                = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[0].dwOption       = 1;
         internet_per_conn_optionArray[0].Value.dwValue  = num;
         internet_per_conn_optionArray[1]                = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[1].dwOption       = 2;
         internet_per_conn_optionArray[1].Value.pszValue = Marshal.StringToHGlobalAnsi(this.CalculateProxyString());
         internet_per_conn_optionArray[2]                = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[2].dwOption       = 3;
         internet_per_conn_optionArray[2].Value.pszValue = Marshal.StringToHGlobalAnsi(this._sHostsThatBypass);
         internet_per_conn_optionArray[3]                = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[3].dwOption       = 4;
         internet_per_conn_optionArray[3].Value.pszValue = Marshal.StringToHGlobalAnsi(this._sScriptURL);
         internet_per_conn_optionArray[4]                = new INTERNET_PER_CONN_OPTION();
         internet_per_conn_optionArray[4].dwOption       = 5;
         internet_per_conn_optionArray[4].Value.dwValue  = 0;
         if (this._bAutoDetectWasUserSet)
         {
             internet_per_conn_optionArray[4].Value.dwValue = 1;
         }
         int cb = 0;
         for (int i = 0; i < internet_per_conn_optionArray.Length; i++)
         {
             cb += Marshal.SizeOf(internet_per_conn_optionArray[i]);
         }
         IntPtr ptr  = Marshal.AllocCoTaskMem(cb);
         IntPtr ptr2 = ptr;
         for (int j = 0; j < internet_per_conn_optionArray.Length; j++)
         {
             Marshal.StructureToPtr(internet_per_conn_optionArray[j], ptr2, false);
             ptr2 = (IntPtr)(((long)ptr2) + Marshal.SizeOf(internet_per_conn_optionArray[j]));
         }
         structure.pOptions = ptr;
         structure.Size     = Marshal.SizeOf(structure);
         int  size = structure.Size;
         bool flag = InternetSetOptionList(IntPtr.Zero, 0x4b, ref structure, size);
         int  num6 = Marshal.GetLastWin32Error();
         if (flag)
         {
             InternetSetOption(IntPtr.Zero, 0x5f, IntPtr.Zero, 0);
         }
         else
         {
             Trace.WriteLine("[KProxy] SetProxy failed.  WinINET Error #" + num6.ToString("x"));
         }
         Marshal.FreeHGlobal(internet_per_conn_optionArray[0].Value.pszValue);
         Marshal.FreeHGlobal(internet_per_conn_optionArray[1].Value.pszValue);
         Marshal.FreeHGlobal(internet_per_conn_optionArray[2].Value.pszValue);
         Marshal.FreeCoTaskMem(ptr);
         return(flag);
     }
     catch (Exception exception)
     {
         Trace.WriteLine("[KProxy] SetProxy failed. " + exception.Message);
         return(false);
     }
 }
        /// <summary>
        /// Set the proxy server for LAN connection.
        /// </summary>
        public static void Enable(string proxyServer)
        {
            IntPtr internetHandle = IntPtr.Zero;

            internetHandle = InternetOpen(AGENT, INTERNET_OPEN_TYPE_DIRECT, null, null, 0);

            if (internetHandle == IntPtr.Zero)
            {
                throw new FlashpointProxyException("Could not open the Internet Handle.");
            }

            // initialize a INTERNET_PER_CONN_OPTION_LIST instance
            INTERNET_PER_CONN_OPTION_LIST internetPerConnOptionList = new INTERNET_PER_CONN_OPTION_LIST();
            int internetPerConnOptionListSize = Marshal.SizeOf(internetPerConnOptionList);

            // create two options
            INTERNET_PER_CONN_OPTION[] internetPerConnOptionListOptions = new INTERNET_PER_CONN_OPTION[2];

            // set PROXY flags
            internetPerConnOptionListOptions[0]             = new INTERNET_PER_CONN_OPTION();
            internetPerConnOptionListOptions[0].Option      = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS;
            internetPerConnOptionListOptions[0].Value.Value = (int)INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_PROXY;

            // set proxy name
            internetPerConnOptionListOptions[1]                    = new INTERNET_PER_CONN_OPTION();
            internetPerConnOptionListOptions[1].Option             = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_SERVER;
            internetPerConnOptionListOptions[1].Value.ValuePointer = Marshal.StringToHGlobalAnsi(proxyServer);

            // allocate memory for the INTERNET_PER_CONN_OPTION_LIST Options
            internetPerConnOptionList.OptionsPointer = Marshal.AllocCoTaskMem(Marshal.SizeOf(internetPerConnOptionListOptions[0]) + Marshal.SizeOf(internetPerConnOptionListOptions[1]));
            System.IntPtr internetPerConnOptionListOptionPointer = internetPerConnOptionList.OptionsPointer;

            // marshal data from a managed object to unmanaged memory
            for (int i = 0; i < internetPerConnOptionListOptions.Length; i++)
            {
                Marshal.StructureToPtr(internetPerConnOptionListOptions[i], internetPerConnOptionListOptionPointer, false);
                internetPerConnOptionListOptionPointer = (System.IntPtr)((long)internetPerConnOptionListOptionPointer + Marshal.SizeOf(internetPerConnOptionListOptions[i]));
            }

            // fill the internetPerConnOptionList structure
            internetPerConnOptionList.Size = Marshal.SizeOf(internetPerConnOptionList);

            // NULL == LAN, otherwise connectoid name
            internetPerConnOptionList.Connection = IntPtr.Zero;

            // set two options
            internetPerConnOptionList.OptionCount = internetPerConnOptionListOptions.Length;
            internetPerConnOptionList.OptionError = 0;

            // allocate memory for the INTERNET_PER_CONN_OPTION_LIST
            IntPtr internetPerConnOptionListPointer = Marshal.AllocCoTaskMem(internetPerConnOptionListSize);

            // marshal data from a managed object to unmanaged memory
            Marshal.StructureToPtr(internetPerConnOptionList, internetPerConnOptionListPointer, true);

            // set the options on the connection
            bool result = InternetSetOption(internetHandle, INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION, internetPerConnOptionListPointer, internetPerConnOptionListSize);

            // free the allocated memory
            Marshal.FreeCoTaskMem(internetPerConnOptionList.OptionsPointer);
            Marshal.FreeCoTaskMem(internetPerConnOptionListPointer);

            if (!InternetCloseHandle(internetHandle))
            {
                throw new FlashpointProxyException("Could not close the Internet Handle.");
            }

            // throw an exception if this operation failed
            if (!result)
            {
                throw new FlashpointProxyException("Could not set the Internet Options.");
            }
        }
示例#10
0
        /// <summary>
        /// Set the proxy server for LAN connection.
        /// </summary>
        static bool SetConnectionProxyInternal(IntPtr hInternet, string proxyServer)
        {
            // Create 3 options.
            INTERNET_PER_CONN_OPTION[] Options = new INTERNET_PER_CONN_OPTION[3];

            // Set PROXY flags.
            Options[0]               = new INTERNET_PER_CONN_OPTION();
            Options[0].dwOption      = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS;
            Options[0].Value.dwValue = (int)INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_PROXY;

            // Set proxy name.
            Options[1]          = new INTERNET_PER_CONN_OPTION();
            Options[1].dwOption =
                (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_SERVER;
            Options[1].Value.pszValue = Marshal.StringToHGlobalAnsi(proxyServer);

            // Set proxy bypass.
            Options[2]          = new INTERNET_PER_CONN_OPTION();
            Options[2].dwOption =
                (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_BYPASS;
            Options[2].Value.pszValue = Marshal.StringToHGlobalAnsi("local");

            // Allocate a block of memory of the options.
            System.IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0])
                                                          + Marshal.SizeOf(Options[1]) + Marshal.SizeOf(Options[2]));

            System.IntPtr current = buffer;

            // Marshal data from a managed object to an unmanaged block of memory.
            for (int i = 0; i < Options.Length; i++)
            {
                Marshal.StructureToPtr(Options[i], current, false);
                current = (System.IntPtr)((int)current + Marshal.SizeOf(Options[i]));
            }

            // Initialize a INTERNET_PER_CONN_OPTION_LIST instance.
            INTERNET_PER_CONN_OPTION_LIST option_list = new INTERNET_PER_CONN_OPTION_LIST();

            // Point to the allocated memory.
            option_list.pOptions = buffer;

            // Return the unmanaged size of an object in bytes.
            option_list.Size = Marshal.SizeOf(option_list);

            // IntPtr.Zero means LAN connection.
            option_list.Connection = IntPtr.Zero;

            option_list.OptionCount = Options.Length;
            option_list.OptionError = 0;
            int size = Marshal.SizeOf(option_list);

            // Allocate memory for the INTERNET_PER_CONN_OPTION_LIST instance.
            IntPtr intptrStruct = Marshal.AllocCoTaskMem(size);

            // Marshal data from a managed object to an unmanaged block of memory.
            Marshal.StructureToPtr(option_list, intptrStruct, true);

            // Set internet settings.
            bool bReturn = InternetSetOption(
                hInternet,
                INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION,
                intptrStruct, size);

            // Free the allocated memory.
            Marshal.FreeCoTaskMem(buffer);
            Marshal.FreeCoTaskMem(intptrStruct);

            // Throw an exception if this operation failed.
            if (!bReturn)
            {
                throw new ApplicationException(" Set Internet Option Failed!");
            }

            // Notify the system that the registry settings have been changed and cause
            // the proxy data to be reread from the registry for a handle.
            InternetSetOption(
                hInternet,
                INTERNET_OPTION.INTERNET_OPTION_SETTINGS_CHANGED,
                IntPtr.Zero, 0);

            InternetSetOption(
                hInternet,
                INTERNET_OPTION.INTERNET_OPTION_REFRESH,
                IntPtr.Zero, 0);

            return(bReturn);
        }