Jacek Caban : urlmon: Support version option in ObtainUserAgentString.

Alexandre Julliard julliard at winehq.org
Thu Mar 25 16:49:23 CDT 2021


Module: wine
Branch: master
Commit: 3d95eef66f75a5c933666d8face08b7073733a17
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=3d95eef66f75a5c933666d8face08b7073733a17

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Mar 25 19:34:22 2021 +0100

urlmon: Support version option in ObtainUserAgentString.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/urlmon/session.c | 96 ++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 65 insertions(+), 31 deletions(-)

diff --git a/dlls/urlmon/session.c b/dlls/urlmon/session.c
index b74d56166d9..0a1be0ba367 100644
--- a/dlls/urlmon/session.c
+++ b/dlls/urlmon/session.c
@@ -505,61 +505,95 @@ static BOOL get_url_encoding(HKEY root, DWORD *encoding)
 
 static LPWSTR user_agent;
 
-static size_t obtain_user_agent(WCHAR *ret, size_t size)
+static size_t obtain_user_agent(unsigned int version, WCHAR *ret, size_t size)
 {
     OSVERSIONINFOW info = {sizeof(info)};
     const WCHAR *os_type, *is_nt;
-    DWORD res, idx=0;
+    BOOL is_wow, quirks = FALSE;
+    DWORD res;
     size_t len = 0;
-    BOOL is_wow;
     HKEY key;
 
-    EnterCriticalSection(&session_cs);
-    if(user_agent) {
-        len = wcslen(user_agent) + 1;
-        memcpy(ret, user_agent, min(size, len) * sizeof(WCHAR));
+    if(version & 0x1000) {
+        version &= ~0x1000;
+        if(version == 7)
+            quirks = TRUE;
+        else
+            version = 7;
+    }else if(version < 7) {
+        version = 7;
+    }
+    if(version > 11) {
+        FIXME("Unsupported version %u\n", version);
+        version = 11;
+    }
+
+    if(version < 7 || (version == 7 && !quirks)) {
+        EnterCriticalSection(&session_cs);
+        if(user_agent) {
+            len = wcslen(user_agent) + 1;
+            memcpy(ret, user_agent, min(size, len) * sizeof(WCHAR));
+        }
+        LeaveCriticalSection(&session_cs);
+        if(len) return len;
+    }
+
+    swprintf(ret, size, L"Mozilla/%s (", version < 9 ? L"4.0" : L"5.0");
+    len = lstrlenW(ret);
+    if(version < 11) {
+        swprintf(ret + len, size - len, L"compatible; MSIE %u.0; ", version);
+        len += wcslen(ret + len);
     }
-    LeaveCriticalSection(&session_cs);
-    if(len) return len;
 
     GetVersionExW(&info);
     is_nt = info.dwPlatformId == VER_PLATFORM_WIN32_NT ? L"NT " : L"";
 
     if(sizeof(void*) == 8)
+#ifdef __x86_64__
         os_type = L"Win64; x64; ";
+#else
+        os_type = L"Win64; ";
+#endif
     else if(IsWow64Process(GetCurrentProcess(), &is_wow) && is_wow)
         os_type = L"WOW64; ";
     else
         os_type = L"";
 
-    swprintf(ret, size, L"Mozilla/4.0 (compatible; MSIE 7.0; Windows %s%d.%d; %sTrident/7.0",
-             is_nt, info.dwMajorVersion, info.dwMinorVersion, os_type);
+    swprintf(ret + len, size - len, L"Windows %s%d.%d; %s", is_nt, info.dwMajorVersion,
+             info.dwMinorVersion, os_type);
     len = lstrlenW(ret);
 
-    res = RegOpenKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
-                      "Internet Settings\\5.0\\User Agent\\Post Platform", &key);
-    if(res == ERROR_SUCCESS) {
-        DWORD value_len;
+    if(!quirks) {
+        wcscpy(ret + len, L"Trident/7.0");
+        len += ARRAY_SIZE(L"Trident/7.0") - 1;
+    }
 
-        while(1) {
-            if(idx) {
-                ret[len++] = ';';
-                ret[len++] = ' ';
+    if(version < 9) {
+        res = RegOpenKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\"
+                          "Internet Settings\\5.0\\User Agent\\Post Platform", &key);
+        if(res == ERROR_SUCCESS) {
+            DWORD value_len, idx;
+
+            for(idx = 0;; idx++) {
+                if(idx) {
+                    ret[len++] = ';';
+                    ret[len++] = ' ';
+                }
+                value_len = size - len - 2;
+                res = RegEnumValueW(key, idx, ret + len, &value_len, NULL, NULL, NULL, NULL);
+                if(res != ERROR_SUCCESS)
+                    break;
+
+                len += value_len;
             }
-            value_len = size - len - 2;
-            res = RegEnumValueW(key, idx, ret + len, &value_len, NULL, NULL, NULL, NULL);
-            if(res != ERROR_SUCCESS)
-                break;
-            idx++;
 
-            len += value_len;
+            RegCloseKey(key);
+            if(idx) len -= 2;
         }
-
-        RegCloseKey(key);
     }
+    wcscpy(ret + len, version >= 11 ? L"; rv:11.0) like Gecko" : L")");
+    len += wcslen(ret + len) + 1;
 
-    ret[len++] = ')';
-    ret[len++] = 0;
     TRACE("Using user agent %s\n", debugstr_w(ret));
     return len;
 }
@@ -570,7 +604,7 @@ static void ensure_user_agent(void)
 
     if(!user_agent) {
         WCHAR buf[1024];
-        obtain_user_agent(buf, ARRAY_SIZE(buf));
+        obtain_user_agent(0, buf, ARRAY_SIZE(buf));
         user_agent = heap_strdupW(buf);
     }
 
@@ -704,7 +738,7 @@ HRESULT WINAPI ObtainUserAgentString(DWORD option, char *ret, DWORD *ret_size)
     if(!ret || !ret_size)
         return E_INVALIDARG;
 
-    len = obtain_user_agent(buf, ARRAY_SIZE(buf));
+    len = obtain_user_agent(option, buf, ARRAY_SIZE(buf));
     size = WideCharToMultiByte(CP_ACP, 0, buf, len, NULL, 0, NULL, NULL);
     if(size <= *ret_size)
         WideCharToMultiByte(CP_ACP, 0, buf, len, ret, *ret_size+1, NULL, NULL);




More information about the wine-cvs mailing list