winhttp(1/12): Implement WinHttpGetDefaultProxyConfiguration

Juan Lang juan.lang at gmail.com
Mon Jul 13 15:08:24 CDT 2009


The registry format is based on running the proxycfg.exe utility under
Wine and seeing what value it produces.
--Juan
-------------- next part --------------
From 3079736f8c8c75dc5f410827f9319dadf510b411 Mon Sep 17 00:00:00 2001
From: Juan Lang <juan.lang at gmail.com>
Date: Fri, 10 Jul 2009 12:36:13 -0700
Subject: [PATCH 01/12] Implement WinHttpGetDefaultProxyConfiguration

---
 dlls/winhttp/Makefile.in |    2 +-
 dlls/winhttp/session.c   |  105 ++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 102 insertions(+), 5 deletions(-)

diff --git a/dlls/winhttp/Makefile.in b/dlls/winhttp/Makefile.in
index 78d3814..f57b5a1 100644
--- a/dlls/winhttp/Makefile.in
+++ b/dlls/winhttp/Makefile.in
@@ -5,7 +5,7 @@ VPATH     = @srcdir@
 MODULE    = winhttp.dll
 IMPORTLIB = winhttp
 IMPORTS   = shlwapi kernel32
-DELAYIMPORTS = crypt32
+DELAYIMPORTS = advapi32 crypt32
 EXTRALIBS = @SOCKETLIBS@
 
 C_SRCS = \
diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c
index 55f9779..6378b1a 100644
--- a/dlls/winhttp/session.c
+++ b/dlls/winhttp/session.c
@@ -26,6 +26,7 @@
 #include "winbase.h"
 #include "winhttp.h"
 #include "wincrypt.h"
+#include "winreg.h"
 
 #include "winhttp_private.h"
 
@@ -648,16 +649,112 @@ BOOL WINAPI WinHttpDetectAutoProxyConfigUrl( DWORD flags, LPWSTR *url )
     return FALSE;
 }
 
+static const WCHAR Connections[] = {
+    'S','o','f','t','w','a','r','e','\\',
+    'M','i','c','r','o','s','o','f','t','\\',
+    'W','i','n','d','o','w','s','\\',
+    'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+    'I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s','\\',
+    'C','o','n','n','e','c','t','i','o','n','s',0 };
+static const WCHAR WinHttpSettings[] = {
+    'W','i','n','H','t','t','p','S','e','t','t','i','n','g','s',0 };
+static const DWORD WINHTTPSETTINGS_MAGIC = 0x18;
+static const DWORD WINHTTP_PROXY_TYPE_DIRECT = 1;
+static const DWORD WINHTTP_PROXY_TYPE_PROXY = 2;
+
+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;
+
+    TRACE("%p\n", info);
+
+    l = RegOpenKeyExW( HKEY_LOCAL_MACHINE, Connections, 0, KEY_READ, &key );
+    if (!l)
+    {
+        DWORD type, size = 0;
 
-    info->dwAccessType    = WINHTTP_ACCESS_TYPE_NO_PROXY;
-    info->lpszProxy       = NULL;
-    info->lpszProxyBypass = NULL;
+        l = RegQueryValueExW( key, WinHttpSettings, NULL, &type, NULL, &size );
+        if (!l && type == REG_BINARY && size >= 5 * sizeof(DWORD))
+        {
+            BYTE *buf = HeapAlloc( GetProcessHeap(), 0, size );
+
+            if (buf)
+            {
+                DWORD *magic = (DWORD *)buf;
+                DWORD *unknown = magic + 1;
+                DWORD *flags = unknown + 1;
+                DWORD *len = flags + 1;
+
+                l = RegQueryValueExW( key, WinHttpSettings, NULL, &type, buf,
+                    &size );
+                if (!l && *magic == WINHTTPSETTINGS_MAGIC && *unknown == 0)
+                {
+                    if (*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;
+                        }
+                    }
+                }
+                HeapFree( GetProcessHeap(), 0, buf );
+            }
+        }
+        RegCloseKey( key );
+    }
+    if (direct)
+    {
+        info->dwAccessType    = WINHTTP_ACCESS_TYPE_NO_PROXY;
+        info->lpszProxy       = NULL;
+        info->lpszProxyBypass = NULL;
+    }
 
     return TRUE;
 }
-- 
1.6.3.2


More information about the wine-patches mailing list