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