From a058584d4c1cec2a689433bf87b16f07e132750d Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Sun, 20 Apr 2003 02:46:44 +0000
Subject: [PATCH] Explicitly call VERSION_Init with the main exe file name, so
 that application settings work for Win16 and DOS apps too.

---
 misc/version.c      | 69 ++++++++++++++++++++-------------------------
 scheduler/process.c |  2 ++
 2 files changed, 32 insertions(+), 39 deletions(-)

diff --git a/misc/version.c b/misc/version.c
index 8bea96f8dba..daa428c32e5 100644
--- a/misc/version.c
+++ b/misc/version.c
@@ -332,14 +332,12 @@ static void VERSION_ParseVersion( HKEY hkey, BOOL *got_win_ver, BOOL *got_dos_ve
 /**********************************************************************
  *         VERSION_Init
  */
-static void VERSION_Init(void)
+void VERSION_Init( const char *appname )
 {
     OBJECT_ATTRIBUTES attr;
     UNICODE_STRING nameW;
     HKEY hkey, config_key;
     BOOL got_win_ver = FALSE, got_dos_ver = FALSE;
-    WCHAR buffer[MAX_PATH], appversion[MAX_PATH+20], *appname, *p;
-    static BOOL init_done;
     static const WCHAR configW[] = {'M','a','c','h','i','n','e','\\',
                                     'S','o','f','t','w','a','r','e','\\',
                                     'W','i','n','e','\\',
@@ -348,17 +346,6 @@ static void VERSION_Init(void)
     static const WCHAR appdefaultsW[] = {'A','p','p','D','e','f','a','u','l','t','s','\\',0};
     static const WCHAR versionW[] = {'\\','V','e','r','s','i','o','n',0};
 
-    if (init_done) return;
-    if (!GetModuleFileNameW( 0, buffer, MAX_PATH ))
-    {
-        WARN( "could not get module file name\n" );
-        return;
-    }
-    init_done = TRUE;
-    appname = buffer;
-    if ((p = strrchrW( appname, '/' ))) appname = p + 1;
-    if ((p = strrchrW( appname, '\\' ))) appname = p + 1;
-
     attr.Length = sizeof(attr);
     attr.RootDirectory = 0;
     attr.ObjectName = &nameW;
@@ -371,20 +358,32 @@ static void VERSION_Init(void)
     attr.RootDirectory = config_key;
 
     /* open AppDefaults\\appname\\Version key */
-
-    strcpyW( appversion, appdefaultsW );
-    strcatW( appversion, appname );
-    strcatW( appversion, versionW );
-    RtlInitUnicodeString( &nameW, appversion );
-
-    if (!NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr ))
+    if (appname && *appname)
     {
-        VERSION_ParseVersion( hkey, &got_win_ver, &got_dos_ver );
-        NtClose( hkey );
+        const char *p;
+        DWORD len;
+        WCHAR appversion[MAX_PATH+20];
+
+        if ((p = strrchr( appname, '/' ))) appname = p + 1;
+        if ((p = strrchr( appname, '\\' ))) appname = p + 1;
+
+        strcpyW( appversion, appdefaultsW );
+        len = strlenW(appversion);
+        RtlMultiByteToUnicodeN( appversion + len, sizeof(appversion) - len*sizeof(WCHAR),
+                                &len, appname, strlen(appname)+1 );
+        strcatW( appversion, versionW );
+        TRACE( "getting version from %s\n", debugstr_w(appversion) );
+        RtlInitUnicodeString( &nameW, appversion );
+
+        if (!NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr ))
+        {
+            VERSION_ParseVersion( hkey, &got_win_ver, &got_dos_ver );
+            NtClose( hkey );
+        }
+        if (got_win_ver && got_dos_ver) goto done;
     }
 
-    if (got_win_ver && got_dos_ver) goto done;
-
+    TRACE( "getting default version\n" );
     RtlInitUnicodeString( &nameW, versionW + 1 );
     if (!NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr ))
     {
@@ -569,24 +568,16 @@ static WINDOWS_VERSION VERSION_GetVersion(void)
 {
     static WORD winver = 0xffff;
 
+    if (versionForced) return forcedWinVersion;  /* user has overridden any sensible checks */
+
     if (winver == 0xffff) /* to be determined */
     {
-        WINDOWS_VERSION retver;
-
-        VERSION_Init();
-        if (versionForced) /* user has overridden any sensible checks */
-	    winver = forcedWinVersion;
-	else
-	{
-	    retver = VERSION_GetLinkedDllVersion();
-
-	    /* cache determined value, but do not store in case of WIN31 */
-	    if (retver != WIN31) winver = retver;
+        WINDOWS_VERSION retver = VERSION_GetLinkedDllVersion();
 
-	    return retver;
-	}
+        /* cache determined value, but do not store in case of WIN31 */
+        if (retver != WIN31) winver = retver;
+        return retver;
     }
-
     return winver;
 }
 
diff --git a/scheduler/process.c b/scheduler/process.c
index 49eaca566b2..634e614e1d7 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -132,6 +132,7 @@ extern void PTHREAD_init_done(void);
 
 extern void RELAY_InitDebugLists(void);
 extern BOOL MAIN_MainInit(void);
+extern void VERSION_Init( const char *appname );
 
 typedef WORD (WINAPI *pUserSignalProc)( UINT, DWORD, DWORD, HMODULE16 );
 
@@ -612,6 +613,7 @@ void PROCESS_InitWine( int argc, char *argv[], LPSTR win16_exe_name, HANDLE *win
         MESSAGE( "%s: cannot open builtin library for '%s': %s\n", argv0, main_exe_name, error );
         ExitProcess(1);
     }
+    VERSION_Init( main_exe_name );
 
     switch( MODULE_GetBinaryType( main_exe_file ))
     {
-- 
GitLab