+static WCHAR *get_osbuildnumber( OSVERSIONINFOEXW *ver )
+{
+ static const WCHAR fmtW[] = {'%','u',0};
+ WCHAR *ret = heap_alloc( 11 * sizeof(WCHAR) );
+ if (ret) sprintfW( ret, fmtW, ver->dwBuildNumber );
+ return ret;
+}
+static WCHAR *get_oscaption( OSVERSIONINFOEXW *ver )
+{
+ static const WCHAR windowsW[] =
+ {'M','i','c','r','o','s','o','f','t',' ','W','i','n','d','o','w','s',' '};
+ static const WCHAR win2000W[] =
+ {'2','0','0','0',' ','P','r','o','f','e','s','s','i','o','n','a','l',0};
+ static const WCHAR win2003W[] =
+ {'S','e','r','v','e','r',' ','2','0','0','3',' ','S','t','a','n','d','a','r','d',' ','E','d','i','t','i','o','n',0};
+ static const WCHAR winxpW[] =
+ {'X','P',' ','P','r','o','f','e','s','s','i','o','n','a','l',0};
+ static const WCHAR winxp64W[] =
+ {'X','P',' ','P','r','o','f','e','s','s','i','o','n','a','l',' ','x','6','4',' ','E','d','i','t','i','o','n',0};
+ static const WCHAR vistaW[] =
+ {'V','i','s','t','a',' ','U','l','t','i','m','a','t','e',0};
+ static const WCHAR win2008W[] =
+ {'S','e','r','v','e','r',' ','2','0','0','8',' ','S','t','a','n','d','a','r','d',0};
+ static const WCHAR win7W[] =
+ {'7',' ','P','r','o','f','e','s','s','i','o','n','a','l',0};
+ static const WCHAR win2008r2W[] =
+ {'S','e','r','v','e','r',' ','2','0','0','8',' ','R','2',' ','S','t','a','n','d','a','r','d',0};
+ static const WCHAR win8W[] =
+ {'8',' ','P','r','o',0};
+ static const WCHAR win81W[] =
+ {'8','.','1',' ','P','r','o',0};
+ static const WCHAR win10W[] =
+ {'1','0',' ','P','r','o',0};
+ int len = sizeof(windowsW)/sizeof(windowsW[0]);
+ WCHAR *ret;
+
+ if (!(ret = heap_alloc( len * sizeof(WCHAR) + sizeof(win2003W) ))) return NULL;
+ memcpy( ret, windowsW, sizeof(windowsW) );
+ if (ver->dwMajorVersion == 10 && ver->dwMinorVersion == 0) memcpy( ret + len, win10W, sizeof(win10W) );
+ else if (ver->dwMajorVersion == 6 && ver->dwMinorVersion == 3) memcpy( ret + len, win8W, sizeof(win8W) );
+ else if (ver->dwMajorVersion == 6 && ver->dwMinorVersion == 2) memcpy( ret + len, win81W, sizeof(win81W) );
+ else if (ver->dwMajorVersion == 6 && ver->dwMinorVersion == 1)
+ {
+ if (ver->wProductType == VER_NT_WORKSTATION) memcpy( ret + len, win7W, sizeof(win7W) );
+ else memcpy( ret + len, win2008r2W, sizeof(win2008r2W) );
+ }
+ else if (ver->dwMajorVersion == 6 && ver->dwMinorVersion == 0)
+ {
+ if (ver->wProductType == VER_NT_WORKSTATION) memcpy( ret + len, vistaW, sizeof(vistaW) );
+ else memcpy( ret + len, win2008W, sizeof(win2008W) );
+ }
+ else if (ver->dwMajorVersion == 5 && ver->dwMinorVersion == 2)
+ {
+ if (ver->wProductType == VER_NT_WORKSTATION) memcpy( ret + len, winxp64W, sizeof(winxp64W) );
+ else memcpy( ret + len, win2003W, sizeof(win2003W) );
+ }
+ else if (ver->dwMajorVersion == 5 && ver->dwMinorVersion == 1) memcpy( ret + len, winxpW, sizeof(winxpW) );
+ else memcpy( ret + len, win2000W, sizeof(win2000W) );
+ return ret;
+}
+static WCHAR *get_osname( const WCHAR *caption )
+{
+ static const WCHAR partitionW[] =
+ {'|','C',':','\\','W','I','N','D','O','W','S','|','\\','D','e','v','i','c','e','\\',
+ 'H','a','r','d','d','i','s','k','0','\\','P','a','r','t','i','t','i','o','n','1',0};
+ int len = strlenW( caption );
+ WCHAR *ret;
+
+ if (!(ret = heap_alloc( len * sizeof(WCHAR) + sizeof(partitionW) ))) return NULL;
+ memcpy( ret, caption, len * sizeof(WCHAR) );
+ memcpy( ret + len, partitionW, sizeof(partitionW) );
+ return ret;
+}
+static WCHAR *get_osversion( OSVERSIONINFOEXW *ver )
+{
+ static const WCHAR fmtW[] = {'%','u','.','%','u','.','%','u',0};
+ WCHAR *ret = heap_alloc( 33 * sizeof(WCHAR) );
+ if (ret) sprintfW( ret, fmtW, ver->dwMajorVersion, ver->dwMinorVersion, ver->dwBuildNumber );
+ return ret;
+}