Implemented InternetSetOptionExA/W.

diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index cc5bdab..744b98e 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -1530,10 +1530,79 @@
 BOOL WINAPI InternetSetOptionA(HINTERNET hInternet, DWORD dwOption,
                            LPVOID lpBuffer, DWORD dwBufferLength)
 {
-    /* FIXME!!! implement if lpBuffer is a string, dwBufferLength is
-       in TCHARs */
-    return InternetSetOptionW(hInternet,dwOption, lpBuffer,
-                              dwBufferLength);
+    LPVOID wbuffer;
+    DWORD wlen;
+    BOOL r;
+
+    switch( dwOption )
+    {
+    case INTERNET_OPTION_PROXY:
+        {
+        LPINTERNET_PROXY_INFOA pi = (LPINTERNET_PROXY_INFOA) lpBuffer;
+        LPINTERNET_PROXY_INFOW piw;
+        DWORD proxlen, prbylen;
+        LPWSTR prox, prby;
+
+        proxlen = MultiByteToWideChar( CP_ACP, 0, pi->lpszProxy, -1, NULL, 0);
+        prbylen= MultiByteToWideChar( CP_ACP, 0, pi->lpszProxyBypass, -1, NULL, 0);
+        wlen = sizeof *piw + proxlen + prbylen;
+        wbuffer = HeapAlloc( GetProcessHeap(), 0, wlen );
+        piw = (LPINTERNET_PROXY_INFOW) wbuffer;
+        piw->dwAccessType = pi->dwAccessType;
+        prox = (LPWSTR) &piw[1];
+        prby = &prox[proxlen+1];
+        MultiByteToWideChar( CP_ACP, 0, pi->lpszProxy, -1, prox, proxlen);
+        MultiByteToWideChar( CP_ACP, 0, pi->lpszProxyBypass, -1, prby, prbylen);
+        piw->lpszProxy = prox;
+        piw->lpszProxyBypass = prby;
+        }
+        break;
+    case INTERNET_OPTION_USER_AGENT:
+    case INTERNET_OPTION_USERNAME:
+    case INTERNET_OPTION_PASSWORD:
+        wlen = MultiByteToWideChar( CP_ACP, 0, lpBuffer, dwBufferLength,
+                                   NULL, 0 );
+        wbuffer = HeapAlloc( GetProcessHeap(), 0, wlen );
+        MultiByteToWideChar( CP_ACP, 0, lpBuffer, dwBufferLength,
+                                   wbuffer, wlen );
+        break;
+    default:
+        wbuffer = lpBuffer;
+        wlen = dwBufferLength;
+    }
+
+    r = InternetSetOptionW(hInternet,dwOption, wbuffer, wlen);
+
+    if( lpBuffer != wbuffer )
+        HeapFree( GetProcessHeap(), 0, wbuffer );
+
+    return r;
+}
+
+
+/***********************************************************************
+ *           InternetSetOptionExA (WININET.@)
+ */
+BOOL WINAPI InternetSetOptionExA(HINTERNET hInternet, DWORD dwOption,
+                           LPVOID lpBuffer, DWORD dwBufferLength, DWORD dwFlags)
+{
+    FIXME("Flags %08lx ignored\n", dwFlags);
+    return InternetSetOptionA( hInternet, dwOption, lpBuffer, dwBufferLength );
+}
+
+/***********************************************************************
+ *           InternetSetOptionExW (WININET.@)
+ */
+BOOL WINAPI InternetSetOptionExW(HINTERNET hInternet, DWORD dwOption,
+                           LPVOID lpBuffer, DWORD dwBufferLength, DWORD dwFlags)
+{
+    FIXME("Flags %08lx ignored\n", dwFlags);
+    if( dwFlags & ~ISO_VALID_FLAGS )
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return FALSE;
+    }
+    return InternetSetOptionW( hInternet, dwOption, lpBuffer, dwBufferLength );
 }
 
 
diff --git a/dlls/wininet/wininet.spec b/dlls/wininet/wininet.spec
index 7cdfa42..b965cc5 100644
--- a/dlls/wininet/wininet.spec
+++ b/dlls/wininet/wininet.spec
@@ -11,7 +11,7 @@
 @ stub DeleteUrlCacheContainerA
 @ stub DeleteUrlCacheContainerW
 @ stdcall DeleteUrlCacheEntry(str)
-@ stdcall DeleteUrlCacheGroup(double long ptr) DeleteUrlCacheGroup
+@ stdcall DeleteUrlCacheGroup(double long ptr)
 @ stdcall DetectAutoProxyUrl(str long long)
 @ stdcall DllInstall(long ptr) WININET_DllInstall
 @ stub FindCloseUrlCache
@@ -131,8 +131,8 @@
 @ stub InternetSetFilePointer
 @ stdcall InternetSetOptionA(ptr long ptr long)
 @ stdcall InternetSetOptionW(ptr long ptr long)
-@ stub InternetSetOptionExA
-@ stub InternetSetOptionExW
+@ stdcall InternetSetOptionExA(ptr long ptr long long)
+@ stdcall InternetSetOptionExW(ptr long ptr long long)
 @ stdcall InternetSetStatusCallback(ptr ptr) InternetSetStatusCallbackA
 @ stdcall InternetSetStatusCallbackA(ptr ptr)
 @ stub InternetSetStatusCallbackW