Sync with trunk r63174.
[reactos.git] / dll / win32 / urlmon / session.c
index 7d8b40b..7c5a3bb 100644 (file)
  */
 
 #include "urlmon_main.h"
-//#include "winreg.h"
-
-#include <wine/debug.h>
-
-WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
 
 typedef struct {
     LPWSTR protocol;
@@ -534,15 +529,26 @@ static void ensure_useragent(void)
 {
     OSVERSIONINFOW info = {sizeof(info)};
     const WCHAR *os_type, *is_nt;
-    WCHAR buf[512];
+    WCHAR buf[512], *ret, *tmp;
+    DWORD res, idx=0;
+    size_t len, size;
     BOOL is_wow;
+    HKEY key;
 
     static const WCHAR formatW[] =
         {'M','o','z','i','l','l','a','/','4','.','0',
          ' ','(','c','o','m','p','a','t','i','b','l','e',';',
          ' ','M','S','I','E',' ','8','.','0',';',
          ' ','W','i','n','d','o','w','s',' ','%','s','%','d','.','%','d',';',
-         ' ','%','s',';',' ','T','r','i','d','e','n','t','/','5','.','0',')',0};
+         ' ','%','s',';',' ','T','r','i','d','e','n','t','/','5','.','0',0};
+    static const WCHAR post_platform_keyW[] =
+        {'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',
+         '\\','5','.','0','\\','U','s','e','r',' ','A','g','e','n','t',
+         '\\','P','o','s','t',' ','P','l','a','t','f','o','r','m',0};
     static const WCHAR ntW[] = {'N','T',' ',0};
     static const WCHAR win32W[] = {'W','i','n','3','2',0};
     static const WCHAR win64W[] = {'W','i','n','6','4',0};
@@ -563,7 +569,48 @@ static void ensure_useragent(void)
         os_type = win32W;
 
     sprintfW(buf, formatW, is_nt, info.dwMajorVersion, info.dwMinorVersion, os_type);
-    user_agent = heap_strdupW(buf);
+    len = strlenW(buf);
+
+    size = len+40;
+    ret = heap_alloc(size * sizeof(WCHAR));
+    if(!ret)
+        return;
+
+    memcpy(ret, buf, len*sizeof(WCHAR));
+
+    res = RegOpenKeyW(HKEY_LOCAL_MACHINE, post_platform_keyW, &key);
+    if(res == ERROR_SUCCESS) {
+        DWORD value_len;
+
+        while(1) {
+            value_len = sizeof(buf)/sizeof(WCHAR);
+            res = RegEnumValueW(key, idx, buf, &value_len, NULL, NULL, NULL, NULL);
+            if(res != ERROR_SUCCESS)
+                break;
+            idx++;
+
+            if(len + value_len + 2 /* strlen("; ") */ + 1 /* trailing ')' */ >= size) {
+                tmp = heap_realloc(ret, (size*2+value_len)*sizeof(WCHAR));
+                if(!tmp)
+                    break;
+                ret = tmp;
+                size = size*2+value_len;
+            }
+
+            ret[len++] = ';';
+            ret[len++] = ' ';
+            memcpy(ret+len, buf, value_len*sizeof(WCHAR));
+            len += value_len;
+        }
+
+        RegCloseKey(key);
+    }
+
+    ret[len++] = ')';
+    ret[len++] = 0;
+
+    user_agent = ret;
+    TRACE("Using user agent %s\n", debugstr_w(user_agent));
 }
 
 LPWSTR get_useragent(void)