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