Juan Lang : winhttp: Implement WinHttpGetDefaultProxyConfiguration.

Alexandre Julliard julliard at winehq.org
Wed Jul 15 09:46:52 CDT 2009


Module: wine
Branch: master
Commit: fd9aa244d3a6010932caf759ce79114a13f39add
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fd9aa244d3a6010932caf759ce79114a13f39add

Author: Juan Lang <juan.lang at gmail.com>
Date:   Tue Jul 14 13:00:38 2009 -0700

winhttp: Implement WinHttpGetDefaultProxyConfiguration.

---

 dlls/winhttp/session.c |   91 +++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 87 insertions(+), 4 deletions(-)

diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c
index 863b226..17a0a5f 100644
--- a/dlls/winhttp/session.c
+++ b/dlls/winhttp/session.c
@@ -669,17 +669,100 @@ struct winhttp_settings_header
     DWORD flags;   /* one of WINHTTP_PROXY_TYPE_* */
 };
 
+static inline void copy_char_to_wchar_sz(const BYTE *src, DWORD len, WCHAR *dst)
+{
+    const BYTE *begin;
+
+    for (begin = src; src - begin < len; src++, dst++)
+        *dst = *src;
+    *dst = 0;
+}
+
 /***********************************************************************
  *          WinHttpGetDefaultProxyConfiguration (winhttp.@)
  */
 BOOL WINAPI WinHttpGetDefaultProxyConfiguration( WINHTTP_PROXY_INFO *info )
 {
-    FIXME("%p\n", info);
+    LONG l;
+    HKEY key;
+    BOOL direct = TRUE;
 
-    info->dwAccessType    = WINHTTP_ACCESS_TYPE_NO_PROXY;
-    info->lpszProxy       = NULL;
-    info->lpszProxyBypass = NULL;
+    TRACE("%p\n", info);
 
+    l = RegOpenKeyExW( HKEY_LOCAL_MACHINE, Connections, 0, KEY_READ, &key );
+    if (!l)
+    {
+        DWORD type, size = 0;
+
+        l = RegQueryValueExW( key, WinHttpSettings, NULL, &type, NULL, &size );
+        if (!l && type == REG_BINARY &&
+            size >= sizeof(struct winhttp_settings_header) + 2 * sizeof(DWORD))
+        {
+            BYTE *buf = heap_alloc( size );
+
+            if (buf)
+            {
+                struct winhttp_settings_header *hdr =
+                    (struct winhttp_settings_header *)buf;
+                DWORD *len = (DWORD *)(hdr + 1);
+
+                l = RegQueryValueExW( key, WinHttpSettings, NULL, NULL, buf,
+                    &size );
+                if (!l && hdr->magic == WINHTTPSETTINGS_MAGIC &&
+                    hdr->unknown == 0)
+                {
+                    if (hdr->flags & WINHTTP_PROXY_TYPE_PROXY)
+                    {
+                       BOOL sane = FALSE;
+
+                        /* Sanity-check length of proxy string */
+                        if ((BYTE *)len - buf + *len <= size)
+                        {
+                            sane = TRUE;
+                            info->lpszProxy = GlobalAlloc( 0,
+                                (*len + 1) * sizeof(WCHAR) );
+                            if (info->lpszProxy)
+                                copy_char_to_wchar_sz( (BYTE *)(len + 1),
+                                    *len, (LPWSTR)info->lpszProxy );
+                            len = (DWORD *)((BYTE *)(len + 1) + *len);
+                        }
+                        if (sane)
+                        {
+                            /* Sanity-check length of proxy bypass string */
+                            if ((BYTE *)len - buf + *len <= size)
+                            {
+                                info->lpszProxyBypass = GlobalAlloc( 0,
+                                    (*len + 1) * sizeof(WCHAR) );
+                                if (info->lpszProxyBypass)
+                                    copy_char_to_wchar_sz( (BYTE *)(len + 1),
+                                        *len, (LPWSTR)info->lpszProxyBypass );
+                            }
+                            else
+                            {
+                                sane = FALSE;
+                                GlobalFree( (LPWSTR)info->lpszProxy );
+                                info->lpszProxy = NULL;
+                            }
+                        }
+                        if (sane)
+                        {
+                            direct = FALSE;
+                            info->dwAccessType =
+                                WINHTTP_ACCESS_TYPE_NAMED_PROXY;
+                        }
+                    }
+                }
+                heap_free( buf );
+            }
+        }
+        RegCloseKey( key );
+    }
+    if (direct)
+    {
+        info->dwAccessType    = WINHTTP_ACCESS_TYPE_NO_PROXY;
+        info->lpszProxy       = NULL;
+        info->lpszProxyBypass = NULL;
+    }
     return TRUE;
 }
 




More information about the wine-cvs mailing list