*/
#include "urlmon_main.h"
-//#include "winreg.h"
-
-#include <wine/debug.h>
-
-WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
typedef struct {
LPWSTR protocol;
{
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};
- static const WCHAR wow64W[] = {'W','O','W','6','4',0};
+ static const WCHAR win64W[] = {'W','i','n','6','4',';',' ','x','6','4',';',' ',0};
+ static const WCHAR wow64W[] = {'W','O','W','6','4',';',' ',0};
static const WCHAR emptyW[] = {0};
if(user_agent)
else if(IsWow64Process(GetCurrentProcess(), &is_wow) && is_wow)
os_type = wow64W;
else
- os_type = win32W;
+ os_type = emptyW;
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)
heap_free(user_agent);
user_agent = new_user_agent;
+ update_user_agent(user_agent);
LeaveCriticalSection(&session_cs);
break;