Alexandre Julliard : ntdll: Handle version parsing in Unicode.

Alexandre Julliard julliard at winehq.org
Thu Nov 21 16:33:27 CST 2019


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Nov 21 17:31:43 2019 +0100

ntdll: Handle version parsing in Unicode.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/version.c | 91 ++++++++++++++++++++++------------------------------
 1 file changed, 39 insertions(+), 52 deletions(-)

diff --git a/dlls/ntdll/version.c b/dlls/ntdll/version.c
index bd03382899..61e48f6fbd 100644
--- a/dlls/ntdll/version.c
+++ b/dlls/ntdll/version.c
@@ -191,27 +191,34 @@ static const RTL_OSVERSIONINFOEXW VersionData[NB_WINDOWS_VERSIONS] =
 
 };
 
-static const char * const WinVersionNames[NB_WINDOWS_VERSIONS] =
-{ /* no spaces in here ! */
-    "win20",                      /* WIN20 */
-    "win30",                      /* WIN30 */
-    "win31",                      /* WIN31 */
-    "win95",                      /* WIN95 */
-    "win98",                      /* WIN98 */
-    "winme",                      /* WINME */
-    "nt351",                      /* NT351 */
-    "nt40",                       /* NT40 */
-    "win2000,win2k,nt2k,nt2000",  /* NT2K */
-    "winxp",                      /* WINXP */
-    "winxp64",                    /* WINXP64 */
-    "win2003,win2k3",             /* WIN2K3 */
-    "vista,winvista",             /* WINVISTA*/
-    "win2008,win2k8",             /* WIN2K8 */
-    "win2008r2,win2k8r2",         /* WIN2K8R2 */
-    "win7",                       /* WIN7 */
-    "win8",                       /* WIN8 */
-    "win81",                      /* WIN81 */
-    "win10",                      /* WIN10 */
+static const struct { WCHAR name[12]; WINDOWS_VERSION ver; } version_names[] =
+{
+    { {'w','i','n','2','0',0}, WIN20 },
+    { {'w','i','n','3','0',0}, WIN30 },
+    { {'w','i','n','3','1',0}, WIN31 },
+    { {'w','i','n','9','5',0}, WIN95 },
+    { {'w','i','n','9','8',0}, WIN98 },
+    { {'w','i','n','m','e',0}, WINME },
+    { {'n','t','3','5','1',0}, NT351 },
+    { {'n','t','4','0',0}, NT40 },
+    { {'w','i','n','2','0','0','0',0}, NT2K },
+    { {'w','i','n','2','k',0}, NT2K },
+    { {'n','t','2','k',0}, NT2K },
+    { {'n','t','2','0','0','0',0}, NT2K },
+    { {'w','i','n','x','p',0}, WINXP },
+    { {'w','i','n','x','p','6','4',0}, WINXP64 },
+    { {'w','i','n','2','0','0','3',0}, WIN2K3 },
+    { {'w','i','n','2','k','3',0}, WIN2K3 },
+    { {'v','i','s','t','a',0}, WINVISTA },
+    { {'w','i','n','v','i','s','t','a',0}, WINVISTA },
+    { {'w','i','n','2','0','0','8',0}, WIN2K8 },
+    { {'w','i','n','2','k','8',0}, WIN2K8 },
+    { {'w','i','n','2','0','0','8','r','2',0}, WIN2K8R2 },
+    { {'w','i','n','2','k','8','r','2',0}, WIN2K8R2 },
+    { {'w','i','n','7',0}, WIN7 },
+    { {'w','i','n','8',0}, WIN8 },
+    { {'w','i','n','8','1',0}, WIN81 },
+    { {'w','i','n','1','0',0}, WIN10 },
 };
 
 
@@ -438,46 +445,26 @@ static BOOL parse_win_version( HANDLE hkey )
     static const WCHAR VersionW[] = {'V','e','r','s','i','o','n',0};
 
     UNICODE_STRING valueW;
-    char tmp[64], buffer[50];
+    WCHAR *name, tmp[64];
     KEY_VALUE_PARTIAL_INFORMATION *info = (KEY_VALUE_PARTIAL_INFORMATION *)tmp;
-    DWORD count, len;
-    int i;
+    DWORD i, count;
 
     RtlInitUnicodeString( &valueW, VersionW );
-    if (NtQueryValueKey( hkey, &valueW, KeyValuePartialInformation, tmp, sizeof(tmp), &count ))
+    if (NtQueryValueKey( hkey, &valueW, KeyValuePartialInformation, tmp, sizeof(tmp) - sizeof(WCHAR), &count ))
         return FALSE;
 
-    RtlUnicodeToMultiByteN( buffer, sizeof(buffer)-1, &len, (WCHAR *)info->Data, info->DataLength );
-    buffer[len] = 0;
+    name = (WCHAR *)info->Data;
+    name[info->DataLength / sizeof(WCHAR)] = 0;
 
-    for (i = 0; i < NB_WINDOWS_VERSIONS; i++)
+    for (i = 0; i < ARRAY_SIZE(version_names); i++)
     {
-        const char *p, *pCurr = WinVersionNames[i];
-        /* iterate through all winver aliases separated by comma */
-        do {
-            p = strchr(pCurr, ',');
-            len = p ? p - pCurr : strlen(pCurr);
-            if ( (!strncmp( pCurr, buffer, len )) && (buffer[len] == 0) )
-            {
-                current_version = &VersionData[i];
-                TRACE( "got win version %s\n", WinVersionNames[i] );
-                return TRUE;
-            }
-            pCurr = p+1;
-        } while (p);
+        if (strcmpW( version_names[i].name, name )) continue;
+        current_version = &VersionData[version_names[i].ver];
+        TRACE( "got win version %s\n", debugstr_w(version_names[i].name) );
+        return TRUE;
     }
 
-    MESSAGE("Invalid Windows version value '%s' specified in config file.\n", buffer );
-    MESSAGE("Valid versions are:" );
-    for (i = 0; i < NB_WINDOWS_VERSIONS; i++)
-    {
-        /* only list the first, "official" alias in case of aliases */
-        const char *pCurr = WinVersionNames[i];
-        const char *p = strchr(pCurr, ',');
-        len = (p) ? p - pCurr : strlen(pCurr);
-
-        MESSAGE(" '%.*s'%c", (int)len, pCurr, (i == NB_WINDOWS_VERSIONS - 1) ? '\n' : ',' );
-    }
+    ERR( "Invalid Windows version value %s specified in config file.\n", debugstr_w(name) );
     return FALSE;
 }
 




More information about the wine-cvs mailing list